
/* __cxxabiv1::__vmi_class_type_info::__do_find_public_src(long, void const*,
   __cxxabiv1::__class_type_info const*, void const*) const */

uint __thiscall
__cxxabiv1::__vmi_class_type_info::__do_find_public_src
          (__vmi_class_type_info *this,long param_1,void *param_2,__class_type_info *param_3,
          void *param_4)

{
  ulong uVar1;
  char *__s1;
  uint uVar2;
  int iVar3;
  long lVar4;
  __vmi_class_type_info *p_Var5;
  ulong uVar6;
  
  if (param_2 == param_4) {
    __s1 = *(char **)(this + 8);
    if (__s1 == *(char **)(param_3 + 8)) {
      return 6;
    }
    if ((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_3 + 8)), iVar3 == 0)) {
      return 6;
    }
  }
  uVar6 = (ulong)*(uint *)(this + 0x14);
  p_Var5 = this + uVar6 * 0x10;
  do {
    if (uVar6 == 0) {
      return 1;
    }
    uVar1 = *(ulong *)(p_Var5 + 0x10);
    if ((uVar1 & 2) != 0) {
      lVar4 = (long)uVar1 >> 8;
      if ((uVar1 & 1) != 0) {
        if (param_1 == -3) goto LAB_0031ada3;
                    /* WARNING: Load size is inaccurate */
        lVar4 = *(long *)(*param_2 + lVar4);
      }
      uVar2 = (**(code **)(**(long **)(p_Var5 + 8) + 0x40))
                        (*(long **)(p_Var5 + 8),param_1,lVar4 + (long)param_2,param_3,param_4);
      if (3 < (int)uVar2) {
        return uVar2 | (uint)uVar1 & 1;
      }
    }
LAB_0031ada3:
    uVar6 = uVar6 - 1;
    p_Var5 = p_Var5 + -0x10;
  } while( true );
}



uint FUN_0031ad20(long param_1,long param_2,long *param_3,long param_4,long *param_5)

{
  ulong uVar1;
  char *__s1;
  uint uVar2;
  int iVar3;
  long lVar4;
  ulong uVar5;
  
  if (param_3 == param_5) {
    __s1 = *(char **)(param_1 + 8);
    if (__s1 == *(char **)(param_4 + 8)) {
      return 6;
    }
    if ((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0)) {
      return 6;
    }
  }
  uVar5 = (ulong)*(uint *)(param_1 + 0x14);
  param_1 = param_1 + uVar5 * 0x10;
  do {
    if (uVar5 == 0) {
      return 1;
    }
    uVar1 = *(ulong *)(param_1 + 0x10);
    if ((uVar1 & 2) != 0) {
      lVar4 = (long)uVar1 >> 8;
      if ((uVar1 & 1) != 0) {
        if (param_2 == -3) goto LAB_0031ada3;
        lVar4 = *(long *)(*param_3 + lVar4);
      }
      uVar2 = (**(code **)(**(long **)(param_1 + 8) + 0x40))
                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5);
      if (3 < (int)uVar2) {
        return uVar2 | (uint)uVar1 & 1;
      }
    }
LAB_0031ada3:
    uVar5 = uVar5 - 1;
    param_1 = param_1 + -0x10;
  } while( true );
}


