EmpUpdateRuleState

void __fastcall EmpUpdateRuleState(__int64 a1, __int64 a2){
  unsigned int v2; 
  __int64 v3; 
  int v4; 
  char v7; 
  _QWORD *i; 
  _QWORD *j; 
  int *v10; 
  _QWORD *k; 
  _QWORD *v12; 
  v2 = *(_DWORD *)(a1 + 48);
  v3 = 0i64;
  v4 = *(_DWORD *)(a1 + 16);
  v7 = 1;
  if( v2 )
  {
    while( *(int *)(*(_QWORD *)(*(_QWORD *)(a1 + 56) + 8 * v3) + 16i64) > 0 )
    {
      v3 = (unsigned int)(v3 + 1);
      if( (unsigned int)v3 >= v2 )
        goto LABEL_2;
    }
LABEL_5:
    v7 = 0;
  }
  else
  {
LABEL_2:
    for( i = *(_QWORD **)(a1 + 64); i; i = (_QWORD *)*i )
    {
      if( !*(_QWORD *)(*(i - 1) + 16i64) )
        goto LABEL_5;
    }
    for( j = *(_QWORD **)(a1 + 72); j; j = (_QWORD *)*j )
    {
      if( !*(_BYTE *)(*(j - 1) + 20i64) )
        goto LABEL_5;
    }
  }
  if( *(_BYTE *)(a1 + 20) != v7 )
  {
    v12 = *(_QWORD **)(a1 + 32);
    *(_BYTE *)(a1 + 20) = v7;
    while( v12 )
    {
      EmpUpdateRuleState(*(v12 - 1), 0i64);
      v12 = (_QWORD *)*v12;
    }
  }
  *(_BYTE *)(a1 + 20) = v7;
  if( v7 )
  {
    if( v4 == 1 )
      *(_DWORD *)(a1 + 16) = 0;
    v10 = (int *)EmpSearchTargetRuleList(a1);
    if( v10 && *v10 > 0 )
      EmpEvaluateUpdateRuleEvalState((INT64)v10, a2);
  }
  else
  {
    *(_DWORD *)(a1 + 16) = 1;
  }
  if( *(_DWORD *)(a1 + 16) != v4 )
  {
    for( k = *(_QWORD **)(a1 + 80); k != (_QWORD *)(a1 + 80); k = (_QWORD *)*k )
      ((void(__fastcall *)(_QWORD, __int64, _QWORD))*(k - 2))(*(unsigned int *)(a1 + 16), a1, *(k - 1));
  }
}

Referenced by:

EmClientQueryRuleState
EmpRuleUpdateWorkerThread
EmpUpdateRuleState