PUSH R15
PUSH R14
MOV R14,RCX
PUSH R13
MOV R13,R8
PUSH R12
MOV R12,RSI
PUSH RBP
MOV RBP,RDI
PUSH RBX
MOV RBX,RDX
SUB RSP,0x18
CMP RDX,R8
JZ 0x0031ade0
MOV R15D,dword ptr [RBP + 0x14]
MOV RAX,R15
SHL RAX,0x4
ADD RBP,RAX
JMP 0x0031adab
MOV RAX,qword ptr [RBP + 0x10]
TEST AL,0x2
JZ 0x0031ada3
MOV RDX,RAX
SAR RDX,0x8
AND EAX,0x1
MOV qword ptr [RSP + 0x8],RAX
JZ 0x0031ad86
CMP R12,-0x3
JZ 0x0031ada3
MOV RAX,qword ptr [RBX]
MOV RDX,qword ptr [RAX + RDX*0x1]
MOV RDI,qword ptr [RBP + 0x8]
ADD RDX,RBX
MOV R8,R13
MOV RCX,R14
MOV RSI,R12
MOV RAX,qword ptr [RDI]
CALL qword ptr [RAX + 0x40]
MOV EDX,EAX
CMP EAX,0x3
JG 0x0031add0
SUB R15,0x1
SUB RBP,0x10
TEST R15,R15
JNZ 0x0031ad60
MOV EDX,0x1
ADD RSP,0x18
MOV EAX,EDX
POP RBX
POP RBP
POP R12
POP R13
POP R14
POP R15
RET
OR EDX,dword ptr [RSP + 0x8]
JMP 0x0031adb5
MOV RDI,qword ptr [RDI + 0x8]
MOV RSI,qword ptr [RCX + 0x8]
MOV EDX,0x6
CMP RDI,RSI
JZ 0x0031adb5
CMP byte ptr [RDI],0x2a
MOV dword ptr [RSP + 0x8],EDX
JZ 0x0031ad46
CALL 0x001477a0
MOV EDX,dword ptr [RSP + 0x8]
TEST EAX,EAX
JZ 0x0031adb5
JMP 0x0031ad46
(translation_unit "uint FUN_0031ad20(long param_1,long param_2,long *param_3,long param_4,long *param_5)\n\n{\n  ulong uVar1;\n  char *__s1;\n  uint uVar2;\n  int iVar3;\n  long lVar4;\n  ulong uVar5;\n  \n  if (param_3 == param_5) {\n    __s1 = *(char **)(param_1 + 8);\n    if (__s1 == *(char **)(param_4 + 8)) {\n      return 6;\n    }\n    if ((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0)) {\n      return 6;\n    }\n  }\n  uVar5 = (ulong)*(uint *)(param_1 + 0x14);\n  param_1 = param_1 + uVar5 * 0x10;\n  do {\n    if (uVar5 == 0) {\n      return 1;\n    }\n    uVar1 = *(ulong *)(param_1 + 0x10);\n    if ((uVar1 & 2) != 0) {\n      lVar4 = (long)uVar1 >> 8;\n      if ((uVar1 & 1) != 0) {\n        if (param_2 == -3) goto LAB_0031ada3;\n        lVar4 = *(long *)(*param_3 + lVar4);\n      }\n      uVar2 = (**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5);\n      if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }\n    }\nLAB_0031ada3:\n    uVar5 = uVar5 - 1;\n    param_1 = param_1 + -0x10;\n  } while( true );\n}\n\n" (function_definition "uint FUN_0031ad20(long param_1,long param_2,long *param_3,long param_4,long *param_5)\n\n{\n  ulong uVar1;\n  char *__s1;\n  uint uVar2;\n  int iVar3;\n  long lVar4;\n  ulong uVar5;\n  \n  if (param_3 == param_5) {\n    __s1 = *(char **)(param_1 + 8);\n    if (__s1 == *(char **)(param_4 + 8)) {\n      return 6;\n    }\n    if ((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0)) {\n      return 6;\n    }\n  }\n  uVar5 = (ulong)*(uint *)(param_1 + 0x14);\n  param_1 = param_1 + uVar5 * 0x10;\n  do {\n    if (uVar5 == 0) {\n      return 1;\n    }\n    uVar1 = *(ulong *)(param_1 + 0x10);\n    if ((uVar1 & 2) != 0) {\n      lVar4 = (long)uVar1 >> 8;\n      if ((uVar1 & 1) != 0) {\n        if (param_2 == -3) goto LAB_0031ada3;\n        lVar4 = *(long *)(*param_3 + lVar4);\n      }\n      uVar2 = (**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5);\n      if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }\n    }\nLAB_0031ada3:\n    uVar5 = uVar5 - 1;\n    param_1 = param_1 + -0x10;\n  } while( true );\n}" type_identifier (function_declarator "FUN_0031ad20(long param_1,long param_2,long *param_3,long param_4,long *param_5)" identifier (parameter_list "(long param_1,long param_2,long *param_3,long param_4,long *param_5)" ( (parameter_declaration "long param_1" (sized_type_specifier "long" long) identifier) , (parameter_declaration "long param_2" (sized_type_specifier "long" long) identifier) , (parameter_declaration "long *param_3" (sized_type_specifier "long" long) (pointer_declarator "*param_3" * identifier)) , (parameter_declaration "long param_4" (sized_type_specifier "long" long) identifier) , (parameter_declaration "long *param_5" (sized_type_specifier "long" long) (pointer_declarator "*param_5" * identifier)) ))) (compound_statement "{\n  ulong uVar1;\n  char *__s1;\n  uint uVar2;\n  int iVar3;\n  long lVar4;\n  ulong uVar5;\n  \n  if (param_3 == param_5) {\n    __s1 = *(char **)(param_1 + 8);\n    if (__s1 == *(char **)(param_4 + 8)) {\n      return 6;\n    }\n    if ((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0)) {\n      return 6;\n    }\n  }\n  uVar5 = (ulong)*(uint *)(param_1 + 0x14);\n  param_1 = param_1 + uVar5 * 0x10;\n  do {\n    if (uVar5 == 0) {\n      return 1;\n    }\n    uVar1 = *(ulong *)(param_1 + 0x10);\n    if ((uVar1 & 2) != 0) {\n      lVar4 = (long)uVar1 >> 8;\n      if ((uVar1 & 1) != 0) {\n        if (param_2 == -3) goto LAB_0031ada3;\n        lVar4 = *(long *)(*param_3 + lVar4);\n      }\n      uVar2 = (**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5);\n      if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }\n    }\nLAB_0031ada3:\n    uVar5 = uVar5 - 1;\n    param_1 = param_1 + -0x10;\n  } while( true );\n}" { (declaration "ulong uVar1;" type_identifier identifier ;) (declaration "char *__s1;" primitive_type (pointer_declarator "*__s1" * identifier) ;) (declaration "uint uVar2;" type_identifier identifier ;) (declaration "int iVar3;" primitive_type identifier ;) (declaration "long lVar4;" (sized_type_specifier "long" long) identifier ;) (declaration "ulong uVar5;" type_identifier identifier ;) (if_statement "if (param_3 == param_5) {\n    __s1 = *(char **)(param_1 + 8);\n    if (__s1 == *(char **)(param_4 + 8)) {\n      return 6;\n    }\n    if ((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0)) {\n      return 6;\n    }\n  }" if (parenthesized_expression "(param_3 == param_5)" ( (binary_expression "param_3 == param_5" identifier == identifier) )) (compound_statement "{\n    __s1 = *(char **)(param_1 + 8);\n    if (__s1 == *(char **)(param_4 + 8)) {\n      return 6;\n    }\n    if ((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0)) {\n      return 6;\n    }\n  }" { (expression_statement "__s1 = *(char **)(param_1 + 8);" (assignment_expression "__s1 = *(char **)(param_1 + 8)" identifier = (pointer_expression "*(char **)(param_1 + 8)" * (cast_expression "(char **)(param_1 + 8)" ( (type_descriptor "char **" primitive_type (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_1 + 8)" ( (binary_expression "param_1 + 8" identifier + number_literal) ))))) ;) (if_statement "if (__s1 == *(char **)(param_4 + 8)) {\n      return 6;\n    }" if (parenthesized_expression "(__s1 == *(char **)(param_4 + 8))" ( (binary_expression "__s1 == *(char **)(param_4 + 8)" identifier == (pointer_expression "*(char **)(param_4 + 8)" * (cast_expression "(char **)(param_4 + 8)" ( (type_descriptor "char **" primitive_type (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_4 + 8)" ( (binary_expression "param_4 + 8" identifier + number_literal) ))))) )) (compound_statement "{\n      return 6;\n    }" { (return_statement "return 6;" return number_literal ;) })) (if_statement "if ((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0)) {\n      return 6;\n    }" if (parenthesized_expression "((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0))" ( (binary_expression "(*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0)" (parenthesized_expression "(*__s1 != '*')" ( (binary_expression "*__s1 != '*'" (pointer_expression "*__s1" * identifier) != (char_literal "'*'" ' character ')) )) && (parenthesized_expression "(iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0)" ( (comma_expression "iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0" (assignment_expression "iVar3 = strcmp(__s1,*(char **)(param_4 + 8))" identifier = (call_expression "strcmp(__s1,*(char **)(param_4 + 8))" identifier (argument_list "(__s1,*(char **)(param_4 + 8))" ( identifier , (pointer_expression "*(char **)(param_4 + 8)" * (cast_expression "(char **)(param_4 + 8)" ( (type_descriptor "char **" primitive_type (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_4 + 8)" ( (binary_expression "param_4 + 8" identifier + number_literal) )))) )))) , (binary_expression "iVar3 == 0" identifier == number_literal)) ))) )) (compound_statement "{\n      return 6;\n    }" { (return_statement "return 6;" return number_literal ;) })) })) (expression_statement "uVar5 = (ulong)*(uint *)(param_1 + 0x14);" (assignment_expression "uVar5 = (ulong)*(uint *)(param_1 + 0x14)" identifier = (binary_expression "(ulong)*(uint *)(param_1 + 0x14)" (parenthesized_expression "(ulong)" ( identifier )) * (cast_expression "(uint *)(param_1 + 0x14)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x14)" ( (binary_expression "param_1 + 0x14" identifier + number_literal) ))))) ;) (expression_statement "param_1 = param_1 + uVar5 * 0x10;" (assignment_expression "param_1 = param_1 + uVar5 * 0x10" identifier = (binary_expression "param_1 + uVar5 * 0x10" identifier + (binary_expression "uVar5 * 0x10" identifier * number_literal))) ;) (do_statement "do {\n    if (uVar5 == 0) {\n      return 1;\n    }\n    uVar1 = *(ulong *)(param_1 + 0x10);\n    if ((uVar1 & 2) != 0) {\n      lVar4 = (long)uVar1 >> 8;\n      if ((uVar1 & 1) != 0) {\n        if (param_2 == -3) goto LAB_0031ada3;\n        lVar4 = *(long *)(*param_3 + lVar4);\n      }\n      uVar2 = (**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5);\n      if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }\n    }\nLAB_0031ada3:\n    uVar5 = uVar5 - 1;\n    param_1 = param_1 + -0x10;\n  } while( true );" do (compound_statement "{\n    if (uVar5 == 0) {\n      return 1;\n    }\n    uVar1 = *(ulong *)(param_1 + 0x10);\n    if ((uVar1 & 2) != 0) {\n      lVar4 = (long)uVar1 >> 8;\n      if ((uVar1 & 1) != 0) {\n        if (param_2 == -3) goto LAB_0031ada3;\n        lVar4 = *(long *)(*param_3 + lVar4);\n      }\n      uVar2 = (**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5);\n      if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }\n    }\nLAB_0031ada3:\n    uVar5 = uVar5 - 1;\n    param_1 = param_1 + -0x10;\n  }" { (if_statement "if (uVar5 == 0) {\n      return 1;\n    }" if (parenthesized_expression "(uVar5 == 0)" ( (binary_expression "uVar5 == 0" identifier == number_literal) )) (compound_statement "{\n      return 1;\n    }" { (return_statement "return 1;" return number_literal ;) })) (expression_statement "uVar1 = *(ulong *)(param_1 + 0x10);" (assignment_expression "uVar1 = *(ulong *)(param_1 + 0x10)" identifier = (pointer_expression "*(ulong *)(param_1 + 0x10)" * (cast_expression "(ulong *)(param_1 + 0x10)" ( (type_descriptor "ulong *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x10)" ( (binary_expression "param_1 + 0x10" identifier + number_literal) ))))) ;) (if_statement "if ((uVar1 & 2) != 0) {\n      lVar4 = (long)uVar1 >> 8;\n      if ((uVar1 & 1) != 0) {\n        if (param_2 == -3) goto LAB_0031ada3;\n        lVar4 = *(long *)(*param_3 + lVar4);\n      }\n      uVar2 = (**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5);\n      if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }\n    }" if (parenthesized_expression "((uVar1 & 2) != 0)" ( (binary_expression "(uVar1 & 2) != 0" (parenthesized_expression "(uVar1 & 2)" ( (binary_expression "uVar1 & 2" identifier & number_literal) )) != number_literal) )) (compound_statement "{\n      lVar4 = (long)uVar1 >> 8;\n      if ((uVar1 & 1) != 0) {\n        if (param_2 == -3) goto LAB_0031ada3;\n        lVar4 = *(long *)(*param_3 + lVar4);\n      }\n      uVar2 = (**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5);\n      if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }\n    }" { (expression_statement "lVar4 = (long)uVar1 >> 8;" (assignment_expression "lVar4 = (long)uVar1 >> 8" identifier = (binary_expression "(long)uVar1 >> 8" (cast_expression "(long)uVar1" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) >> number_literal)) ;) (if_statement "if ((uVar1 & 1) != 0) {\n        if (param_2 == -3) goto LAB_0031ada3;\n        lVar4 = *(long *)(*param_3 + lVar4);\n      }" if (parenthesized_expression "((uVar1 & 1) != 0)" ( (binary_expression "(uVar1 & 1) != 0" (parenthesized_expression "(uVar1 & 1)" ( (binary_expression "uVar1 & 1" identifier & number_literal) )) != number_literal) )) (compound_statement "{\n        if (param_2 == -3) goto LAB_0031ada3;\n        lVar4 = *(long *)(*param_3 + lVar4);\n      }" { (if_statement "if (param_2 == -3) goto LAB_0031ada3;" if (parenthesized_expression "(param_2 == -3)" ( (binary_expression "param_2 == -3" identifier == number_literal) )) (goto_statement "goto LAB_0031ada3;" goto statement_identifier ;)) (expression_statement "lVar4 = *(long *)(*param_3 + lVar4);" (assignment_expression "lVar4 = *(long *)(*param_3 + lVar4)" identifier = (pointer_expression "*(long *)(*param_3 + lVar4)" * (cast_expression "(long *)(*param_3 + lVar4)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*param_3 + lVar4)" ( (binary_expression "*param_3 + lVar4" (pointer_expression "*param_3" * identifier) + identifier) ))))) ;) })) (expression_statement "uVar2 = (**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5);" (assignment_expression "uVar2 = (**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5)" identifier = (call_expression "(**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5)" (parenthesized_expression "(**(code **)(**(long **)(param_1 + 8) + 0x40))" ( (pointer_expression "**(code **)(**(long **)(param_1 + 8) + 0x40)" * (pointer_expression "*(code **)(**(long **)(param_1 + 8) + 0x40)" * (cast_expression "(code **)(**(long **)(param_1 + 8) + 0x40)" ( (type_descriptor "code **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(**(long **)(param_1 + 8) + 0x40)" ( (binary_expression "**(long **)(param_1 + 8) + 0x40" (pointer_expression "**(long **)(param_1 + 8)" * (pointer_expression "*(long **)(param_1 + 8)" * (cast_expression "(long **)(param_1 + 8)" ( (type_descriptor "long **" (sized_type_specifier "long" long) (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_1 + 8)" ( (binary_expression "param_1 + 8" identifier + number_literal) ))))) + number_literal) ))))) )) (argument_list "(*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5)" ( (pointer_expression "*(long **)(param_1 + 8)" * (cast_expression "(long **)(param_1 + 8)" ( (type_descriptor "long **" (sized_type_specifier "long" long) (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_1 + 8)" ( (binary_expression "param_1 + 8" identifier + number_literal) )))) , identifier , (binary_expression "lVar4 + (long)param_3" identifier + (cast_expression "(long)param_3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier)) , identifier , identifier )))) ;) (if_statement "if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }" if (parenthesized_expression "(3 < (int)uVar2)" ( (binary_expression "3 < (int)uVar2" number_literal < (cast_expression "(int)uVar2" ( (type_descriptor "int" primitive_type) ) identifier)) )) (compound_statement "{\n        return uVar2 | (uint)uVar1 & 1;\n      }" { (return_statement "return uVar2 | (uint)uVar1 & 1;" return (binary_expression "uVar2 | (uint)uVar1 & 1" identifier | (binary_expression "(uint)uVar1 & 1" (cast_expression "(uint)uVar1" ( (type_descriptor "uint" type_identifier) ) identifier) & number_literal)) ;) })) })) (labeled_statement "LAB_0031ada3:\n    uVar5 = uVar5 - 1;" statement_identifier : (expression_statement "uVar5 = uVar5 - 1;" (assignment_expression "uVar5 = uVar5 - 1" identifier = (binary_expression "uVar5 - 1" identifier - number_literal)) ;)) (expression_statement "param_1 = param_1 + -0x10;" (assignment_expression "param_1 = param_1 + -0x10" identifier = (binary_expression "param_1 + -0x10" identifier + number_literal)) ;) }) while (parenthesized_expression "( true )" ( true )) ;) })))
(translation_unit "/* __cxxabiv1::__vmi_class_type_info::__do_find_public_src(long, void const*,\n   __cxxabiv1::__class_type_info const*, void const*) const */\n\nuint __thiscall\n__cxxabiv1::__vmi_class_type_info::__do_find_public_src\n          (__vmi_class_type_info *this,long param_1,void *param_2,__class_type_info *param_3,\n          void *param_4)\n\n{\n  ulong uVar1;\n  char *__s1;\n  uint uVar2;\n  int iVar3;\n  long lVar4;\n  __vmi_class_type_info *p_Var5;\n  ulong uVar6;\n  \n  if (param_2 == param_4) {\n    __s1 = *(char **)(this + 8);\n    if (__s1 == *(char **)(param_3 + 8)) {\n      return 6;\n    }\n    if ((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_3 + 8)), iVar3 == 0)) {\n      return 6;\n    }\n  }\n  uVar6 = (ulong)*(uint *)(this + 0x14);\n  p_Var5 = this + uVar6 * 0x10;\n  do {\n    if (uVar6 == 0) {\n      return 1;\n    }\n    uVar1 = *(ulong *)(p_Var5 + 0x10);\n    if ((uVar1 & 2) != 0) {\n      lVar4 = (long)uVar1 >> 8;\n      if ((uVar1 & 1) != 0) {\n        if (param_1 == -3) goto LAB_0031ada3;\n                    /* WARNING: Load size is inaccurate */\n        lVar4 = *(long *)(*param_2 + lVar4);\n      }\n      uVar2 = (**(code **)(**(long **)(p_Var5 + 8) + 0x40))\n                        (*(long **)(p_Var5 + 8),param_1,lVar4 + (long)param_2,param_3,param_4);\n      if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }\n    }\nLAB_0031ada3:\n    uVar6 = uVar6 - 1;\n    p_Var5 = p_Var5 + -0x10;\n  } while( true );\n}\n\n" comment (function_definition "uint __thiscall\n__cxxabiv1::__vmi_class_type_info::__do_find_public_src\n          (__vmi_class_type_info *this,long param_1,void *param_2,__class_type_info *param_3,\n          void *param_4)\n\n{\n  ulong uVar1;\n  char *__s1;\n  uint uVar2;\n  int iVar3;\n  long lVar4;\n  __vmi_class_type_info *p_Var5;\n  ulong uVar6;\n  \n  if (param_2 == param_4) {\n    __s1 = *(char **)(this + 8);\n    if (__s1 == *(char **)(param_3 + 8)) {\n      return 6;\n    }\n    if ((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_3 + 8)), iVar3 == 0)) {\n      return 6;\n    }\n  }\n  uVar6 = (ulong)*(uint *)(this + 0x14);\n  p_Var5 = this + uVar6 * 0x10;\n  do {\n    if (uVar6 == 0) {\n      return 1;\n    }\n    uVar1 = *(ulong *)(p_Var5 + 0x10);\n    if ((uVar1 & 2) != 0) {\n      lVar4 = (long)uVar1 >> 8;\n      if ((uVar1 & 1) != 0) {\n        if (param_1 == -3) goto LAB_0031ada3;\n                    /* WARNING: Load size is inaccurate */\n        lVar4 = *(long *)(*param_2 + lVar4);\n      }\n      uVar2 = (**(code **)(**(long **)(p_Var5 + 8) + 0x40))\n                        (*(long **)(p_Var5 + 8),param_1,lVar4 + (long)param_2,param_3,param_4);\n      if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }\n    }\nLAB_0031ada3:\n    uVar6 = uVar6 - 1;\n    p_Var5 = p_Var5 + -0x10;\n  } while( true );\n}" type_identifier (ms_call_modifier "__thiscall" __thiscall) (ERROR "__cxxabiv1::__vmi_class_type_info::" identifier : : identifier : :) (function_declarator "__do_find_public_src\n          (__vmi_class_type_info *this,long param_1,void *param_2,__class_type_info *param_3,\n          void *param_4)" identifier (parameter_list "(__vmi_class_type_info *this,long param_1,void *param_2,__class_type_info *param_3,\n          void *param_4)" ( (parameter_declaration "__vmi_class_type_info *this" type_identifier (pointer_declarator "*this" * identifier)) , (parameter_declaration "long param_1" (sized_type_specifier "long" long) identifier) , (parameter_declaration "void *param_2" primitive_type (pointer_declarator "*param_2" * identifier)) , (parameter_declaration "__class_type_info *param_3" type_identifier (pointer_declarator "*param_3" * identifier)) , (parameter_declaration "void *param_4" primitive_type (pointer_declarator "*param_4" * identifier)) ))) (compound_statement "{\n  ulong uVar1;\n  char *__s1;\n  uint uVar2;\n  int iVar3;\n  long lVar4;\n  __vmi_class_type_info *p_Var5;\n  ulong uVar6;\n  \n  if (param_2 == param_4) {\n    __s1 = *(char **)(this + 8);\n    if (__s1 == *(char **)(param_3 + 8)) {\n      return 6;\n    }\n    if ((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_3 + 8)), iVar3 == 0)) {\n      return 6;\n    }\n  }\n  uVar6 = (ulong)*(uint *)(this + 0x14);\n  p_Var5 = this + uVar6 * 0x10;\n  do {\n    if (uVar6 == 0) {\n      return 1;\n    }\n    uVar1 = *(ulong *)(p_Var5 + 0x10);\n    if ((uVar1 & 2) != 0) {\n      lVar4 = (long)uVar1 >> 8;\n      if ((uVar1 & 1) != 0) {\n        if (param_1 == -3) goto LAB_0031ada3;\n                    /* WARNING: Load size is inaccurate */\n        lVar4 = *(long *)(*param_2 + lVar4);\n      }\n      uVar2 = (**(code **)(**(long **)(p_Var5 + 8) + 0x40))\n                        (*(long **)(p_Var5 + 8),param_1,lVar4 + (long)param_2,param_3,param_4);\n      if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }\n    }\nLAB_0031ada3:\n    uVar6 = uVar6 - 1;\n    p_Var5 = p_Var5 + -0x10;\n  } while( true );\n}" { (declaration "ulong uVar1;" type_identifier identifier ;) (declaration "char *__s1;" primitive_type (pointer_declarator "*__s1" * identifier) ;) (declaration "uint uVar2;" type_identifier identifier ;) (declaration "int iVar3;" primitive_type identifier ;) (declaration "long lVar4;" (sized_type_specifier "long" long) identifier ;) (declaration "__vmi_class_type_info *p_Var5;" type_identifier (pointer_declarator "*p_Var5" * identifier) ;) (declaration "ulong uVar6;" type_identifier identifier ;) (if_statement "if (param_2 == param_4) {\n    __s1 = *(char **)(this + 8);\n    if (__s1 == *(char **)(param_3 + 8)) {\n      return 6;\n    }\n    if ((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_3 + 8)), iVar3 == 0)) {\n      return 6;\n    }\n  }" if (parenthesized_expression "(param_2 == param_4)" ( (binary_expression "param_2 == param_4" identifier == identifier) )) (compound_statement "{\n    __s1 = *(char **)(this + 8);\n    if (__s1 == *(char **)(param_3 + 8)) {\n      return 6;\n    }\n    if ((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_3 + 8)), iVar3 == 0)) {\n      return 6;\n    }\n  }" { (expression_statement "__s1 = *(char **)(this + 8);" (assignment_expression "__s1 = *(char **)(this + 8)" identifier = (pointer_expression "*(char **)(this + 8)" * (cast_expression "(char **)(this + 8)" ( (type_descriptor "char **" primitive_type (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(this + 8)" ( (binary_expression "this + 8" identifier + number_literal) ))))) ;) (if_statement "if (__s1 == *(char **)(param_3 + 8)) {\n      return 6;\n    }" if (parenthesized_expression "(__s1 == *(char **)(param_3 + 8))" ( (binary_expression "__s1 == *(char **)(param_3 + 8)" identifier == (pointer_expression "*(char **)(param_3 + 8)" * (cast_expression "(char **)(param_3 + 8)" ( (type_descriptor "char **" primitive_type (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_3 + 8)" ( (binary_expression "param_3 + 8" identifier + number_literal) ))))) )) (compound_statement "{\n      return 6;\n    }" { (return_statement "return 6;" return number_literal ;) })) (if_statement "if ((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_3 + 8)), iVar3 == 0)) {\n      return 6;\n    }" if (parenthesized_expression "((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_3 + 8)), iVar3 == 0))" ( (binary_expression "(*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_3 + 8)), iVar3 == 0)" (parenthesized_expression "(*__s1 != '*')" ( (binary_expression "*__s1 != '*'" (pointer_expression "*__s1" * identifier) != (char_literal "'*'" ' character ')) )) && (parenthesized_expression "(iVar3 = strcmp(__s1,*(char **)(param_3 + 8)), iVar3 == 0)" ( (comma_expression "iVar3 = strcmp(__s1,*(char **)(param_3 + 8)), iVar3 == 0" (assignment_expression "iVar3 = strcmp(__s1,*(char **)(param_3 + 8))" identifier = (call_expression "strcmp(__s1,*(char **)(param_3 + 8))" identifier (argument_list "(__s1,*(char **)(param_3 + 8))" ( identifier , (pointer_expression "*(char **)(param_3 + 8)" * (cast_expression "(char **)(param_3 + 8)" ( (type_descriptor "char **" primitive_type (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_3 + 8)" ( (binary_expression "param_3 + 8" identifier + number_literal) )))) )))) , (binary_expression "iVar3 == 0" identifier == number_literal)) ))) )) (compound_statement "{\n      return 6;\n    }" { (return_statement "return 6;" return number_literal ;) })) })) (expression_statement "uVar6 = (ulong)*(uint *)(this + 0x14);" (assignment_expression "uVar6 = (ulong)*(uint *)(this + 0x14)" identifier = (binary_expression "(ulong)*(uint *)(this + 0x14)" (parenthesized_expression "(ulong)" ( identifier )) * (cast_expression "(uint *)(this + 0x14)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(this + 0x14)" ( (binary_expression "this + 0x14" identifier + number_literal) ))))) ;) (expression_statement "p_Var5 = this + uVar6 * 0x10;" (assignment_expression "p_Var5 = this + uVar6 * 0x10" identifier = (binary_expression "this + uVar6 * 0x10" identifier + (binary_expression "uVar6 * 0x10" identifier * number_literal))) ;) (do_statement "do {\n    if (uVar6 == 0) {\n      return 1;\n    }\n    uVar1 = *(ulong *)(p_Var5 + 0x10);\n    if ((uVar1 & 2) != 0) {\n      lVar4 = (long)uVar1 >> 8;\n      if ((uVar1 & 1) != 0) {\n        if (param_1 == -3) goto LAB_0031ada3;\n                    /* WARNING: Load size is inaccurate */\n        lVar4 = *(long *)(*param_2 + lVar4);\n      }\n      uVar2 = (**(code **)(**(long **)(p_Var5 + 8) + 0x40))\n                        (*(long **)(p_Var5 + 8),param_1,lVar4 + (long)param_2,param_3,param_4);\n      if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }\n    }\nLAB_0031ada3:\n    uVar6 = uVar6 - 1;\n    p_Var5 = p_Var5 + -0x10;\n  } while( true );" do (compound_statement "{\n    if (uVar6 == 0) {\n      return 1;\n    }\n    uVar1 = *(ulong *)(p_Var5 + 0x10);\n    if ((uVar1 & 2) != 0) {\n      lVar4 = (long)uVar1 >> 8;\n      if ((uVar1 & 1) != 0) {\n        if (param_1 == -3) goto LAB_0031ada3;\n                    /* WARNING: Load size is inaccurate */\n        lVar4 = *(long *)(*param_2 + lVar4);\n      }\n      uVar2 = (**(code **)(**(long **)(p_Var5 + 8) + 0x40))\n                        (*(long **)(p_Var5 + 8),param_1,lVar4 + (long)param_2,param_3,param_4);\n      if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }\n    }\nLAB_0031ada3:\n    uVar6 = uVar6 - 1;\n    p_Var5 = p_Var5 + -0x10;\n  }" { (if_statement "if (uVar6 == 0) {\n      return 1;\n    }" if (parenthesized_expression "(uVar6 == 0)" ( (binary_expression "uVar6 == 0" identifier == number_literal) )) (compound_statement "{\n      return 1;\n    }" { (return_statement "return 1;" return number_literal ;) })) (expression_statement "uVar1 = *(ulong *)(p_Var5 + 0x10);" (assignment_expression "uVar1 = *(ulong *)(p_Var5 + 0x10)" identifier = (pointer_expression "*(ulong *)(p_Var5 + 0x10)" * (cast_expression "(ulong *)(p_Var5 + 0x10)" ( (type_descriptor "ulong *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(p_Var5 + 0x10)" ( (binary_expression "p_Var5 + 0x10" identifier + number_literal) ))))) ;) (if_statement "if ((uVar1 & 2) != 0) {\n      lVar4 = (long)uVar1 >> 8;\n      if ((uVar1 & 1) != 0) {\n        if (param_1 == -3) goto LAB_0031ada3;\n                    /* WARNING: Load size is inaccurate */\n        lVar4 = *(long *)(*param_2 + lVar4);\n      }\n      uVar2 = (**(code **)(**(long **)(p_Var5 + 8) + 0x40))\n                        (*(long **)(p_Var5 + 8),param_1,lVar4 + (long)param_2,param_3,param_4);\n      if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }\n    }" if (parenthesized_expression "((uVar1 & 2) != 0)" ( (binary_expression "(uVar1 & 2) != 0" (parenthesized_expression "(uVar1 & 2)" ( (binary_expression "uVar1 & 2" identifier & number_literal) )) != number_literal) )) (compound_statement "{\n      lVar4 = (long)uVar1 >> 8;\n      if ((uVar1 & 1) != 0) {\n        if (param_1 == -3) goto LAB_0031ada3;\n                    /* WARNING: Load size is inaccurate */\n        lVar4 = *(long *)(*param_2 + lVar4);\n      }\n      uVar2 = (**(code **)(**(long **)(p_Var5 + 8) + 0x40))\n                        (*(long **)(p_Var5 + 8),param_1,lVar4 + (long)param_2,param_3,param_4);\n      if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }\n    }" { (expression_statement "lVar4 = (long)uVar1 >> 8;" (assignment_expression "lVar4 = (long)uVar1 >> 8" identifier = (binary_expression "(long)uVar1 >> 8" (cast_expression "(long)uVar1" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) >> number_literal)) ;) (if_statement "if ((uVar1 & 1) != 0) {\n        if (param_1 == -3) goto LAB_0031ada3;\n                    /* WARNING: Load size is inaccurate */\n        lVar4 = *(long *)(*param_2 + lVar4);\n      }" if (parenthesized_expression "((uVar1 & 1) != 0)" ( (binary_expression "(uVar1 & 1) != 0" (parenthesized_expression "(uVar1 & 1)" ( (binary_expression "uVar1 & 1" identifier & number_literal) )) != number_literal) )) (compound_statement "{\n        if (param_1 == -3) goto LAB_0031ada3;\n                    /* WARNING: Load size is inaccurate */\n        lVar4 = *(long *)(*param_2 + lVar4);\n      }" { (if_statement "if (param_1 == -3) goto LAB_0031ada3;" if (parenthesized_expression "(param_1 == -3)" ( (binary_expression "param_1 == -3" identifier == number_literal) )) (goto_statement "goto LAB_0031ada3;" goto statement_identifier ;)) comment (expression_statement "lVar4 = *(long *)(*param_2 + lVar4);" (assignment_expression "lVar4 = *(long *)(*param_2 + lVar4)" identifier = (pointer_expression "*(long *)(*param_2 + lVar4)" * (cast_expression "(long *)(*param_2 + lVar4)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*param_2 + lVar4)" ( (binary_expression "*param_2 + lVar4" (pointer_expression "*param_2" * identifier) + identifier) ))))) ;) })) (expression_statement "uVar2 = (**(code **)(**(long **)(p_Var5 + 8) + 0x40))\n                        (*(long **)(p_Var5 + 8),param_1,lVar4 + (long)param_2,param_3,param_4);" (assignment_expression "uVar2 = (**(code **)(**(long **)(p_Var5 + 8) + 0x40))\n                        (*(long **)(p_Var5 + 8),param_1,lVar4 + (long)param_2,param_3,param_4)" identifier = (call_expression "(**(code **)(**(long **)(p_Var5 + 8) + 0x40))\n                        (*(long **)(p_Var5 + 8),param_1,lVar4 + (long)param_2,param_3,param_4)" (parenthesized_expression "(**(code **)(**(long **)(p_Var5 + 8) + 0x40))" ( (pointer_expression "**(code **)(**(long **)(p_Var5 + 8) + 0x40)" * (pointer_expression "*(code **)(**(long **)(p_Var5 + 8) + 0x40)" * (cast_expression "(code **)(**(long **)(p_Var5 + 8) + 0x40)" ( (type_descriptor "code **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(**(long **)(p_Var5 + 8) + 0x40)" ( (binary_expression "**(long **)(p_Var5 + 8) + 0x40" (pointer_expression "**(long **)(p_Var5 + 8)" * (pointer_expression "*(long **)(p_Var5 + 8)" * (cast_expression "(long **)(p_Var5 + 8)" ( (type_descriptor "long **" (sized_type_specifier "long" long) (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(p_Var5 + 8)" ( (binary_expression "p_Var5 + 8" identifier + number_literal) ))))) + number_literal) ))))) )) (argument_list "(*(long **)(p_Var5 + 8),param_1,lVar4 + (long)param_2,param_3,param_4)" ( (pointer_expression "*(long **)(p_Var5 + 8)" * (cast_expression "(long **)(p_Var5 + 8)" ( (type_descriptor "long **" (sized_type_specifier "long" long) (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(p_Var5 + 8)" ( (binary_expression "p_Var5 + 8" identifier + number_literal) )))) , identifier , (binary_expression "lVar4 + (long)param_2" identifier + (cast_expression "(long)param_2" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier)) , identifier , identifier )))) ;) (if_statement "if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }" if (parenthesized_expression "(3 < (int)uVar2)" ( (binary_expression "3 < (int)uVar2" number_literal < (cast_expression "(int)uVar2" ( (type_descriptor "int" primitive_type) ) identifier)) )) (compound_statement "{\n        return uVar2 | (uint)uVar1 & 1;\n      }" { (return_statement "return uVar2 | (uint)uVar1 & 1;" return (binary_expression "uVar2 | (uint)uVar1 & 1" identifier | (binary_expression "(uint)uVar1 & 1" (cast_expression "(uint)uVar1" ( (type_descriptor "uint" type_identifier) ) identifier) & number_literal)) ;) })) })) (labeled_statement "LAB_0031ada3:\n    uVar6 = uVar6 - 1;" statement_identifier : (expression_statement "uVar6 = uVar6 - 1;" (assignment_expression "uVar6 = uVar6 - 1" identifier = (binary_expression "uVar6 - 1" identifier - number_literal)) ;)) (expression_statement "p_Var5 = p_Var5 + -0x10;" (assignment_expression "p_Var5 = p_Var5 + -0x10" identifier = (binary_expression "p_Var5 + -0x10" identifier + number_literal)) ;) }) while (parenthesized_expression "( true )" ( true )) ;) })))
(translation_unit "uint FUN_0031ad20(long param_1,long param_2,long *param_3,long param_4,long *param_5)\n\n{\n  ulong uVar1;\n  char *__s1;\n  uint uVar2;\n  int iVar3;\n  long lVar4;\n  ulong uVar5;\n  \n  if (param_3 == param_5) {\n    __s1 = *(char **)(param_1 + 8);\n    if (__s1 == *(char **)(param_4 + 8)) {\n      return 6;\n    }\n    if ((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0)) {\n      return 6;\n    }\n  }\n  uVar5 = (ulong)*(uint *)(param_1 + 0x14);\n  param_1 = param_1 + uVar5 * 0x10;\n  do {\n    if (uVar5 == 0) {\n      return 1;\n    }\n    uVar1 = *(ulong *)(param_1 + 0x10);\n    if ((uVar1 & 2) != 0) {\n      lVar4 = (long)uVar1 >> 8;\n      if ((uVar1 & 1) != 0) {\n        if (param_2 == -3) goto LAB_0031ada3;\n        lVar4 = *(long *)(*param_3 + lVar4);\n      }\n      uVar2 = (**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5);\n      if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }\n    }\nLAB_0031ada3:\n    uVar5 = uVar5 - 1;\n    param_1 = param_1 + -0x10;\n  } while( true );\n}\n\n" (function_definition "uint FUN_0031ad20(long param_1,long param_2,long *param_3,long param_4,long *param_5)\n\n{\n  ulong uVar1;\n  char *__s1;\n  uint uVar2;\n  int iVar3;\n  long lVar4;\n  ulong uVar5;\n  \n  if (param_3 == param_5) {\n    __s1 = *(char **)(param_1 + 8);\n    if (__s1 == *(char **)(param_4 + 8)) {\n      return 6;\n    }\n    if ((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0)) {\n      return 6;\n    }\n  }\n  uVar5 = (ulong)*(uint *)(param_1 + 0x14);\n  param_1 = param_1 + uVar5 * 0x10;\n  do {\n    if (uVar5 == 0) {\n      return 1;\n    }\n    uVar1 = *(ulong *)(param_1 + 0x10);\n    if ((uVar1 & 2) != 0) {\n      lVar4 = (long)uVar1 >> 8;\n      if ((uVar1 & 1) != 0) {\n        if (param_2 == -3) goto LAB_0031ada3;\n        lVar4 = *(long *)(*param_3 + lVar4);\n      }\n      uVar2 = (**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5);\n      if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }\n    }\nLAB_0031ada3:\n    uVar5 = uVar5 - 1;\n    param_1 = param_1 + -0x10;\n  } while( true );\n}" type_identifier (function_declarator "FUN_0031ad20(long param_1,long param_2,long *param_3,long param_4,long *param_5)" identifier (parameter_list "(long param_1,long param_2,long *param_3,long param_4,long *param_5)" ( (parameter_declaration "long param_1" (sized_type_specifier "long" long) identifier) , (parameter_declaration "long param_2" (sized_type_specifier "long" long) identifier) , (parameter_declaration "long *param_3" (sized_type_specifier "long" long) (pointer_declarator "*param_3" * identifier)) , (parameter_declaration "long param_4" (sized_type_specifier "long" long) identifier) , (parameter_declaration "long *param_5" (sized_type_specifier "long" long) (pointer_declarator "*param_5" * identifier)) ))) (compound_statement "{\n  ulong uVar1;\n  char *__s1;\n  uint uVar2;\n  int iVar3;\n  long lVar4;\n  ulong uVar5;\n  \n  if (param_3 == param_5) {\n    __s1 = *(char **)(param_1 + 8);\n    if (__s1 == *(char **)(param_4 + 8)) {\n      return 6;\n    }\n    if ((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0)) {\n      return 6;\n    }\n  }\n  uVar5 = (ulong)*(uint *)(param_1 + 0x14);\n  param_1 = param_1 + uVar5 * 0x10;\n  do {\n    if (uVar5 == 0) {\n      return 1;\n    }\n    uVar1 = *(ulong *)(param_1 + 0x10);\n    if ((uVar1 & 2) != 0) {\n      lVar4 = (long)uVar1 >> 8;\n      if ((uVar1 & 1) != 0) {\n        if (param_2 == -3) goto LAB_0031ada3;\n        lVar4 = *(long *)(*param_3 + lVar4);\n      }\n      uVar2 = (**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5);\n      if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }\n    }\nLAB_0031ada3:\n    uVar5 = uVar5 - 1;\n    param_1 = param_1 + -0x10;\n  } while( true );\n}" { (declaration "ulong uVar1;" type_identifier identifier ;) (declaration "char *__s1;" primitive_type (pointer_declarator "*__s1" * identifier) ;) (declaration "uint uVar2;" type_identifier identifier ;) (declaration "int iVar3;" primitive_type identifier ;) (declaration "long lVar4;" (sized_type_specifier "long" long) identifier ;) (declaration "ulong uVar5;" type_identifier identifier ;) (if_statement "if (param_3 == param_5) {\n    __s1 = *(char **)(param_1 + 8);\n    if (__s1 == *(char **)(param_4 + 8)) {\n      return 6;\n    }\n    if ((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0)) {\n      return 6;\n    }\n  }" if (parenthesized_expression "(param_3 == param_5)" ( (binary_expression "param_3 == param_5" identifier == identifier) )) (compound_statement "{\n    __s1 = *(char **)(param_1 + 8);\n    if (__s1 == *(char **)(param_4 + 8)) {\n      return 6;\n    }\n    if ((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0)) {\n      return 6;\n    }\n  }" { (expression_statement "__s1 = *(char **)(param_1 + 8);" (assignment_expression "__s1 = *(char **)(param_1 + 8)" identifier = (pointer_expression "*(char **)(param_1 + 8)" * (cast_expression "(char **)(param_1 + 8)" ( (type_descriptor "char **" primitive_type (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_1 + 8)" ( (binary_expression "param_1 + 8" identifier + number_literal) ))))) ;) (if_statement "if (__s1 == *(char **)(param_4 + 8)) {\n      return 6;\n    }" if (parenthesized_expression "(__s1 == *(char **)(param_4 + 8))" ( (binary_expression "__s1 == *(char **)(param_4 + 8)" identifier == (pointer_expression "*(char **)(param_4 + 8)" * (cast_expression "(char **)(param_4 + 8)" ( (type_descriptor "char **" primitive_type (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_4 + 8)" ( (binary_expression "param_4 + 8" identifier + number_literal) ))))) )) (compound_statement "{\n      return 6;\n    }" { (return_statement "return 6;" return number_literal ;) })) (if_statement "if ((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0)) {\n      return 6;\n    }" if (parenthesized_expression "((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0))" ( (binary_expression "(*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0)" (parenthesized_expression "(*__s1 != '*')" ( (binary_expression "*__s1 != '*'" (pointer_expression "*__s1" * identifier) != (char_literal "'*'" ' character ')) )) && (parenthesized_expression "(iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0)" ( (comma_expression "iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0" (assignment_expression "iVar3 = strcmp(__s1,*(char **)(param_4 + 8))" identifier = (call_expression "strcmp(__s1,*(char **)(param_4 + 8))" identifier (argument_list "(__s1,*(char **)(param_4 + 8))" ( identifier , (pointer_expression "*(char **)(param_4 + 8)" * (cast_expression "(char **)(param_4 + 8)" ( (type_descriptor "char **" primitive_type (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_4 + 8)" ( (binary_expression "param_4 + 8" identifier + number_literal) )))) )))) , (binary_expression "iVar3 == 0" identifier == number_literal)) ))) )) (compound_statement "{\n      return 6;\n    }" { (return_statement "return 6;" return number_literal ;) })) })) (expression_statement "uVar5 = (ulong)*(uint *)(param_1 + 0x14);" (assignment_expression "uVar5 = (ulong)*(uint *)(param_1 + 0x14)" identifier = (binary_expression "(ulong)*(uint *)(param_1 + 0x14)" (parenthesized_expression "(ulong)" ( identifier )) * (cast_expression "(uint *)(param_1 + 0x14)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x14)" ( (binary_expression "param_1 + 0x14" identifier + number_literal) ))))) ;) (expression_statement "param_1 = param_1 + uVar5 * 0x10;" (assignment_expression "param_1 = param_1 + uVar5 * 0x10" identifier = (binary_expression "param_1 + uVar5 * 0x10" identifier + (binary_expression "uVar5 * 0x10" identifier * number_literal))) ;) (do_statement "do {\n    if (uVar5 == 0) {\n      return 1;\n    }\n    uVar1 = *(ulong *)(param_1 + 0x10);\n    if ((uVar1 & 2) != 0) {\n      lVar4 = (long)uVar1 >> 8;\n      if ((uVar1 & 1) != 0) {\n        if (param_2 == -3) goto LAB_0031ada3;\n        lVar4 = *(long *)(*param_3 + lVar4);\n      }\n      uVar2 = (**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5);\n      if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }\n    }\nLAB_0031ada3:\n    uVar5 = uVar5 - 1;\n    param_1 = param_1 + -0x10;\n  } while( true );" do (compound_statement "{\n    if (uVar5 == 0) {\n      return 1;\n    }\n    uVar1 = *(ulong *)(param_1 + 0x10);\n    if ((uVar1 & 2) != 0) {\n      lVar4 = (long)uVar1 >> 8;\n      if ((uVar1 & 1) != 0) {\n        if (param_2 == -3) goto LAB_0031ada3;\n        lVar4 = *(long *)(*param_3 + lVar4);\n      }\n      uVar2 = (**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5);\n      if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }\n    }\nLAB_0031ada3:\n    uVar5 = uVar5 - 1;\n    param_1 = param_1 + -0x10;\n  }" { (if_statement "if (uVar5 == 0) {\n      return 1;\n    }" if (parenthesized_expression "(uVar5 == 0)" ( (binary_expression "uVar5 == 0" identifier == number_literal) )) (compound_statement "{\n      return 1;\n    }" { (return_statement "return 1;" return number_literal ;) })) (expression_statement "uVar1 = *(ulong *)(param_1 + 0x10);" (assignment_expression "uVar1 = *(ulong *)(param_1 + 0x10)" identifier = (pointer_expression "*(ulong *)(param_1 + 0x10)" * (cast_expression "(ulong *)(param_1 + 0x10)" ( (type_descriptor "ulong *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(param_1 + 0x10)" ( (binary_expression "param_1 + 0x10" identifier + number_literal) ))))) ;) (if_statement "if ((uVar1 & 2) != 0) {\n      lVar4 = (long)uVar1 >> 8;\n      if ((uVar1 & 1) != 0) {\n        if (param_2 == -3) goto LAB_0031ada3;\n        lVar4 = *(long *)(*param_3 + lVar4);\n      }\n      uVar2 = (**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5);\n      if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }\n    }" if (parenthesized_expression "((uVar1 & 2) != 0)" ( (binary_expression "(uVar1 & 2) != 0" (parenthesized_expression "(uVar1 & 2)" ( (binary_expression "uVar1 & 2" identifier & number_literal) )) != number_literal) )) (compound_statement "{\n      lVar4 = (long)uVar1 >> 8;\n      if ((uVar1 & 1) != 0) {\n        if (param_2 == -3) goto LAB_0031ada3;\n        lVar4 = *(long *)(*param_3 + lVar4);\n      }\n      uVar2 = (**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5);\n      if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }\n    }" { (expression_statement "lVar4 = (long)uVar1 >> 8;" (assignment_expression "lVar4 = (long)uVar1 >> 8" identifier = (binary_expression "(long)uVar1 >> 8" (cast_expression "(long)uVar1" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier) >> number_literal)) ;) (if_statement "if ((uVar1 & 1) != 0) {\n        if (param_2 == -3) goto LAB_0031ada3;\n        lVar4 = *(long *)(*param_3 + lVar4);\n      }" if (parenthesized_expression "((uVar1 & 1) != 0)" ( (binary_expression "(uVar1 & 1) != 0" (parenthesized_expression "(uVar1 & 1)" ( (binary_expression "uVar1 & 1" identifier & number_literal) )) != number_literal) )) (compound_statement "{\n        if (param_2 == -3) goto LAB_0031ada3;\n        lVar4 = *(long *)(*param_3 + lVar4);\n      }" { (if_statement "if (param_2 == -3) goto LAB_0031ada3;" if (parenthesized_expression "(param_2 == -3)" ( (binary_expression "param_2 == -3" identifier == number_literal) )) (goto_statement "goto LAB_0031ada3;" goto statement_identifier ;)) (expression_statement "lVar4 = *(long *)(*param_3 + lVar4);" (assignment_expression "lVar4 = *(long *)(*param_3 + lVar4)" identifier = (pointer_expression "*(long *)(*param_3 + lVar4)" * (cast_expression "(long *)(*param_3 + lVar4)" ( (type_descriptor "long *" (sized_type_specifier "long" long) (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(*param_3 + lVar4)" ( (binary_expression "*param_3 + lVar4" (pointer_expression "*param_3" * identifier) + identifier) ))))) ;) })) (expression_statement "uVar2 = (**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5);" (assignment_expression "uVar2 = (**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5)" identifier = (call_expression "(**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5)" (parenthesized_expression "(**(code **)(**(long **)(param_1 + 8) + 0x40))" ( (pointer_expression "**(code **)(**(long **)(param_1 + 8) + 0x40)" * (pointer_expression "*(code **)(**(long **)(param_1 + 8) + 0x40)" * (cast_expression "(code **)(**(long **)(param_1 + 8) + 0x40)" ( (type_descriptor "code **" type_identifier (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(**(long **)(param_1 + 8) + 0x40)" ( (binary_expression "**(long **)(param_1 + 8) + 0x40" (pointer_expression "**(long **)(param_1 + 8)" * (pointer_expression "*(long **)(param_1 + 8)" * (cast_expression "(long **)(param_1 + 8)" ( (type_descriptor "long **" (sized_type_specifier "long" long) (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_1 + 8)" ( (binary_expression "param_1 + 8" identifier + number_literal) ))))) + number_literal) ))))) )) (argument_list "(*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5)" ( (pointer_expression "*(long **)(param_1 + 8)" * (cast_expression "(long **)(param_1 + 8)" ( (type_descriptor "long **" (sized_type_specifier "long" long) (abstract_pointer_declarator "**" * (abstract_pointer_declarator "*" *))) ) (parenthesized_expression "(param_1 + 8)" ( (binary_expression "param_1 + 8" identifier + number_literal) )))) , identifier , (binary_expression "lVar4 + (long)param_3" identifier + (cast_expression "(long)param_3" ( (type_descriptor "long" (sized_type_specifier "long" long)) ) identifier)) , identifier , identifier )))) ;) (if_statement "if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }" if (parenthesized_expression "(3 < (int)uVar2)" ( (binary_expression "3 < (int)uVar2" number_literal < (cast_expression "(int)uVar2" ( (type_descriptor "int" primitive_type) ) identifier)) )) (compound_statement "{\n        return uVar2 | (uint)uVar1 & 1;\n      }" { (return_statement "return uVar2 | (uint)uVar1 & 1;" return (binary_expression "uVar2 | (uint)uVar1 & 1" identifier | (binary_expression "(uint)uVar1 & 1" (cast_expression "(uint)uVar1" ( (type_descriptor "uint" type_identifier) ) identifier) & number_literal)) ;) })) })) (labeled_statement "LAB_0031ada3:\n    uVar5 = uVar5 - 1;" statement_identifier : (expression_statement "uVar5 = uVar5 - 1;" (assignment_expression "uVar5 = uVar5 - 1" identifier = (binary_expression "uVar5 - 1" identifier - number_literal)) ;)) (expression_statement "param_1 = param_1 + -0x10;" (assignment_expression "param_1 = param_1 + -0x10" identifier = (binary_expression "param_1 + -0x10" identifier + number_literal)) ;) }) while (parenthesized_expression "( true )" ( true )) ;) })))
(translation_unit (function_definition TYPE (function_declarator IDENT (parameter_list ( (parameter_declaration (sized_type_specifier long) IDENT) , (parameter_declaration (sized_type_specifier long) IDENT) , (parameter_declaration (sized_type_specifier long) (pointer_declarator * IDENT)) , (parameter_declaration (sized_type_specifier long) IDENT) , (parameter_declaration (sized_type_specifier long) (pointer_declarator * IDENT)) ))) (compound_statement { (declaration TYPE IDENT ;) (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration (sized_type_specifier long) IDENT ;) (declaration TYPE IDENT ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT == IDENT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT == (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))) )) (compound_statement { (return_statement return LIT ;) })) (if_statement if (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression (pointer_expression * IDENT) != (char_literal ' character ')) )) && (parenthesized_expression ( (comma_expression (assignment_expression IDENT = (call_expression IDENT (argument_list ( IDENT , (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) )))) , (binary_expression IDENT == LIT)) ))) )) (compound_statement { (return_statement return LIT ;) })) })) (expression_statement (assignment_expression IDENT = (binary_expression (parenthesized_expression ( IDENT )) * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + (binary_expression IDENT * LIT))) ;) (do_statement do (compound_statement { (if_statement if (parenthesized_expression ( (binary_expression IDENT == LIT) )) (compound_statement { (return_statement return LIT ;) })) (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))) ;) (if_statement if (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression IDENT & LIT) )) != LIT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression (cast_expression ( (type_descriptor (sized_type_specifier long)) ) IDENT) >> LIT)) ;) (if_statement if (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression IDENT & LIT) )) != LIT) )) (compound_statement { (if_statement if (parenthesized_expression ( (binary_expression IDENT == LIT) )) (goto_statement goto statement_identifier ;)) (expression_statement (assignment_expression IDENT = (pointer_expression * (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression (pointer_expression * IDENT) + IDENT) ))))) ;) })) (expression_statement (assignment_expression IDENT = (call_expression (parenthesized_expression ( (pointer_expression * (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (parenthesized_expression ( (binary_expression (pointer_expression * (pointer_expression * (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (parenthesized_expression ( (binary_expression IDENT + LIT) ))))) + LIT) ))))) )) (argument_list ( (pointer_expression * (cast_expression ( (type_descriptor (sized_type_specifier long) (abstract_pointer_declarator * (abstract_pointer_declarator *))) ) (parenthesized_expression ( (binary_expression IDENT + LIT) )))) , IDENT , (binary_expression IDENT + (cast_expression ( (type_descriptor (sized_type_specifier long)) ) IDENT)) , IDENT , IDENT )))) ;) (if_statement if (parenthesized_expression ( (binary_expression LIT < (cast_expression ( (type_descriptor TYPE) ) IDENT)) )) (compound_statement { (return_statement return (binary_expression IDENT | (binary_expression (cast_expression ( (type_descriptor TYPE) ) IDENT) & LIT)) ;) })) })) (labeled_statement statement_identifier : (expression_statement (assignment_expression IDENT = (binary_expression IDENT - LIT)) ;)) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) }) while (parenthesized_expression ( BOOL )) ;) })))
(function_definition "uint FUN_0031ad20(long param_1,long param_2,long *param_3,long param_4,long *param_5)\n\n{\n  ulong uVar1;\n  char *__s1;\n  uint uVar2;\n  int iVar3;\n  long lVar4;\n  ulong uVar5;\n  \n  if (param_3 == param_5) {\n    __s1 = *(char **)(param_1 + 8);\n    if (__s1 == *(char **)(param_4 + 8)) {\n      return 6;\n    }\n    if ((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0)) {\n      return 6;\n    }\n  }\n  uVar5 = (ulong)*(uint *)(param_1 + 0x14);\n  param_1 = param_1 + uVar5 * 0x10;\n  do {\n    if (uVar5 == 0) {\n      return 1;\n    }\n    uVar1 = *(ulong *)(param_1 + 0x10);\n    if ((uVar1 & 2) != 0) {\n      lVar4 = (long)uVar1 >> 8;\n      if ((uVar1 & 1) != 0) {\n        if (param_2 == -3) goto LAB_0031ada3;\n        lVar4 = *(long *)(*param_3 + lVar4);\n      }\n      uVar2 = (**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5);\n      if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }\n    }\nLAB_0031ada3:\n    uVar5 = uVar5 - 1;\n    param_1 = param_1 + -0x10;\n  } while( true );\n}" (type_identifier "uint") (function_declarator "FUN_0031ad20(long param_1,long param_2,long *param_3,long param_4,long *param_5)" (identifier "FUN_0031ad20") (parameter_list "(long param_1,long param_2,long *param_3,long param_4,long *param_5)" (( "(") (parameter_declaration "long param_1" (sized_type_specifier "long" (long "long")) (identifier "param_1")) (, ",") (parameter_declaration "long param_2" (sized_type_specifier "long" (long "long")) (identifier "param_2")) (, ",") (parameter_declaration "long *param_3" (sized_type_specifier "long" (long "long")) (pointer_declarator "*param_3" (* "*") (identifier "param_3"))) (, ",") (parameter_declaration "long param_4" (sized_type_specifier "long" (long "long")) (identifier "param_4")) (, ",") (parameter_declaration "long *param_5" (sized_type_specifier "long" (long "long")) (pointer_declarator "*param_5" (* "*") (identifier "param_5"))) () ")"))) (compound_statement "{\n  ulong uVar1;\n  char *__s1;\n  uint uVar2;\n  int iVar3;\n  long lVar4;\n  ulong uVar5;\n  \n  if (param_3 == param_5) {\n    __s1 = *(char **)(param_1 + 8);\n    if (__s1 == *(char **)(param_4 + 8)) {\n      return 6;\n    }\n    if ((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0)) {\n      return 6;\n    }\n  }\n  uVar5 = (ulong)*(uint *)(param_1 + 0x14);\n  param_1 = param_1 + uVar5 * 0x10;\n  do {\n    if (uVar5 == 0) {\n      return 1;\n    }\n    uVar1 = *(ulong *)(param_1 + 0x10);\n    if ((uVar1 & 2) != 0) {\n      lVar4 = (long)uVar1 >> 8;\n      if ((uVar1 & 1) != 0) {\n        if (param_2 == -3) goto LAB_0031ada3;\n        lVar4 = *(long *)(*param_3 + lVar4);\n      }\n      uVar2 = (**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5);\n      if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }\n    }\nLAB_0031ada3:\n    uVar5 = uVar5 - 1;\n    param_1 = param_1 + -0x10;\n  } while( true );\n}" ({ "{") (declaration "ulong uVar1;" (type_identifier "ulong") (identifier "uVar1") (; ";")) (declaration "char *__s1;" (primitive_type "char") (pointer_declarator "*__s1" (* "*") (identifier "__s1")) (; ";")) (declaration "uint uVar2;" (type_identifier "uint") (identifier "uVar2") (; ";")) (declaration "int iVar3;" (primitive_type "int") (identifier "iVar3") (; ";")) (declaration "long lVar4;" (sized_type_specifier "long" (long "long")) (identifier "lVar4") (; ";")) (declaration "ulong uVar5;" (type_identifier "ulong") (identifier "uVar5") (; ";")) (if_statement "if (param_3 == param_5) {\n    __s1 = *(char **)(param_1 + 8);\n    if (__s1 == *(char **)(param_4 + 8)) {\n      return 6;\n    }\n    if ((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0)) {\n      return 6;\n    }\n  }" (if "if") (parenthesized_expression "(param_3 == param_5)" (( "(") (binary_expression "param_3 == param_5" (identifier "param_3") (== "==") (identifier "param_5")) () ")")) (compound_statement "{\n    __s1 = *(char **)(param_1 + 8);\n    if (__s1 == *(char **)(param_4 + 8)) {\n      return 6;\n    }\n    if ((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0)) {\n      return 6;\n    }\n  }" ({ "{") (expression_statement "__s1 = *(char **)(param_1 + 8);" (assignment_expression "__s1 = *(char **)(param_1 + 8)" (identifier "__s1") (= "=") (pointer_expression "*(char **)(param_1 + 8)" (* "*") (cast_expression "(char **)(param_1 + 8)" (( "(") (type_descriptor "char **" (primitive_type "char") (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (parenthesized_expression "(param_1 + 8)" (( "(") (binary_expression "param_1 + 8" (identifier "param_1") (+ "+") (number_literal "8")) () ")"))))) (; ";")) (if_statement "if (__s1 == *(char **)(param_4 + 8)) {\n      return 6;\n    }" (if "if") (parenthesized_expression "(__s1 == *(char **)(param_4 + 8))" (( "(") (binary_expression "__s1 == *(char **)(param_4 + 8)" (identifier "__s1") (== "==") (pointer_expression "*(char **)(param_4 + 8)" (* "*") (cast_expression "(char **)(param_4 + 8)" (( "(") (type_descriptor "char **" (primitive_type "char") (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (parenthesized_expression "(param_4 + 8)" (( "(") (binary_expression "param_4 + 8" (identifier "param_4") (+ "+") (number_literal "8")) () ")"))))) () ")")) (compound_statement "{\n      return 6;\n    }" ({ "{") (return_statement "return 6;" (return "return") (number_literal "6") (; ";")) (} "}"))) (if_statement "if ((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0)) {\n      return 6;\n    }" (if "if") (parenthesized_expression "((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0))" (( "(") (binary_expression "(*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0)" (parenthesized_expression "(*__s1 != '*')" (( "(") (binary_expression "*__s1 != '*'" (pointer_expression "*__s1" (* "*") (identifier "__s1")) (!= "!=") (char_literal "'*'" (' "'") (character "*") (' "'"))) () ")")) (&& "&&") (parenthesized_expression "(iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0)" (( "(") (comma_expression "iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0" (assignment_expression "iVar3 = strcmp(__s1,*(char **)(param_4 + 8))" (identifier "iVar3") (= "=") (call_expression "strcmp(__s1,*(char **)(param_4 + 8))" (identifier "strcmp") (argument_list "(__s1,*(char **)(param_4 + 8))" (( "(") (identifier "__s1") (, ",") (pointer_expression "*(char **)(param_4 + 8)" (* "*") (cast_expression "(char **)(param_4 + 8)" (( "(") (type_descriptor "char **" (primitive_type "char") (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (parenthesized_expression "(param_4 + 8)" (( "(") (binary_expression "param_4 + 8" (identifier "param_4") (+ "+") (number_literal "8")) () ")")))) () ")")))) (, ",") (binary_expression "iVar3 == 0" (identifier "iVar3") (== "==") (number_literal "0"))) () ")"))) () ")")) (compound_statement "{\n      return 6;\n    }" ({ "{") (return_statement "return 6;" (return "return") (number_literal "6") (; ";")) (} "}"))) (} "}"))) (expression_statement "uVar5 = (ulong)*(uint *)(param_1 + 0x14);" (assignment_expression "uVar5 = (ulong)*(uint *)(param_1 + 0x14)" (identifier "uVar5") (= "=") (binary_expression "(ulong)*(uint *)(param_1 + 0x14)" (parenthesized_expression "(ulong)" (( "(") (identifier "ulong") () ")")) (* "*") (cast_expression "(uint *)(param_1 + 0x14)" (( "(") (type_descriptor "uint *" (type_identifier "uint") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_1 + 0x14)" (( "(") (binary_expression "param_1 + 0x14" (identifier "param_1") (+ "+") (number_literal "0x14")) () ")"))))) (; ";")) (expression_statement "param_1 = param_1 + uVar5 * 0x10;" (assignment_expression "param_1 = param_1 + uVar5 * 0x10" (identifier "param_1") (= "=") (binary_expression "param_1 + uVar5 * 0x10" (identifier "param_1") (+ "+") (binary_expression "uVar5 * 0x10" (identifier "uVar5") (* "*") (number_literal "0x10")))) (; ";")) (do_statement "do {\n    if (uVar5 == 0) {\n      return 1;\n    }\n    uVar1 = *(ulong *)(param_1 + 0x10);\n    if ((uVar1 & 2) != 0) {\n      lVar4 = (long)uVar1 >> 8;\n      if ((uVar1 & 1) != 0) {\n        if (param_2 == -3) goto LAB_0031ada3;\n        lVar4 = *(long *)(*param_3 + lVar4);\n      }\n      uVar2 = (**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5);\n      if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }\n    }\nLAB_0031ada3:\n    uVar5 = uVar5 - 1;\n    param_1 = param_1 + -0x10;\n  } while( true );" (do "do") (compound_statement "{\n    if (uVar5 == 0) {\n      return 1;\n    }\n    uVar1 = *(ulong *)(param_1 + 0x10);\n    if ((uVar1 & 2) != 0) {\n      lVar4 = (long)uVar1 >> 8;\n      if ((uVar1 & 1) != 0) {\n        if (param_2 == -3) goto LAB_0031ada3;\n        lVar4 = *(long *)(*param_3 + lVar4);\n      }\n      uVar2 = (**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5);\n      if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }\n    }\nLAB_0031ada3:\n    uVar5 = uVar5 - 1;\n    param_1 = param_1 + -0x10;\n  }" ({ "{") (if_statement "if (uVar5 == 0) {\n      return 1;\n    }" (if "if") (parenthesized_expression "(uVar5 == 0)" (( "(") (binary_expression "uVar5 == 0" (identifier "uVar5") (== "==") (number_literal "0")) () ")")) (compound_statement "{\n      return 1;\n    }" ({ "{") (return_statement "return 1;" (return "return") (number_literal "1") (; ";")) (} "}"))) (expression_statement "uVar1 = *(ulong *)(param_1 + 0x10);" (assignment_expression "uVar1 = *(ulong *)(param_1 + 0x10)" (identifier "uVar1") (= "=") (pointer_expression "*(ulong *)(param_1 + 0x10)" (* "*") (cast_expression "(ulong *)(param_1 + 0x10)" (( "(") (type_descriptor "ulong *" (type_identifier "ulong") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(param_1 + 0x10)" (( "(") (binary_expression "param_1 + 0x10" (identifier "param_1") (+ "+") (number_literal "0x10")) () ")"))))) (; ";")) (if_statement "if ((uVar1 & 2) != 0) {\n      lVar4 = (long)uVar1 >> 8;\n      if ((uVar1 & 1) != 0) {\n        if (param_2 == -3) goto LAB_0031ada3;\n        lVar4 = *(long *)(*param_3 + lVar4);\n      }\n      uVar2 = (**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5);\n      if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }\n    }" (if "if") (parenthesized_expression "((uVar1 & 2) != 0)" (( "(") (binary_expression "(uVar1 & 2) != 0" (parenthesized_expression "(uVar1 & 2)" (( "(") (binary_expression "uVar1 & 2" (identifier "uVar1") (& "&") (number_literal "2")) () ")")) (!= "!=") (number_literal "0")) () ")")) (compound_statement "{\n      lVar4 = (long)uVar1 >> 8;\n      if ((uVar1 & 1) != 0) {\n        if (param_2 == -3) goto LAB_0031ada3;\n        lVar4 = *(long *)(*param_3 + lVar4);\n      }\n      uVar2 = (**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5);\n      if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }\n    }" ({ "{") (expression_statement "lVar4 = (long)uVar1 >> 8;" (assignment_expression "lVar4 = (long)uVar1 >> 8" (identifier "lVar4") (= "=") (binary_expression "(long)uVar1 >> 8" (cast_expression "(long)uVar1" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "uVar1")) (>> ">>") (number_literal "8"))) (; ";")) (if_statement "if ((uVar1 & 1) != 0) {\n        if (param_2 == -3) goto LAB_0031ada3;\n        lVar4 = *(long *)(*param_3 + lVar4);\n      }" (if "if") (parenthesized_expression "((uVar1 & 1) != 0)" (( "(") (binary_expression "(uVar1 & 1) != 0" (parenthesized_expression "(uVar1 & 1)" (( "(") (binary_expression "uVar1 & 1" (identifier "uVar1") (& "&") (number_literal "1")) () ")")) (!= "!=") (number_literal "0")) () ")")) (compound_statement "{\n        if (param_2 == -3) goto LAB_0031ada3;\n        lVar4 = *(long *)(*param_3 + lVar4);\n      }" ({ "{") (if_statement "if (param_2 == -3) goto LAB_0031ada3;" (if "if") (parenthesized_expression "(param_2 == -3)" (( "(") (binary_expression "param_2 == -3" (identifier "param_2") (== "==") (number_literal "-3")) () ")")) (goto_statement "goto LAB_0031ada3;" (goto "goto") (statement_identifier "LAB_0031ada3") (; ";"))) (expression_statement "lVar4 = *(long *)(*param_3 + lVar4);" (assignment_expression "lVar4 = *(long *)(*param_3 + lVar4)" (identifier "lVar4") (= "=") (pointer_expression "*(long *)(*param_3 + lVar4)" (* "*") (cast_expression "(long *)(*param_3 + lVar4)" (( "(") (type_descriptor "long *" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(*param_3 + lVar4)" (( "(") (binary_expression "*param_3 + lVar4" (pointer_expression "*param_3" (* "*") (identifier "param_3")) (+ "+") (identifier "lVar4")) () ")"))))) (; ";")) (} "}"))) (expression_statement "uVar2 = (**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5);" (assignment_expression "uVar2 = (**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5)" (identifier "uVar2") (= "=") (call_expression "(**(code **)(**(long **)(param_1 + 8) + 0x40))\n                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5)" (parenthesized_expression "(**(code **)(**(long **)(param_1 + 8) + 0x40))" (( "(") (pointer_expression "**(code **)(**(long **)(param_1 + 8) + 0x40)" (* "*") (pointer_expression "*(code **)(**(long **)(param_1 + 8) + 0x40)" (* "*") (cast_expression "(code **)(**(long **)(param_1 + 8) + 0x40)" (( "(") (type_descriptor "code **" (type_identifier "code") (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (parenthesized_expression "(**(long **)(param_1 + 8) + 0x40)" (( "(") (binary_expression "**(long **)(param_1 + 8) + 0x40" (pointer_expression "**(long **)(param_1 + 8)" (* "*") (pointer_expression "*(long **)(param_1 + 8)" (* "*") (cast_expression "(long **)(param_1 + 8)" (( "(") (type_descriptor "long **" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (parenthesized_expression "(param_1 + 8)" (( "(") (binary_expression "param_1 + 8" (identifier "param_1") (+ "+") (number_literal "8")) () ")"))))) (+ "+") (number_literal "0x40")) () ")"))))) () ")")) (argument_list "(*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5)" (( "(") (pointer_expression "*(long **)(param_1 + 8)" (* "*") (cast_expression "(long **)(param_1 + 8)" (( "(") (type_descriptor "long **" (sized_type_specifier "long" (long "long")) (abstract_pointer_declarator "**" (* "*") (abstract_pointer_declarator "*" (* "*")))) () ")") (parenthesized_expression "(param_1 + 8)" (( "(") (binary_expression "param_1 + 8" (identifier "param_1") (+ "+") (number_literal "8")) () ")")))) (, ",") (identifier "param_2") (, ",") (binary_expression "lVar4 + (long)param_3" (identifier "lVar4") (+ "+") (cast_expression "(long)param_3" (( "(") (type_descriptor "long" (sized_type_specifier "long" (long "long"))) () ")") (identifier "param_3"))) (, ",") (identifier "param_4") (, ",") (identifier "param_5") () ")")))) (; ";")) (if_statement "if (3 < (int)uVar2) {\n        return uVar2 | (uint)uVar1 & 1;\n      }" (if "if") (parenthesized_expression "(3 < (int)uVar2)" (( "(") (binary_expression "3 < (int)uVar2" (number_literal "3") (< "<") (cast_expression "(int)uVar2" (( "(") (type_descriptor "int" (primitive_type "int")) () ")") (identifier "uVar2"))) () ")")) (compound_statement "{\n        return uVar2 | (uint)uVar1 & 1;\n      }" ({ "{") (return_statement "return uVar2 | (uint)uVar1 & 1;" (return "return") (binary_expression "uVar2 | (uint)uVar1 & 1" (identifier "uVar2") (| "|") (binary_expression "(uint)uVar1 & 1" (cast_expression "(uint)uVar1" (( "(") (type_descriptor "uint" (type_identifier "uint")) () ")") (identifier "uVar1")) (& "&") (number_literal "1"))) (; ";")) (} "}"))) (} "}"))) (labeled_statement "LAB_0031ada3:\n    uVar5 = uVar5 - 1;" (statement_identifier "LAB_0031ada3") (: ":") (expression_statement "uVar5 = uVar5 - 1;" (assignment_expression "uVar5 = uVar5 - 1" (identifier "uVar5") (= "=") (binary_expression "uVar5 - 1" (identifier "uVar5") (- "-") (number_literal "1"))) (; ";"))) (expression_statement "param_1 = param_1 + -0x10;" (assignment_expression "param_1 = param_1 + -0x10" (identifier "param_1") (= "=") (binary_expression "param_1 + -0x10" (identifier "param_1") (+ "+") (number_literal "-0x10"))) (; ";")) (} "}")) (while "while") (parenthesized_expression "( true )" (( "(") (true "true") () ")")) (; ";")) (} "}")))

/* __cxxabiv1::__vmi_class_type_info::__do_find_public_src(long, void const*,
   __cxxabiv1::__class_type_info const*, void const*) const */

type_1 __thiscall
__cxxabiv1::type_2::function_1
          (type_2 *var_3,long var_11,void *var_1,type_3 *var_5,
          void *var_2)

{
  type_4 var_10;
  char *var_4;
  type_1 var_13;
  int var_7;
  long var_12;
  type_2 *var_9;
  type_4 var_8;
  
  if (var_1 == var_2) {
    var_4 = *(char **)(var_3 + 8);
    if (var_4 == *(char **)(var_5 + 8)) {
      return 6;
    }
    if ((*var_4 != '*') && (var_7 = var_6(var_4,*(char **)(var_5 + 8)), var_7 == 0)) {
      return 6;
    }
  }
  var_8 = (type_4)*(type_1 *)(var_3 + 0x14);
  var_9 = var_3 + var_8 * 0x10;
  do {
    if (var_8 == 0) {
      return 1;
    }
    var_10 = *(type_4 *)(var_9 + 0x10);
    if ((var_10 & 2) != 0) {
      var_12 = (long)var_10 >> 8;
      if ((var_10 & 1) != 0) {
        if (var_11 == -3) goto LAB_0031ada3;
                    /* WARNING: Load size is inaccurate */
        var_12 = *(long *)(*var_1 + var_12);
      }
      var_13 = (**(type_5 **)(**(long **)(var_9 + 8) + 0x40))
                        (*(long **)(var_9 + 8),var_11,var_12 + (long)var_1,var_5,var_2);
      if (3 < (int)var_13) {
        return var_13 | (type_1)var_10 & 1;
      }
    }
LAB_0031ada3:
    var_8 = var_8 - 1;
    var_9 = var_9 + -0x10;
  } while( true );
}


(translation_unit (function_definition type: (type_identifier) declarator: (function_declarator declarator: (identifier) parameters: (parameter_list (parameter_declaration type: (sized_type_specifier) declarator: (identifier)) (parameter_declaration type: (sized_type_specifier) declarator: (identifier)) (parameter_declaration type: (sized_type_specifier) declarator: (pointer_declarator declarator: (identifier))) (parameter_declaration type: (sized_type_specifier) declarator: (identifier)) (parameter_declaration type: (sized_type_specifier) declarator: (pointer_declarator declarator: (identifier))))) body: (compound_statement (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (primitive_type) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (sized_type_specifier) declarator: (identifier)) (declaration type: (type_identifier) declarator: (identifier)) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (identifier))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator declarator: (abstract_pointer_declarator))) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (pointer_expression argument: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator declarator: (abstract_pointer_declarator))) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))))) consequence: (compound_statement (return_statement (number_literal)))) (if_statement condition: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (pointer_expression argument: (identifier)) right: (char_literal (character)))) right: (parenthesized_expression (comma_expression left: (assignment_expression left: (identifier) right: (call_expression function: (identifier) arguments: (argument_list (identifier) (pointer_expression argument: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator declarator: (abstract_pointer_declarator))) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal)))))))) right: (binary_expression left: (identifier) right: (number_literal)))))) consequence: (compound_statement (return_statement (number_literal)))))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (parenthesized_expression (identifier)) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal))))) (do_statement body: (compound_statement (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (compound_statement (return_statement (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))))) (if_statement condition: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) right: (number_literal))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (cast_expression type: (type_descriptor type: (sized_type_specifier)) value: (identifier)) right: (number_literal)))) (if_statement condition: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) right: (number_literal))) consequence: (compound_statement (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (goto_statement label: (statement_identifier))) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (cast_expression type: (type_descriptor type: (sized_type_specifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (pointer_expression argument: (identifier)) right: (identifier))))))))) (expression_statement (assignment_expression left: (identifier) right: (call_expression function: (parenthesized_expression (pointer_expression argument: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator declarator: (abstract_pointer_declarator))) value: (parenthesized_expression (binary_expression left: (pointer_expression argument: (pointer_expression argument: (cast_expression type: (type_descriptor type: (sized_type_specifier) declarator: (abstract_pointer_declarator declarator: (abstract_pointer_declarator))) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal)))))) right: (number_literal))))))) arguments: (argument_list (pointer_expression argument: (cast_expression type: (type_descriptor type: (sized_type_specifier) declarator: (abstract_pointer_declarator declarator: (abstract_pointer_declarator))) value: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) (identifier) (binary_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (sized_type_specifier)) value: (identifier))) (identifier) (identifier))))) (if_statement condition: (parenthesized_expression (binary_expression left: (number_literal) right: (cast_expression type: (type_descriptor type: (primitive_type)) value: (identifier)))) consequence: (compound_statement (return_statement (binary_expression left: (identifier) right: (binary_expression left: (cast_expression type: (type_descriptor type: (type_identifier)) value: (identifier)) right: (number_literal)))))))) (labeled_statement label: (statement_identifier) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal))))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal))))) condition: (parenthesized_expression (true))))))

uint MASKED(long param_1,long param_2,long *param_3,long param_4,long *param_5)

{
  ulong uVar1;
  char *__s1;
  uint uVar2;
  int iVar3;
  long lVar4;
  ulong uVar5;
  
  if (param_3 == param_5) {
    __s1 = *(char **)(param_1 + 8);
    if (__s1 == *(char **)(param_4 + 8)) {
      return 6;
    }
    if ((*__s1 != '*') && (iVar3 = strcmp(__s1,*(char **)(param_4 + 8)), iVar3 == 0)) {
      return 6;
    }
  }
  uVar5 = (ulong)*(uint *)(param_1 + 0x14);
  param_1 = param_1 + uVar5 * 0x10;
  do {
    if (uVar5 == 0) {
      return 1;
    }
    uVar1 = *(ulong *)(param_1 + 0x10);
    if ((uVar1 & 2) != 0) {
      lVar4 = (long)uVar1 >> 8;
      if ((uVar1 & 1) != 0) {
        if (param_2 == -3) goto LAB_0031ada3;
        lVar4 = *(long *)(*param_3 + lVar4);
      }
      uVar2 = (**(code **)(**(long **)(param_1 + 8) + 0x40))
                        (*(long **)(param_1 + 8),param_2,lVar4 + (long)param_3,param_4,param_5);
      if (3 < (int)uVar2) {
        return uVar2 | (uint)uVar1 & 1;
      }
    }
LAB_0031ada3:
    uVar5 = uVar5 - 1;
    param_1 = param_1 + -0x10;
  } while( true );
}

