Sign in to follow this  
Followers 0
Suspense

New Warden Module

19 posts in this topic

Heres the new Warden Module that triggered tripwire and seems to have buddyteam scared

 

Please login or register to see this link.

1 person likes this

Share this post


Link to post
Share on other sites

I suppose you know what it is/what it does? x3

Share this post


Link to post
Share on other sites

This module came to the knowledge of the botting community today/yesterday for what I know, i don't think anyone has reversed it yet.
 

Anyway i think the community would appreciate greatly anyone who does revert and anyone with knowledge on what each values refer to, i think this second part will come from bot/cheat builders and LUA scripters.
After that, we can all discuss whatever it does and what can be done to counter it; Hopefully having the "cracked code" will bring ppl with interest and skills to the community.

Share this post


Link to post
Share on other sites

"cracked code" - that's probably not going to happen. This isn't going to just deobfuscate into a neat little script, it's going to be very hard to understand either way.

1 person likes this

Share this post


Link to post
Share on other sites

Seems like no one willing to try and reverse this =/ sad

Are you giving this a shot while typing or just being entitled?  ;)

Share this post


Link to post
Share on other sites

Heres the new Warden Module that triggered tripwire and seems to have buddyteam scared

 

Please login or register to see this link.

 

What can i do with this and in withch folder i have put it inside ?

Share this post


Link to post
Share on other sites

What can i do with this and in withch folder i have put it inside ?

:facepalm:

3 people like this

Share this post


Link to post
Share on other sites

:facepalm:

 

Don't troll me, help me or shut up ! ... 

Share this post


Link to post
Share on other sites

Don't troll me, help me or shut up ! ... 

:headbang:

3 people like this

Share this post


Link to post
Share on other sites

"cracked code" - that's probably not going to happen. This isn't going to just deobfuscate into a neat little script, it's going to be very hard to understand either way.

 

ever heard of syncosoft or team AiR ?

Share this post


Link to post
Share on other sites

:headbang:

totally made my day.... totalliy.. for the second time now.  its official - best forum... ever!

Share this post


Link to post
Share on other sites

"what do I do with it"

 

If you don't know, you can't do shit with it.

 

:)

Share this post


Link to post
Share on other sites

If you really don't know what to do with that .bin file, here's a path to start...

Next step is to hook the warden to know what value are pushed into those functions and figure out what exact arythmetic it performs on them to get a result.

	/* This file has been generated by the Hex-Rays decompiler.
   Copyright (c) 2007-2011 Hex-Rays <[email protected]>
	   Detected compiler: Unknown
*/
	#include <defs.h>
//-------------------------------------------------------------------------
// Data declarations
//-------------------------------------------------------------------------
// Function declarations
	int __fastcall sub_109F(int a1, int a2, int a3, int a4);
unsigned int __fastcall sub_1120(int a1, int a2, int a3, int a4, unsigned int a5);
void __cdecl sub_11B0();
char __fastcall sub_11F0(int a1, int a2, int a3, int a4, int a5);
void *__fastcall sub_12D0(int a1, int a2, void *a3, const void *a4);
char __fastcall sub_1346(int a1, int a2, int a3, int a4, unsigned int a5);
int __fastcall sub_13F0(int a1, int a2, int a3, int a4);
char __fastcall sub_1444(int a1, int a2, int a3, int a4, unsigned int a5);
unsigned int __cdecl sub_1540(int a1);
char __fastcall sub_1570(int a1, int a2, int a3, int *a4, int a5);
bool __cdecl sub_1AB0(int a1);
unsigned int __fastcall sub_1CB0(int a1, int a2, int a3, int a4);
signed int __fastcall sub_1CED(int a1, int a2, int a3, int a4, int a5);
void __fastcall sub_1EF0(int a1, int a2, int a3);
int __fastcall sub_1F1B(int a1, int a2, int a3, unsigned int a4, unsigned int a5);
void __fastcall sub_1FB4(int a1, int a2, int a3);
int __cdecl sub_2210(int a1, unsigned int a2);
signed int __stdcall sub_22A0(int a1, int a2, int a3);
int __fastcall sub_22C7(int a1, int a2, int a3);
int __fastcall sub_2E90(int a1, int a2, int a3, int a4, unsigned int a5);
int __fastcall sub_3170(int a1, int a2, int a3, int a4);
void __fastcall sub_3210(int a1, int a2, int a3);
int __fastcall sub_3387(int a1, int a2, int a3, int a4);
__int16 __fastcall sub_33C0(int a1, int a2, int a3, int a4);
int __cdecl sub_3610(int a1);
char __fastcall sub_3810(int a1, int a2, int a3, unsigned int a4);
int (*__cdecl sub_3840())(void);
signed int __fastcall sub_3890(int a1, int a2, int a3, int a4, int a5);
int __fastcall sub_3A00(int a1, int a2, int a3, int a4);
int __fastcall sub_3CA0(int a1, int a2, int a3);
int __fastcall sub_3D00(int a1, int a2, int a3, unsigned int *a4, int a5);
void __fastcall sub_3DA5(int a1, int a2, int a3);
int __fastcall sub_3E40(int a1, int a2, int a3, int a4, int a5, int a6, int a7);
int __fastcall sub_4CF6(int a1, int a2, int a3, const void *a4, int a5, int a6);
char __fastcall sub_4F41(int a1, int a2, int a3);
int __fastcall sub_51C5(int a1, int a2, int a3, int a4, int a5, int a6, int a7);
int __fastcall sub_51F2(int a1, int a2, int a3, int a4, unsigned int a5);
int __fastcall sub_5210(int a1, int a2, int a3, int a4, int a5, int a6, int a7);
int __fastcall sub_524A(int a1, int a2, int a3, int a4);
// int __usercall sub_5270<eax>(char _CF<cf>, char _ZF<zf>, char _SF<sf>, char _OF<of>, int a5<eax>, int a6<edx>, int a7<ecx>, int a8<ebx>, int a9<edi>, int a10<esi>, char a11);
signed int __stdcall sub_5460(int a1, int a2, int a3);
int __cdecl sub_5510(unsigned int a1, unsigned int a2);
unsigned int __fastcall sub_5540(int a1, int a2, int a3, unsigned int a4);
// int __usercall sub_5580<eax>(int a1<eax>, int a2<edx>, int a3<ecx>, int a4<ebx>, int a5<edi>, int a6<esi>, char a7);
void *__cdecl sub_5704(void *a1, unsigned __int8 a2, unsigned int a3);
int __fastcall sub_5730(int a1, int a2, int a3, int a4);
int __fastcall sub_57D0(int a1, int a2, int a3, int a4, unsigned int a5);
char __fastcall sub_583F(int a1, int a2, int a3, int a4, unsigned int a5);
unsigned int __fastcall sub_58A1(int a1, int a2, int a3, unsigned int a4, unsigned int a5);
char __fastcall sub_58E8(int a1, int a2, int a3);
void __cdecl sub_595D(int a1, int a2, int a3);
int __fastcall sub_5990(int a1, int a2, int a3);
signed int __cdecl sub_59F0(int a1);
int __fastcall sub_5A70(int a1, int a2, int a3);
int __fastcall sub_5A9C(int a1, int a2, int a3);
unsigned int __fastcall sub_5F00(int a1, int a2, int a3, int a4);
int __cdecl sub_5F90(int a1, int a2);
char __fastcall sub_5FA0(int a1, int a2, int a3, int a4);
int __fastcall sub_60F0(int a1, int a2, int a3, char a4);
int __fastcall sub_6D70(int a1, int a2, int a3, int a4);
// int __usercall sub_6E00<eax>(int a1<esi>);
char __fastcall sub_6EA9(int a1, int a2, int a3, int a4);
char __fastcall sub_6ECA(int a1, int a2, int a3, int a4, int a5);
char __fastcall sub_6F20(int a1, int a2, int a3, unsigned int a4);
char __fastcall sub_6F50(int a1, int (__cdecl *a2)(_DWORD), int a3, int a4, int a5);
char __fastcall sub_6FE0(int a1, int a2, int a3, int a4);
signed int __fastcall sub_70C0(int a1, int a2, int a3, int a4, int a5);
void __cdecl sub_7340(unsigned int a1, unsigned int a2);
char __fastcall sub_7363(int a1, int a2, int a3);
int __fastcall sub_74A0(int a1, unsigned int *a2, int a3);
unsigned int __fastcall sub_7AA0(int a1, int a2, int a3);
int __fastcall sub_7B60(int a1, int a2, int a3, int a4);
char __fastcall sub_7BC2(int a1, int a2, int a3);
char __fastcall sub_7C0D(int a1, int a2, int a3, int a4, int a5, int a6);
// void __usercall sub_7E52(int a1<eax>, int a2<esi>);
//----- (0000109F) --------------------------------------------------------
int __fastcall sub_109F(int a1, int a2, int a3, int a4)
{
  int v4; // edi@1
  int v5; // esi@1
  int v6; // edx@1
  int v7; // edx@1
  int result; // eax@1
  signed int v9; // esi@1
  unsigned int v10; // ecx@2
  signed int v11; // edx@2
  char v12; // [sp+8h] [bp-Ch]@1
  unsigned int v13; // [sp+10h] [bp-4h]@1
  int v14; // [sp+14h] [bp+0h]@1
	  v13 = (unsigned int)&v14 ^ v3EDA03C;
  v4 = a4;
  v5 = a3;
  sub_58A1((unsigned int)&v14 ^ v3EDA03C, a2, (int)&v12, *(_DWORD *)a3, *(_DWORD *)(a3 + 4));
  sub_1346(*(_DWORD *)v5 >> 3, v6, v5, 65900752, ((-9 - (unsigned __int8)(*(_DWORD *)v5 >> 3)) & 0x3F) + 1);
  sub_1346((int)&v12, v7, v5, (int)&v12, 8u);
  result = v5 + 8;
  v9 = 5;
  do
  {
    v10 = *(_DWORD *)result;
    v11 = 3;
    do
    {
      *(_BYTE *)(v4 + v11) = v10;
      v10 >>= 8;
      --v11;
    }
    while ( v11 >= 0 );
    result += 4;
    v4 += 4;
    --v9;
  }
  while ( v9 );
  return result;
}
	//----- (00001120) --------------------------------------------------------
unsigned int __fastcall sub_1120(int a1, int a2, int a3, int a4, unsigned int a5)
{
  unsigned int v5; // edx@1
  unsigned int v6; // eax@1
  unsigned __int8 v7; // bl@3
  unsigned int v8; // esi@3
  int v9; // edi@4
  char v10; // dl@4
  int v11; // eax@4
  char v12; // ST0F_1@4
  unsigned int result; // eax@4
	  LOBYTE(v5) = 0;
  v6 = 0;
  do
  {
    *(_BYTE *)(v6 + a3) = v6;
    ++v6;
  }
  while ( v6 < 0x100 );
  v7 = 0;
  *(_BYTE *)(a3 + 256) = 0;
  *(_BYTE *)(a3 + 257) = 0;
  v8 = 0;
  do
  {
    v9 = (unsigned __int8)v5;
    v10 = *(_BYTE *)(v8++ + a3) + *(_BYTE *)((unsigned __int8)v5 + a4);
    v7 += v10;
    v11 = a3 + v7;
    v12 = *(_BYTE *)(v8 + a3 - 1);
    *(_BYTE *)(v8 + a3 - 1) = *(_BYTE *)v11;
    *(_BYTE *)v11 = v12;
    result = (v9 + 1) / a5;
    v5 = (v9 + 1) % a5;
  }
  while ( v8 < 0x100 );
  return result;
}
	//----- (000011B0) --------------------------------------------------------
void __cdecl sub_11B0()
{
  v3EDA44C = 0;
}
	//----- (000011F0) --------------------------------------------------------
char __fastcall sub_11F0(int a1, int a2, int a3, int a4, int a5)
{
  char result; // al@2
  void (__stdcall *v6)(_DWORD, _DWORD); // esi@4
  int v7; // eax@4
  int v8; // edx@4
  int v9; // edi@4
  int v10; // [sp+8h] [bp-50h]@3
  int v11; // [sp+Ch] [bp-4Ch]@3
  char v12; // [sp+10h] [bp-48h]@3
  int v13; // [sp+50h] [bp-8h]@1
  int v14; // [sp+54h] [bp-4h]@1
	  v14 = a2;
  v13 = a3;
  if ( v3EDA090 )
  {
    v10 = v3ED900C(v3EDA038);
    v11 = a5;
    if ( v849E(&v12, 0) )
    {
      result = 0;
    }
    else
    {
      v6 = v3ED9010;
      v7 = v3ED9010(v3EDA038, &v10);
      v9 = ((int (__fastcall *)(int, int, int))v14)(v7, v8, a4);
      v6(v3EDA038, v10);
      *(_DWORD *)v13 = v9;
      result = 1;
    }
  }
  else
  {
    result = sub_6F50(a4, (int (__cdecl *)(_DWORD))a2, a3, a4, a5);
  }
  return result;
}
// 3ED900C: using guessed type int (__stdcall *)(_DWORD);
// 3ED9010: using guessed type int (__stdcall *)(_DWORD, _DWORD);
	//----- (000012D0) --------------------------------------------------------
void *__fastcall sub_12D0(int a1, int a2, void *a3, const void *a4)
{
  void *result; // eax@1
	  result = a3;
  memcpy(a3, a4, 0x102u);
  return result;
}
	//----- (00001346) --------------------------------------------------------
char __fastcall sub_1346(int a1, int a2, int a3, int a4, unsigned int a5)
{
  int v5; // edi@1
  int v6; // ebx@1
  unsigned __int8 v7; // cf@1
  int v8; // eax@2
	  v5 = a3;
  v6 = (*(_DWORD *)a3 >> 3) & 0x3F;
  v7 = __CFADD__(8 * a5, *(_DWORD *)a3);
  *(_DWORD *)v5 += 8 * a5;
  *(_DWORD *)(v5 + 4) += v7;
  if ( v6 )
  {
    a5 += v6;
    v8 = a4 - v6;
    a4 -= v6;
    if ( a5 >= 0x40 )
    {
      while ( (unsigned int)v6 < 0x40 )
      {
        *(_BYTE *)(a3 + v6 + 28) = *(_BYTE *)(v6 + v8);
        ++v6;
      }
      sub_7E52(a3 + 28, a3 + 8);
    }
  }
  else
  {
    LOBYTE(v8) = a5;
    if ( a5 >= 0x40 )
      sub_7E52(a4, a3 + 8);
  }
  while ( v6 < a5 )
  {
    LOBYTE(v8) = *(_BYTE *)(v6 + a4);
    *(_BYTE *)(a3 + v6++ + 28) = v8;
  }
  return v8;
}
	//----- (000013F0) --------------------------------------------------------
int __fastcall sub_13F0(int a1, int a2, int a3, int a4)
{
  int i; // edi@1
  int v5; // eax@2
  char v6; // dl@2
  int v7; // esi@2
  int v8; // eax@2
  char v9; // bl@2
  int result; // eax@2
	  for ( i = a4; i; *(_BYTE *)result = v6 )
  {
    ++*(_BYTE *)(a3 + 256);
    v5 = *(_BYTE *)(a3 + 256);
    *(_BYTE *)(a3 + 257) += *(_BYTE *)(v5 + a3);
    v6 = *(_BYTE *)(v5 + a3);
    v7 = v5 + a3;
    v8 = *(_BYTE *)(a3 + 257);
    v9 = *(_BYTE *)(v8 + a3);
    result = a3 + v8;
    --i;
    *(_BYTE *)v7 = v9;
  }
  return result;
}
	//----- (00001444) --------------------------------------------------------
char __fastcall sub_1444(int a1, int a2, int a3, int a4, unsigned int a5)
{
  unsigned int v5; // edi@1
  int v6; // esi@1
  int v7; // eax@1
  char v8; // bl@4
	  v5 = a5;
  v6 = a3;
  LOBYTE(v7) = sub_3810(a1, a2, a3, a5);
  if ( (_BYTE)v7 && a5 )
  {
    v7 = a4;
    do
    {
      v8 = *(_BYTE *)v7;
      --v5;
      ++v7;
      *(_BYTE *)((*(_DWORD *)(v6 + 8))++ + *(_DWORD *)v6) = v8;
    }
    while ( v5 );
  }
  return v7;
}
	//----- (00001540) --------------------------------------------------------
unsigned int __cdecl sub_1540(int a1)
{
  unsigned int result; // eax@1
	  result = sub_2210(65863680, a1 - 65863680);
  if ( result )
    result = ~(unsigned __int8)(*(_DWORD *)(result + 36) >> 31) & 1;
  return result;
}
	//----- (00001570) --------------------------------------------------------
char __fastcall sub_1570(int a1, int a2, int a3, int *a4, int a5)
{
  int v5; // edi@1
  int v6; // ebx@1
  int v7; // eax@1
  int v8; // edx@1
  int *v9; // ecx@2
  int v10; // esi@2
  int v11; // eax@4
  int v12; // edx@4
	  v5 = a3;
  v6 = a3 + 96;
  sub_5704((void *)(a3 + 96), 0x36u, 0x40u);
  v7 = (int)sub_5704((void *)(v5 + 160), 0x5Cu, 0x40u);
  v8 = a5;
  if ( a5 )
  {
    v9 = a4;
    v7 = v5 + 160;
    v10 = a5;
    do
    {
      *(_BYTE *)(v7 - 64) ^= *(_BYTE *)v9;
      v8 = *(_BYTE *)v9;
      *(_BYTE *)v7 ^= v8;
      v9 = (int *)((char *)v9 + 1);
      ++v7;
      --v10;
    }
    while ( v10 );
  }
  sub_1EF0(v7, v8, v5);
  return sub_1346(v11, v12, v5, v6, 0x40u);
}
	//----- (00001AB0) --------------------------------------------------------
bool __cdecl sub_1AB0(int a1)
{
  bool result; // eax@2
  int v2; // eax@3
	  if ( *(_WORD *)a1 != 23117 || (v2 = a1 + *(_DWORD *)(a1 + 60), *(_DWORD *)v2 != 17744) )
    result = 0;
  else
    result = *(_WORD *)(v2 + 24) == 267;
  return result;
}
	//----- (00001CB0) --------------------------------------------------------
unsigned int __fastcall sub_1CB0(int a1, int a2, int a3, int a4)
{
  unsigned int result; // eax@1
  unsigned int v5; // edx@1
	  *(_DWORD *)a4 = 0;
  result = *(_DWORD *)(a3 + 8);
  v5 = *(_DWORD *)(a3 + 4);
  if ( result <= v5 && v5 - result >= 4 )
  {
    result = *(_DWORD *)(result + *(_DWORD *)a3);
    *(_DWORD *)a4 = result;
    *(_DWORD *)(a3 + 8) += 4;
  }
  else
  {
    *(_DWORD *)(a3 + 8) = v5 + 1;
  }
  return result;
}
	//----- (00001CED) --------------------------------------------------------
signed int __fastcall sub_1CED(int a1, int a2, int a3, int a4, int a5)
{
  int v5; // esi@1
  int v6; // edx@1
  signed int result; // eax@2
  int v8; // edx@6
  int v9; // edx@9
  int v10; // eax@13
  int v11; // ST04_4@13
  int v12; // edx@13
  int v13; // eax@13
  int v14; // ST04_4@13
  int v15; // edx@13
  int v16; // eax@13
  int v17; // ST04_4@13
  int v18; // edx@13
  int v19; // edx@14
  int v20; // eax@16
  int v21; // ST04_4@16
  int v22; // edx@16
  int v23; // eax@16
  int v24; // ST04_4@16
  int v25; // edx@16
  int v26; // eax@16
  int v27; // ST04_4@16
  int v28; // edx@16
  int v29; // [sp+Ch] [bp-11Ch]@6
  int v30; // [sp+10h] [bp-118h]@9
  int v31; // [sp+14h] [bp-114h]@9
  int v32; // [sp+18h] [bp-110h]@9
  int v33; // [sp+1Ch] [bp-10Ch]@9
  unsigned __int8 v34; // [sp+23h] [bp-105h]@1
  char v35; // [sp+24h] [bp-104h]@5
  unsigned int v36; // [sp+124h] [bp-4h]@1
  int v37; // [sp+128h] [bp+0h]@1
	  v36 = (unsigned int)&v37 ^ v3EDA03C;
  v5 = a3;
  sub_6FE0((int)&v34, a2, a5, (int)&v34);
  if ( *(_DWORD *)(a5 + 8) > *(_DWORD *)(a5 + 4) )
    return 2;
  if ( !v34 )
    goto LABEL_4;
  sub_2E90((int)&v35, v6, a5, (int)&v35, 0x100u);
  if ( *(_DWORD *)(a5 + 8) > *(_DWORD *)(a5 + 4) )
    return 2;
  v29 = (*(int (__fastcall **)(_DWORD, char *, int, int))(*(_DWORD *)a4 + 4))(
          *(_DWORD *)a4,
          &v35,
          a4,
          v35 != 0 ? (int)&v35 : 0);
  if ( v34 != 1 )
  {
    if ( v34 != 2 )
    {
      result = 3;
LABEL_12:
      *(_DWORD *)(v5 + 32) = 0;
      *(_BYTE *)(v5 + 36) = 0;
      return result;
    }
    sub_1CB0((int)&v30, v8, a5, (int)&v30);
    sub_1CB0((int)&v33, v9, a5, (int)&v33);
    sub_1CB0((int)&v32, v9, a5, (int)&v32);
    sub_1CB0((int)&v31, v9, a5, (int)&v31);
    if ( *(_DWORD *)(a5 + 8) <= *(_DWORD *)(a5 + 4) )
    {
      if ( !v29 )
      {
        result = 0;
        goto LABEL_12;
      }
      v10 = (*(int (__fastcall **)(_DWORD, int, int, int, int))(*(_DWORD *)a4 + 8))(*(_DWORD *)a4, v9, a4, v29, v30);
      v11 = v33;
      *(_DWORD *)(v5 + 16) = v10;
      v13 = (*(int (__fastcall **)(_DWORD, int, int, int, int))(*(_DWORD *)a4 + 8))(*(_DWORD *)a4, v12, a4, v29, v11);
      v14 = v32;
      *(_DWORD *)(v5 + 20) = v13;
      v16 = (*(int (__fastcall **)(_DWORD, int, int, int, int))(*(_DWORD *)a4 + 8))(*(_DWORD *)a4, v15, a4, v29, v14);
      v17 = v31;
      *(_DWORD *)(v5 + 24) = v16;
      *(_DWORD *)(v5 + 28) = (*(int (__fastcall **)(_DWORD, int, _DWORD, _DWORD, _DWORD))(*(_DWORD *)a4 + 8))(
                               *(_DWORD *)a4,
                               v18,
                               a4,
                               v29,
                               v17);
      *(_DWORD *)(v5 + 32) = 2;
LABEL_17:
      *(_BYTE *)(v5 + 36) = 1;
      return 0;
    }
    return 2;
  }
  sub_1CB0((int)&v31, v8, a5, (int)&v31);
  sub_1CB0((int)&v32, v19, a5, (int)&v32);
  sub_1CB0((int)&v33, v19, a5, (int)&v33);
  sub_1CB0((int)&v30, v19, a5, (int)&v30);
  if ( *(_DWORD *)(a5 + 8) > *(_DWORD *)(a5 + 4) )
    return 2;
  if ( v29 )
  {
    v20 = (*(int (__fastcall **)(_DWORD, int, int, int, int))(*(_DWORD *)a4 + 8))(*(_DWORD *)a4, v19, a4, v29, v31);
    v21 = v32;
    *(_DWORD *)v5 = v20;
    v23 = (*(int (__fastcall **)(_DWORD, int, _DWORD, _DWORD, _DWORD))(*(_DWORD *)a4 + 8))(
            *(_DWORD *)a4,
            v22,
            a4,
            v29,
            v21);
    v24 = v33;
    *(_DWORD *)(v5 + 4) = v23;
    v26 = (*(int (__fastcall **)(_DWORD, int, _DWORD, _DWORD, _DWORD))(*(_DWORD *)a4 + 8))(
            *(_DWORD *)a4,
            v25,
            a4,
            v29,
            v24);
    v27 = v30;
    *(_DWORD *)(v5 + 8) = v26;
    *(_DWORD *)(v5 + 12) = (*(int (__fastcall **)(_DWORD, int, _DWORD, _DWORD, _DWORD))(*(_DWORD *)a4 + 8))(
                             *(_DWORD *)a4,
                             v28,
                             a4,
                             v29,
                             v27);
    *(_DWORD *)(v5 + 32) = 1;
    goto LABEL_17;
  }
LABEL_4:
  *(_DWORD *)(v5 + 32) = 0;
  *(_BYTE *)(v5 + 36) = 0;
  return 0;
}
	//----- (00001EF0) --------------------------------------------------------
void __fastcall sub_1EF0(int a1, int a2, int a3)
{
  *(_DWORD *)a3 = 0;
  *(_DWORD *)(a3 + 4) = 0;
  *(_DWORD *)(a3 + 8) = 1732584193;
  *(_DWORD *)(a3 + 12) = -271733879;
  *(_DWORD *)(a3 + 16) = -1732584194;
  *(_DWORD *)(a3 + 20) = 271733878;
  *(_DWORD *)(a3 + 24) = -1009589776;
}
	//----- (00001F1B) --------------------------------------------------------
int __fastcall sub_1F1B(int a1, int a2, int a3, unsigned int a4, unsigned int a5)
{
  __m64 v5; // ST00_8@1
  __m64 v6; // mm1@1
  int result; // eax@1
	  HIDWORD(v5.m64_u64) = *(_DWORD *)a3;
  LODWORD(v5.m64_u64) = *(_DWORD *)a2;
  v6 = _m_paddd(_m_pmaddwd(v5, (__m64)__PAIR__(a4, a5)), _m_pmullw(v5, (__m64)__PAIR__(a4, a5)));
  *(_DWORD *)a3 = _mm_cvtsi64_si32(v6);
  result = _mm_cvtsi64_si32(_m_psrlq(v6, 0x20u));
  *(_DWORD *)a2 = result;
  return result;
}
// 1F1B: could not find valid save-restore pair for ebp
	//----- (00001FB4) --------------------------------------------------------
void __fastcall sub_1FB4(int a1, int a2, int a3)
{
  *(_DWORD *)(a3 + 32) = 0;
  *(_BYTE *)(a3 + 36) = 0;
}
	//----- (00002210) --------------------------------------------------------
int __cdecl sub_2210(int a1, unsigned int a2)
{
  int v2; // ecx@1
  unsigned int v3; // esi@1
  unsigned int v4; // edx@1
  int result; // eax@1
  unsigned int v6; // ecx@2
	  v2 = a1 + *(_DWORD *)(a1 + 60);
  v3 = *(_WORD *)(v2 + 6);
  v4 = 0;
  result = *(_WORD *)(v2 + 20) + v2 + 24;
  if ( *(_WORD *)(v2 + 6) )
  {
    while ( 1 )
    {
      v6 = *(_DWORD *)(result + 12);
      if ( a2 >= v6 )
      {
        if ( a2 < v6 + *(_DWORD *)(result + 8) )
          break;
      }
      ++v4;
      result += 40;
      if ( v4 >= v3 )
        goto LABEL_5;
    }
  }
  else
  {
LABEL_5:
    result = 0;
  }
  return result;
}
	//----- (000022A0) --------------------------------------------------------
signed int __stdcall sub_22A0(int a1, int a2, int a3)
{
  if ( v3ED0000 == 23117 && a2 == 1 )
    v3ED9004(a1);
  return 1;
}
// 3ED9004: using guessed type int (__stdcall *)(_DWORD);
	//----- (000022C7) --------------------------------------------------------
int __fastcall sub_22C7(int a1, int a2, int a3)
{
  int v3; // esi@1
  int v4; // edi@1
  int v5; // eax@1
  int v6; // edx@1
  int v7; // ecx@1
  int v8; // ecx@1
  int v9; // edx@1
  int v10; // edx@1
  int v11; // edx@1
  int v12; // edi@1
  int v13; // edi@1
  int v14; // ecx@1
  int v15; // ecx@1
  int v16; // eax@1
  int v17; // ebx@1
  int v18; // eax@1
  signed __int32 v19; // eax@1
  int v22; // eax@1
  int v23; // eax@1
  int v24; // edi@1
  int v25; // ebx@1
  int v26; // ebx@1
  int v27; // eax@1
  int v28; // ecx@1
  int v29; // eax@1
  int v30; // edi@1
  int v31; // edx@1
  unsigned __int32 v32; // eax@1
  signed __int32 v33; // eax@1
  signed __int32 v35; // edx@1
  unsigned int v37; // ebx@1
  unsigned __int32 v38; // eax@1
  int v39; // edi@1
  int v40; // edi@1
  int v41; // eax@1
  int v42; // eax@1
  int v43; // eax@1
  int v44; // eax@1
  signed __int32 v45; // eax@1
  signed __int32 v47; // edx@1
  int v49; // ebx@1
  int v50; // edx@1
  int v51; // edx@1
  int v52; // ecx@1
  unsigned __int32 v53; // ecx@1
  int v54; // eax@1
  int v55; // eax@1
  int v56; // edi@1
  int v57; // edx@1
  unsigned __int32 v58; // edx@1
  int v59; // edi@1
  int v60; // edi@1
  int v61; // eax@1
  int v62; // eax@1
  signed __int32 v63; // edx@1
  int v64; // eax@1
  signed __int32 v65; // eax@1
  int v66; // ecx@1
  int v67; // ebx@1
  int v68; // ecx@1
  int v69; // ecx@1
  int v70; // ecx@1
  signed __int32 v73; // eax@1
  int v74; // ebx@1
  unsigned int v75; // edi@1
  int v76; // eax@1
  int v77; // eax@1
  unsigned __int32 v78; // eax@1
  int v79; // edi@1
  signed __int32 v80; // eax@1
  int v81; // ecx@1
  signed __int32 v83; // edx@1
  signed __int32 v85; // edx@1
  int v86; // ecx@1
  signed __int32 v87; // eax@1
  int v90; // edx@1
  signed __int32 v91; // edx@1
  int v92; // eax@1
  int v93; // eax@1
  signed __int32 v96; // edx@1
  int v97; // eax@1
  signed __int32 v98; // eax@1
  signed __int32 v101; // edx@1
  int v102; // eax@1
  int v103; // eax@1
  signed __int32 v106; // edx@1
  int v107; // eax@1
  int v108; // eax@1
  int v109; // eax@1
  signed __int32 v110; // eax@1
  signed __int32 v113; // eax@1
  int v114; // ebx@1
  int v115; // edi@1
  int v116; // eax@1
  int v117; // eax@1
  int v118; // eax@1
  int v119; // ecx@1
  int v120; // edx@1
  int v121; // ecx@1
  unsigned int v122; // ecx@1
  int v123; // edx@1
  int v124; // eax@1
  unsigned int v125; // edi@1
  int v126; // eax@1
  int v127; // ebx@1
  int v128; // eax@1
  int v129; // ebx@1
  int v130; // edi@1
  int v131; // edi@1
  int v132; // ecx@1
  int v133; // eax@1
  int v134; // edx@1
  int v135; // eax@1
  int v136; // ecx@1
  unsigned int v137; // ecx@1
  int v138; // eax@1
  int v139; // eax@1
  int v140; // edi@1
  unsigned __int32 v141; // edi@1
  signed __int32 v142; // edx@1
  int v143; // eax@1
  int v144; // eax@1
  signed __int32 v145; // eax@1
  int v148; // edi@1
  int v149; // edi@1
  int v150; // eax@1
  unsigned __int32 v151; // eax@1
  int v152; // ecx@1
  int v153; // ecx@1
  int v154; // edx@1
  int v155; // edx@1
  signed __int32 v156; // edx@1
  int v157; // eax@1
  signed __int32 v158; // eax@1
  signed __int32 v161; // eax@1
  int v162; // edi@1
  int v163; // eax@1
  int v164; // eax@1
  int v165; // eax@1
  signed __int32 v167; // edx@1
  signed __int32 v169; // edx@1
  signed __int32 v170; // eax@1
  int v171; // ecx@1
  int v174; // edi@1
  int v175; // edi@1
  int v176; // ecx@1
  int v177; // ebx@1
  int v178; // ebx@1
  int v179; // ecx@1
  int v180; // eax@1
  int v181; // eax@1
  int v182; // eax@1
  int v183; // ebx@1
  int v184; // ebx@1
  int v185; // ecx@1
  int v186; // ecx@1
  int v187; // edi@1
  int v188; // edx@1
  unsigned __int32 v189; // edx@1
  int v190; // edi@1
  int v191; // edi@1
  int v192; // eax@1
  int v193; // ecx@1
  int v194; // eax@1
  int v195; // ebx@1
  unsigned __int32 v196; // ebx@1
  int v197; // eax@1
  int v198; // eax@1
  int v199; // edx@1
  int v200; // ecx@1
  int v201; // edi@1
  unsigned __int32 v202; // edi@1
  int v203; // ecx@1
  unsigned __int32 v204; // ecx@1
  int v205; // edx@1
  int v206; // ebx@1
  int v207; // ebx@1
  int v208; // edx@1
  signed __int32 v209; // edx@1
  int v210; // edi@1
  unsigned __int32 v211; // edi@1
  int v212; // eax@1
  int v213; // ecx@1
  int v214; // ecx@1
  int v215; // eax@1
  int v216; // eax@1
  int v217; // eax@1
  int v218; // eax@1
  int v219; // eax@1
  int v222; // ecx@1
  int v223; // edx@1
  int v224; // eax@1
  int v225; // eax@1
  int v226; // edx@1
  int v227; // edx@1
  int v228; // ecx@1
  unsigned __int32 v229; // ecx@1
  int v230; // ecx@1
  signed __int32 v231; // eax@1
  int v232; // ecx@1
  signed __int32 v235; // edx@1
  signed __int32 v236; // eax@1
  int v237; // ecx@1
  signed __int32 v240; // edx@1
  int v241; // ecx@1
  int v244; // edx@1
  int v245; // ebx@1
  int v246; // ebx@1
  int v247; // ecx@1
  int v248; // ecx@1
  int v249; // eax@1
  int v250; // edi@1
  int v251; // edi@1
  int v252; // eax@1
  int v253; // eax@1
  int v254; // eax@1
  int v255; // ecx@1
  int v256; // ebx@1
  int v257; // ebx@1
  int v258; // eax@1
  int v259; // edx@1
  int v260; // eax@1
  int result; // eax@1
  unsigned int v262; // [sp+Ch] [bp-10h]@1
  unsigned int v263; // [sp+10h] [bp-Ch]@1
  signed __int32 v264; // [sp+14h] [bp-8h]@1
  signed __int32 v265; // [sp+18h] [bp-4h]@1
	  v3 = a3;
  v4 = *(_DWORD *)a3;
  v5 = __ROL__(*(_DWORD *)a3 + 1788801274, 20);
  v5 += 1307572625;
  v6 = __ROL__(*(_DWORD *)(a3 + 4) - v5 - 402749954, 23);
  v6 -= 1307572625;
  v7 = __ROL__(*(_DWORD *)(a3 + 8) - v6 + v5 - 1412288184, 20);
  v8 = v5 ^ v7;
  v265 = v6;
  v9 = __ROL__((v5 ^ v6 ^ v8) + *(_DWORD *)(v3 + 12) + 731755463, 17);
  v263 = _byteswap_ulong(v8) + v9;
  v10 = __ROL__(v8 + v263 + *(_DWORD *)(v3 + 12) - v265 + v5 + 426222069, 2);
  v11 = v8 ^ v10;
  v12 = __ROL__(v265 + v263 + v4 - v8 + v11 + 1050944700, 29);
  v13 = -v263 ^ v12;
  v14 = __ROL__(*(_DWORD *)(v3 + 12) + (v11 ^ v13 ^ v263) + v8 + 1350149820, 25);
  v15 = ~v13 ^ v14;
  v16 = __ROL__(*(_DWORD *)(v3 + 8) + (v11 & v13 ^ v15 & (v11 ^ v13)) + v263 - 1583002981, 13);
  v265 = v13;
  v263 = v16 - v15;
  v17 = *(_DWORD *)(v3 + 8) + (v13 & v15 ^ (v16 - v15) & (v13 ^ v15)) - v13;
  v264 = v15;
  v262 = v11 + v17 - 771404559;
  v18 = __ROL__(*(_DWORD *)(v3 + 4) + (v262 ^ (v15 | ~(v16 - v15))) + v13 + 326427415, 15);
  v19 = v18 - _byteswap_ulong(v15);
  v265 = v19;
  _EAX = _InterlockedExchange((signed __int32 *)&v263, v19);
  _EDX = _InterlockedExchange((signed __int32 *)&v262, v13);
  __asm { arpl    ax, dx }
  v22 = _InterlockedExchange((signed __int32 *)&v263, _EAX);
  _InterlockedExchange((signed __int32 *)&v262, _EDX);
  sub_1F1B(v22, (int)&v264, (int)&v265, v263, v262);
  v23 = __ROL__(*(_DWORD *)(v3 + 12) + (v262 ^ v265 & (v262 ^ v263)) + v264 - 201174377, 9);
  v24 = __ROL__(*(_DWORD *)v3 + ((v23 + v265 + 1) ^ v262 & (v265 ^ (v23 + v265 + 1))) + v263 + 1521245252, 13);
  v264 = v23 + v265 + 1;
  v263 = v24 - v262;
  v25 = __ROL__(*(_DWORD *)v3 + v8393(v24 - v262) + v262 + 1711369870, 16);
  v26 = ~v264 ^ v25;
  v27 = *(_DWORD *)(v3 + 12) + v8393(~v264, v26, v264);
  v28 = __ROL__(v27 + v265 + 456403427, 2);
  v265 = v264 + v28;
  v29 = v8393(v27, v26, v264 + v28);
  v30 = __ROL__(*(_DWORD *)(v3 + 12) + v29 + v264 + 803119615, 13);
  v264 = ~v265 ^ v30;
  v31 = __ROL__(*(_DWORD *)v3 + (v26 ^ v265 ^ v264) + v263 - 1226865879, 11);
  v32 = _byteswap_ulong(-v26);
  v263 = v32 + v31;
  v33 = v26 + *(_DWORD *)v3 + v8393(v32, v32 + v31, v264, v265) + ~v264 + 1746554013;
  v262 = v33;
  _EAX = _InterlockedExchange((signed __int32 *)&v263, v33);
  _EDX = _InterlockedExchange(&v265, v35);
  __asm { arpl    ax, dx }
  _InterlockedExchange((signed __int32 *)&v263, _EAX);
  _InterlockedExchange(&v265, _EDX);
  v37 = v262;
  v38 = _byteswap_ulong(-v263);
  v39 = __ROL__(*(_DWORD *)(v3 + 12) + (v262 ^ v264 ^ v263) + v265 + 805168589, 17);
  v40 = v39 - v38;
  v265 = v40;
  v41 = v8393(v38, v263, v262, v40);
  v42 = __ROL__(v41 + v264 + *(_DWORD *)(v3 + 4) - 43557586, 20);
  v43 = v42 - v37;
  v264 = v43;
  v44 = __ROL__(*(_DWORD *)v3 + (v40 ^ v37 & (v40 ^ v43)) + v263 + 826542159, 15);
  v45 = ~v37 + v44;
  v263 = v45;
  _EAX = _InterlockedExchange(&v264, v45);
  _EDX = _InterlockedExchange(&v265, v47);
  __asm { arpl    ax, dx }
  _InterlockedExchange(&v264, _EAX);
  _InterlockedExchange(&v265, _EDX);
  v49 = *(_DWORD *)v3;
  v50 = __ROL__(*(_DWORD *)v3 + (v265 & v264 ^ v263 & (v265 ^ v264)) + v262 - 740058111, 20);
  v51 = v50 + v263 + 1;
  v52 = __ROL__(*(_DWORD *)(v3 + 8) + (v263 ^ (v264 | ~v51)) + v265 - 1992235156, 24);
  v53 = v52 - _byteswap_ulong(~v264);
  v54 = __ROL__(*(_DWORD *)v3 + (v51 ^ v53 ^ v263) + v264 - 288212232, 22);
  v55 = v54 - v51;
  v56 = *(_DWORD *)(v3 + 4) + (v51 ^ (v55 | ~v53));
  v262 = v51;
  v265 = v53;
  v264 = v55;
  v57 = __ROL__(v56 + v263 - 1782283388, 26);
  v58 = _byteswap_ulong(~v55) ^ v57;
  v59 = __ROL__(*(_DWORD *)(v3 + 4) + (v53 ^ v55 ^ v58) + v262 - 1945646361, 30);
  v60 = v58 + v59;
  v263 = v58;
  v61 = v8393(v55, v58, v60, v55);
  v62 = __ROL__(v61 + v265 + *(_DWORD *)(v3 + 12) - 294194379, 25);
  v63 = v62 + v60 + 1;
  v64 = __ROL__(v264 + v263 + v49 - v63 + v60 + 383169415, 14);
  v65 = v64 - v60;
  v66 = __ROL__(v65 + v263 + *(_DWORD *)(v3 + 4) - v63 + v60 - 1274156547, 15);
  v263 = v66 + v60 + 1;
  v67 = *(_DWORD *)(v3 + 4) + (v263 ^ v65 & (v63 ^ v263));
  v264 = v65;
  v68 = __ROL__(v67 + v60 - 854093792, 5);
  v69 = v68 + v65 + 1;
  v262 = v69;
  v70 = __ROL__(*(_DWORD *)(v3 + 12) + (v263 ^ (v65 | ~v69)) + v63 - 465767766, 27);
  v265 = v65 + v70;
  _EAX = _InterlockedExchange((signed __int32 *)&v262, v65);
  _EDX = _InterlockedExchange((signed __int32 *)&v263, v63);
  __asm { arpl    ax, dx }
  v73 = _InterlockedExchange((signed __int32 *)&v262, _EAX);
  _InterlockedExchange((signed __int32 *)&v263, _EDX);
  v74 = v263;
  v75 = v262;
  v76 = v8393(v73, v262, v265, v263);
  v77 = __ROL__(v76 + v264 + *(_DWORD *)(v3 + 12) - 124346331, 9);
  v78 = _byteswap_ulong(-v265) ^ v77;
  v264 = v78;
  v79 = *(_DWORD *)v3 + (v265 ^ (v78 | ~v75));
  v80 = ~v78;
  v81 = __ROL__(v79 + v74 - 1862556212, 2);
  v263 = v80 ^ v81;
  _EAX = _InterlockedExchange((signed __int32 *)&v262, v80);
  _EDX = _InterlockedExchange(&v265, v83);
  __asm { arpl    ax, dx }
  _InterlockedExchange((signed __int32 *)&v262, _EAX);
  _InterlockedExchange(&v265, _EDX);
  v85 = v262;
  v86 = __ROL__(*(_DWORD *)v3 + (v265 ^ v264 ^ v263) + v262 - 590344321, 29);
  v87 = _byteswap_ulong(-v265);
  v262 = v86 - v87;
  _EAX = _InterlockedExchange(&v264, v87);
  _EDX = _InterlockedExchange((signed __int32 *)&v263, v85);
  __asm { arpl    ax, dx }
  _InterlockedExchange(&v264, _EAX);
  _InterlockedExchange((signed __int32 *)&v263, _EDX);
  v90 = __ROL__(*(_DWORD *)(v3 + 8) + (v262 ^ v264 ^ v263) + v265 + 2080986712, 16);
  v91 = v90 + v264 + 1;
  v265 = v91;
  v92 = __ROL__(*(_DWORD *)v3 + (v263 ^ (v91 | ~v262)) + v264 + 138246194, 7);
  v93 = v91 ^ v92;
  v264 = v93;
  _EAX = _InterlockedExchange((signed __int32 *)&v262, v93);
  _EDX = _InterlockedExchange((signed __int32 *)&v263, v91);
  __asm { arpl    ax, dx }
  _InterlockedExchange((signed __int32 *)&v262, _EAX);
  v96 = _InterlockedExchange((signed __int32 *)&v263, _EDX);
  v97 = __ROL__(v263 + (v264 ^ v265 & (v262 ^ v264)) + *(_DWORD *)(v3 + 4) - 25213308, 30);
  v98 = v265 + v97;
  v263 = v98;
  _EAX = _InterlockedExchange((signed __int32 *)&v262, v98);
  _EDX = _InterlockedExchange(&v264, v96);
  __asm { arpl    ax, dx }
  _InterlockedExchange((signed __int32 *)&v262, _EAX);
  v101 = _InterlockedExchange(&v264, _EDX);
  v102 = __ROL__(*(_DWORD *)(v3 + 8) + (v265 & v264 ^ v263 & (v265 ^ v264)) + v262 - 1108810995, 31);
  v103 = v263 ^ v102;
  v262 = v103;
  _EAX = _InterlockedExchange(&v265, v103);
  _EDX = _InterlockedExchange(&v264, v101);
  __asm { arpl    ax, dx }
  _InterlockedExchange(&v265, _EAX);
  _InterlockedExchange(&v264, _EDX);
  v106 = v264;
  v107 = __ROL__(v265 + (v262 ^ v264 ^ v263) + *(_DWORD *)(v3 + 4) - 297420551, 30);
  v108 = v263 + v107;
  v265 = v108;
  v109 = __ROL__(*(_DWORD *)v3 + (v262 ^ v108 ^ v263) + v264 - 1007158588, 15);
  v110 = v109 + v263 + 1;
  v264 = v110;
  _EAX = _InterlockedExchange(&v265, v110);
  _EDX = _InterlockedExchange((signed __int32 *)&v262, v106);
  __asm { arpl    ax, dx }
  v113 = _InterlockedExchange(&v265, _EAX);
  _InterlockedExchange((signed __int32 *)&v262, _EDX);
  v114 = *(_DWORD *)(v3 + 12);
  v115 = v264;
  v116 = v8393(v113, v265, v262, v264);
  v117 = __ROL__(v114 + v116 + v263 + 34429626, 13);
  v118 = v262 ^ v117;
  v263 = v118;
  v119 = __ROL__(v114 + (v265 ^ v115 ^ v118) + v262 + 810441070, 30);
  v120 = v119 + v118 + 1;
  v121 = __ROL__(v265 + v118 + *(_DWORD *)v3 - v115 + v120 - 1493052571, 23);
  v122 = v121 - _byteswap_ulong(v118);
  v262 = v120;
  v123 = __ROL__(*(_DWORD *)v3 + (v120 & v122 ^ v118 & (v120 ^ v122)) + v115 - 310045284, 16);
  v265 = v122;
  v264 = v262 + v123;
  v124 = sub_1F1B(v118, (int)&v262, (int)&v264, v118, v122);
  v125 = v262;
  v126 = v8393(v124, v265, v262, v264);
  v127 = v126 + v263 + *(_DWORD *)(v3 + 12) - 243531110;
  v128 = *(_DWORD *)(v3 + 8);
  v127 = __ROL__(v127, 23);
  v129 = v127 - v125;
  v130 = __ROL__(v128 + (v265 ^ v264 ^ v129) + v125 - 973653713, 20);
  v131 = ~v264 ^ v130;
  v132 = v128 + (v131 & v264 ^ v129 & (v131 ^ v264));
  v133 = v265;
  v134 = __ROL__(v132 + v265 - 317140539, 30);
  v265 = v134 - v129;
  v135 = v8393(v133, v134 - v129, v129, v131);
  v136 = __ROL__(v135 + v264 + *(_DWORD *)(v3 + 4) - 331228956, 31);
  v137 = v129 + v136;
  v138 = __ROL__(*(_DWORD *)(v3 + 4) + (v131 & v265 ^ v137 & (v131 ^ v265)) + v129 - 1368208514, 19);
  v139 = ~v131 + v138;
  v263 = v139;
  v140 = __ROL__(*(_DWORD *)(v3 + 4) + (v265 ^ v137 ^ v139) + v131 + 1411275020, 28);
  v141 = _byteswap_ulong(-v137) + v140;
  v142 = v265;
  v143 = *(_DWORD *)v3 + (v141 ^ (v137 | ~v139));
  v264 = v137;
  v144 = __ROL__(v143 + v265 - 875095672, 5);
  v145 = _byteswap_ulong(v137) ^ v144;
  v262 = v141;
  v265 = v145;
  _EAX = _InterlockedExchange((signed __int32 *)&v263, v145);
  _EDX = _InterlockedExchange((signed __int32 *)&v262, v142);
  __asm { arpl    ax, dx }
  _InterlockedExchange((signed __int32 *)&v263, _EAX);
  _InterlockedExchange((signed __int32 *)&v262, _EDX);
  v148 = __ROL__(*(_DWORD *)(v3 + 12) + (v262 ^ v265 ^ v263) + v264 - 542816250, 7);
  v149 = v262 ^ v148;
  v150 = __ROL__(*(_DWORD *)v3 + (v149 ^ v265 & (v262 ^ v149)) + v263 - 397515647, 14);
  v151 = _byteswap_ulong(~v265) ^ v150;
  v152 = __ROL__(*(_DWORD *)v3 + (v265 ^ v149 ^ v151) + v262 - 1994564279, 23);
  v153 = ~v151 ^ v152;
  v154 = *(_DWORD *)(v3 + 8) + (v153 ^ v149 ^ v151);
  v263 = v151;
  v262 = v153;
  v155 = __ROL__(v154 + v265 + 1730515082, 2);
  v156 = v155 - v149;
  v157 = __ROL__(*(_DWORD *)(v3 + 12) + (v156 ^ v153 & (v156 ^ v151)) + v149 + 1783879536, 14);
  v158 = _byteswap_ulong(~v153) ^ v157;
  v265 = v156;
  v264 = v158;
  _EAX = _InterlockedExchange((signed __int32 *)&v263, v158);
  _EDX = _InterlockedExchange(&v265, v156);
  __asm { arpl    ax, dx }
  v161 = _InterlockedExchange((signed __int32 *)&v263, _EAX);
  _InterlockedExchange(&v265, _EDX);
  v162 = v264;
  v163 = v8393(v161, v265, v264, v262);
  v164 = __ROL__(v163 + v263 + *(_DWORD *)(v3 + 4) - 863388681, 30);
  v165 = ~v162 ^ v164;
  v263 = v165;
  _EAX = _InterlockedExchange(&v265, v165);
  _EDX = _InterlockedExchange((signed __int32 *)&v262, v167);
  __asm { arpl    ax, dx }
  _InterlockedExchange(&v265, _EAX);
  _InterlockedExchange((signed __int32 *)&v262, _EDX);
  v169 = v262;
  v170 = _byteswap_ulong(~v263);
  v171 = __ROL__(*(_DWORD *)v3 + (v265 ^ v264 ^ v263) + v262 - 291313153, 16);
  v262 = v171 - v170;
  _EAX = _InterlockedExchange(&v264, v170);
  _EDX = _InterlockedExchange(&v265, v169);
  __asm { arpl    ax, dx }
  _InterlockedExchange(&v264, _EAX);
  _InterlockedExchange(&v265, _EDX);
  v174 = __ROL__(*(_DWORD *)(v3 + 4) + (v263 ^ (v264 | ~v262)) + v265 + 1647080717, 13);
  v175 = v264 + v174;
  v176 = *(_DWORD *)(v3 + 8);
  v177 = __ROL__(v264 + v263 + *(_DWORD *)v3 - v262 + v175 - 1113757831, 21);
  v178 = v177 - v263;
  v264 = v178;
  v179 = __ROL__(v176 + (v262 ^ v175 ^ v178) + v263 + 228922901, 7);
  v263 = ~v175 + v179;
  v180 = v8393(~v175, v178, v263);
  v181 = __ROL__(*(_DWORD *)v3 + v180 + v262 + 545626728, 24);
  v182 = v181 - v263;
  v183 = __ROL__(*(_DWORD *)(v3 + 4) + (v182 & v178 ^ v263 & (v182 ^ v178)) + v175 - 2139171116, 20);
  v184 = v183 - v263;
  v185 = __ROL__(*(_DWORD *)(v3 + 12) + (v182 & v184 ^ v263 & (v182 ^ v184)) + v264 - 309490666, 13);
  v186 = ~v182 + v185;
  v187 = *(_DWORD *)v3 + (v182 ^ (v184 | ~v186));
  v264 = v186;
  v188 = __ROL__(v187 + v263 - 1466651521, 2);
  v189 = _byteswap_ulong(~v184) + v188;
  v190 = __ROL__(v184 + v186 + *(_DWORD *)(v3 + 12) - v189 + v182 - 2147087047, 26);
  v191 = v184 + v190;
  v263 = v189;
  v192 = __ROL__(*(_DWORD *)(v3 + 12) + v8393(v182, v189, v191, v186) + v184 + 700891458, 6);
  v193 = v192 + v191 + 1;
  v194 = *(_DWORD *)(v3 + 4);
  v262 = ~v191;
  v195 = __ROL__(v194 + (v193 ^ (v191 | ~v263)) + v264 + 359723466, 7);
  v196 = v195 - _byteswap_ulong(~v191);
  v265 = v193;
  v197 = __ROL__(v196 + v263 + v194 - v193 + v191 + 1352492736, 15);
  v198 = ~v191 ^ v197;
  v199 = v193 & v196 ^ v198 & (v193 ^ v196);
  v200 = *(_DWORD *)(v3 + 4);
  v201 = __ROL__(v200 + v199 + v191 + 731862510, 23);
  v202 = v201 - _byteswap_ulong(~v198);
  v203 = __ROL__(v200 + (v202 ^ (v198 | ~v196)) + v265 - 136239548, 6);
  v204 = _byteswap_ulong(-v198) ^ v203;
  v205 = *(_DWORD *)(v3 + 4) + (v202 ^ v204 ^ v198);
  v263 = ~v204;
  v206 = __ROL__(v205 + v196 + 1423683416, 3);
  v207 = ~v204 ^ v206;
  v262 = v202;
  v208 = __ROL__(*(_DWORD *)(v3 + 12) + (v202 ^ v204 ^ v207) + v198 - 373081087, 9);
  v209 = v204 + v208;
  v210 = __ROL__(v204 + v207 + *(_DWORD *)(v3 + 4) - v209 + v202 - 2092948728, 9);
  v211 = _byteswap_ulong(~v204) + v210;
  v212 = *(_DWORD *)v3 + (v211 ^ v209 & (v211 ^ v207));
  v262 = v211;
  v213 = __ROL__(v212 + v204 - 141321586, 23);
  v214 = v209 + v213;
  v215 = *(_DWORD *)(v3 + 4) + (v211 ^ v214 ^ v209);
  v265 = v214;
  v216 = __ROL__(v215 + v207 + 758207654, 17);
  v217 = v216 - v214;
  v264 = v217;
  v218 = __ROL__(*(_DWORD *)(v3 + 8) + (v211 ^ (v214 | ~v217)) + v209 - 105656967, 28);
  v219 = v214 ^ v218;
  v263 = v219;
  _EAX = _InterlockedExchange(&v264, v219);
  _EDX = _InterlockedExchange((signed __int32 *)&v262, v209);
  __asm { arpl    ax, dx }
  _InterlockedExchange(&v264, _EAX);
  _InterlockedExchange((signed __int32 *)&v262, _EDX);
  v222 = *(_DWORD *)v3;
  v223 = *(_DWORD *)(v3 + 8);
  v224 = __ROL__(*(_DWORD *)v3 + (v265 ^ (v263 | ~v264)) + v262 + 19130758, 5);
  v225 = v224 - v263;
  v262 = v225;
  v226 = __ROL__(v265 + v264 + v223 - v263 + v225 - 1012075900, 25);
  v227 = ~v225 ^ v226;
  v228 = __ROL__(v264 + v263 + v222 - v225 + v227 + 1202620042, 22);
  v229 = _byteswap_ulong(v263) ^ v228;
  v264 = v229;
  v230 = *(_DWORD *)v3 + (v227 ^ v225 & (v227 ^ v229));
  v231 = -v225;
  v232 = __ROL__(v230 + v263 + 1999161866, 19);
  v265 = v227;
  v263 = v231 ^ v232;
  _EAX = _InterlockedExchange(&v264, v231);
  _EDX = _InterlockedExchange(&v265, v227);
  __asm { arpl    ax, dx }
  _InterlockedExchange(&v264, _EAX);
  _InterlockedExchange(&v265, _EDX);
  v235 = v262;
  v236 = _byteswap_ulong(v263);
  v237 = __ROL__(*(_DWORD *)(v3 + 12) + (v264 ^ (v263 | ~v265)) + v262 - 1358273280, 15);
  v262 = v237 - v236;
  _EAX = _InterlockedExchange(&v265, v236);
  _EDX = _InterlockedExchange(&v264, v235);
  __asm { arpl    ax, dx }
  _InterlockedExchange(&v265, _EAX);
  _InterlockedExchange(&v264, _EDX);
  v240 = v265;
  v241 = __ROL__(*(_DWORD *)(v3 + 8) + (v264 ^ (v263 | ~v262)) + v265 + 581750887, 9);
  v265 = ~v263 ^ v241;
  _EAX = _InterlockedExchange((signed __int32 *)&v262, ~v263);
  _EDX = _InterlockedExchange(&v264, v240);
  __asm { arpl    ax, dx }
  _InterlockedExchange((signed __int32 *)&v262, _EAX);
  _InterlockedExchange(&v264, _EDX);
  v244 = __ROL__(*(_DWORD *)(v3 + 12) + (v262 ^ v265 ^ v263) + v264 + 737343371, 14);
  v264 = v244 + v263 + 1;
  v245 = __ROL__(*(_DWORD *)(v3 + 12) + (v262 ^ v265 & (v262 ^ v264)) + v263 - 539841844, 9);
  v246 = v265 + v245;
  v247 = __ROL__(v265 + v246 + *(_DWORD *)(v3 + 4) - v264 + v262 + 1228078, 5);
  v248 = ~v246 ^ v247;
  v249 = *(_DWORD *)v3 + (v246 ^ v264 & (v248 ^ v246));
  v262 = v248;
  v250 = __ROL__(v249 + v265 - 1603625506, 29);
  v251 = v264 + v250;
  v252 = v8393(v249, v251, v248);
  v253 = __ROL__(*(_DWORD *)(v3 + 4) + v252 + v264 + 1417801983, 25);
  v254 = -v262 ^ v253;
  v264 = v254;
  v255 = *(_DWORD *)(v3 + 12);
  v256 = __ROL__(*(_DWORD *)(v3 + 8) + (v262 & v251 ^ v254 & (v262 ^ v251)) + v246 - 739996948, 14);
  v257 = ~v251 ^ v256;
  v258 = __ROL__(v255 + (v257 ^ (v251 | ~v254)) + v262 - 1378347547, 7);
  v259 = v251 + v258 + *(_DWORD *)v3;
  *(_DWORD *)(v3 + 4) += v251;
  v260 = *(_DWORD *)(v3 + 8);
  *(_DWORD *)v3 = v259;
  result = v264 + v260;
  *(_DWORD *)(v3 + 8) = result;
  *(_DWORD *)(v3 + 12) = v257 + v255;
  _m_femms();
  return result;
}
	//----- (00002E90) --------------------------------------------------------
int __fastcall sub_2E90(int a1, int a2, int a3, int a4, unsigned int a5)
{
  int v5; // esi@1
  unsigned int v6; // ecx@1
  unsigned int v7; // eax@1
  unsigned __int8 v8; // dl@1
  int v9; // ecx@3
  int result; // eax@9
	  v5 = a3;
  v6 = *(_DWORD *)(a3 + 8);
  v7 = *(_DWORD *)(v5 + 4);
  v8 = 0;
  if ( v6 <= v7 && v7 - v6 >= 1 )
  {
    v8 = *(_BYTE *)(v6 + *(_DWORD *)v5);
    v9 = v6 + 1;
  }
  else
  {
    v9 = v7 + 1;
  }
  *(_DWORD *)(v5 + 8) = v9;
  if ( v9 <= v7 && v7 - v9 >= v8 && v8 < a5 )
    sub_595D(a4, v9 + *(_DWORD *)v5, v8);
  result = v7 + 1;
  *(_DWORD *)(v5 + 8) = result;
  return result;
}
	//----- (00003170) --------------------------------------------------------
int __fastcall sub_3170(int a1, int a2, int a3, int a4)
{
  unsigned int v4; // edx@2
  int result; // eax@3
  int v6; // esi@4
	  if ( *(_BYTE *)(a3 + 12) && (v4 = *(_DWORD *)(a3 + 4), *(_DWORD *)(a3 + 8) <= v4) )
  {
    result = a4;
    v6 = *(_DWORD *)(a3 + 8);
    *(_DWORD *)a4 = v6 + *(_DWORD *)a3;
    *(_DWORD *)(a4 + 4) = v4 - v6;
    *(_DWORD *)(a4 + 8) = 0;
  }
  else
  {
    result = a4;
    *(_DWORD *)a4 = 65901181;
    *(_DWORD *)(a4 + 4) = -1;
    *(_DWORD *)(a4 + 8) = 0;
  }
  return result;
}
	//----- (00003210) --------------------------------------------------------
void __fastcall sub_3210(int a1, int a2, int a3)
{
  *(_DWORD *)a3 = 0;
  *(_DWORD *)(a3 + 4) = 0;
  *(_DWORD *)(a3 + 8) = 1779033703;
  *(_DWORD *)(a3 + 12) = -1150833019;
  *(_DWORD *)(a3 + 16) = 1013904242;
  *(_DWORD *)(a3 + 20) = -1521486534;
  *(_DWORD *)(a3 + 24) = 1359893119;
  *(_DWORD *)(a3 + 28) = -1694144372;
  *(_DWORD *)(a3 + 32) = 528734635;
  *(_DWORD *)(a3 + 36) = 1541459225;
}
	//----- (00003387) --------------------------------------------------------
int __fastcall sub_3387(int a1, int a2, int a3, int a4)
{
  int v4; // eax@1
  int v5; // ecx@1
  int result; // eax@2
  int v7; // esi@3
	  v4 = a3;
  v5 = a4 - 1;
  if ( a4 )
  {
    v7 = v4;
    while ( *(_BYTE *)a2 && v5 )
    {
      *(_BYTE *)v4++ = *(_BYTE *)a2++;
      --v5;
    }
    *(_BYTE *)v4 = 0;
    result = v4 - v7;
  }
  else
  {
    result = 0;
  }
  return result;
}
	//----- (000033C0) --------------------------------------------------------
__int16 __fastcall sub_33C0(int a1, int a2, int a3, int a4)
{
  unsigned int v4; // eax@1
  unsigned int v5; // edx@1
	  *(_WORD *)a4 = 0;
  v4 = *(_DWORD *)(a3 + 8);
  v5 = *(_DWORD *)(a3 + 4);
  if ( v4 <= v5 && v5 - v4 >= 2 )
  {
    LOWORD(v4) = *(_WORD *)(v4 + *(_DWORD *)a3);
    *(_WORD *)a4 = v4;
    *(_DWORD *)(a3 + 8) += 2;
  }
  else
  {
    *(_DWORD *)(a3 + 8) = v5 + 1;
  }
  return v4;
}
	//----- (00003610) --------------------------------------------------------
int __cdecl sub_3610(int a1)
{
  int v1; // eax@1
	  v1 = v3ED9048(0, a1);
  return v3ED904C(v1);
}
// 3ED9048: using guessed type int (__stdcall *)(_DWORD, _DWORD);
// 3ED904C: using guessed type int (__stdcall *)(_DWORD);
	//----- (00003810) --------------------------------------------------------
char __fastcall sub_3810(int a1, int a2, int a3, unsigned int a4)
{
  unsigned int v4; // edx@1
  unsigned int v5; // esi@1
  int v6; // eax@2
  char result; // al@5
	  v4 = *(_DWORD *)(a3 + 4);
  v5 = *(_DWORD *)(a3 + 8);
  if ( v5 <= v4 )
    v6 = v4 - v5;
  else
    v6 = 0;
  if ( v6 < a4 )
  {
    *(_DWORD *)(a3 + 8) = v4 + 1;
    result = 0;
  }
  else
  {
    result = 1;
  }
  return result;
}
	//----- (00003840) --------------------------------------------------------
int (*__cdecl sub_3840())(void)
{
  int (*result)(void); // eax@1
  int v1; // edi@2
  signed int i; // esi@2
	  result = (int (*)(void))v3EDA120;
  if ( v3EDA120 )
  {
    v1 = 4 * v3EDA120 + 65904800;
    for ( i = 65904800; i < (unsigned int)v1; i += 4 )
    {
      result = *(int (**)(void))i;
      if ( *(_DWORD *)i )
        result = (int (*)(void))result();
    }
  }
  return result;
}
	//----- (00003890) --------------------------------------------------------
signed int __fastcall sub_3890(int a1, int a2, int a3, int a4, int a5)
{
  int v5; // edi@1
  char v6; // dl@3
  unsigned int v7; // eax@4
  unsigned int v8; // ecx@4
  unsigned int v9; // eax@9
  unsigned int v10; // ecx@9
  unsigned __int8 v11; // bl@9
  signed int result; // eax@16
  int v13; // eax@17
  int v14; // [sp+Ch] [bp-114h]@0
  unsigned __int8 v15; // [sp+17h] [bp-109h]@0
  int v16; // [sp+18h] [bp-108h]@1
  char v17; // [sp+1Ch] [bp-104h]@2
  unsigned int v18; // [sp+11Ch] [bp-4h]@1
  int v19; // [sp+120h] [bp+0h]@1
	  v18 = (unsigned int)&v19 ^ v3EDA03C;
  v5 = a5;
  v16 = a3;
  if ( *(_BYTE *)(a4 + 12) )
    sub_2E90((int)&v17, a2, a4, (int)&v17, 0x100u);
  v6 = *(_BYTE *)(a4 + 12);
  if ( v6
    && ((v7 = *(_DWORD *)(a4 + 8), v8 = *(_DWORD *)(a4 + 4), v14 = 0, v7 <= v8) && v8 - v7 >= 4 ? (v14 = *(_DWORD *)(v7 + *(_DWORD *)a4),
                                                                                                   *(_DWORD *)(a4 + 8) = v7 + 4) : (*(_DWORD *)(a4 + 8) = v8 + 1),
        v6) )
  {
    v9 = *(_DWORD *)(a4 + 8);
    v10 = *(_DWORD *)(a4 + 4);
    v11 = 0;
    if ( v9 <= v10 && (v5 = a5, v10 - v9 >= 1) )
    {
      v11 = *(_BYTE *)(v9 + *(_DWORD *)a4);
      *(_DWORD *)(a4 + 8) = v9 + 1;
    }
    else
    {
      *(_DWORD *)(a4 + 8) = v10 + 1;
    }
  }
  else
  {
    v11 = v15;
  }
  if ( v6 && *(_DWORD *)(a4 + 8) <= *(_DWORD *)(a4 + 4) )
  {
    v13 = (*(int (__fastcall **)(_DWORD, char *, int, int))(*(_DWORD *)v5 + 4))(
            *(_DWORD *)(*(_DWORD *)v5 + 4),
            &v17,
            v5,
            v17 != 0 ? (int)&v17 : 0);
    if ( v13 && v14 && (!v11 || v11 == 1) )
    {
      if ( v11 == 1 )
        *(_DWORD *)v16 = (*(int (__fastcall **)(int, _DWORD, int, int, int))(*(_DWORD *)v5 + 8))(
                           v13,
                           *(_DWORD *)(*(_DWORD *)v5 + 8),
                           v5,
                           v13,
                           v14);
      else
        *(_DWORD *)v16 = 0;
    }
    else
    {
      *(_DWORD *)v16 = 0;
    }
    result = 0;
  }
  else
  {
    result = 3;
  }
  return result;
}
	//----- (00003A00) --------------------------------------------------------
int __fastcall sub_3A00(int a1, int a2, int a3, int a4)
{
  int v4; // ebx@1
  int v5; // edx@1
  int v6; // eax@4
  signed int v7; // eax@5
  signed int v8; // edi@5
  signed int v9; // esi@5
  signed int v10; // ecx@5
  char v11; // zf@5
  int v12; // eax@10
  char v13; // al@12
  int v15; // [sp+8h] [bp-118h]@3
  int v16; // [sp+Ch] [bp-114h]@4
  int v17; // [sp+10h] [bp-110h]@4
  unsigned int v18; // [sp+11Ch] [bp-4h]@1
  int v19; // [sp+120h] [bp+0h]@1
	  v18 = (unsigned int)&v19 ^ v3EDA03C;
  v4 = a3;
  *(_DWORD *)(a3 + 4) = a4;
  *(_DWORD *)a3 = 65901440;
  v3ED902C(a3 + 8);
  if ( *(_DWORD *)(v4 + 12) < 0x1000u )
    *(_DWORD *)(v4 + 12) = 4096;
  *(_DWORD *)(v4 + 56) = sub_5990(4096, v5, a4);
  *(_DWORD *)(v4 + 48) = 0;
  *(_DWORD *)(v4 + 52) = 0;
  v15 = 276;
  if ( v3ED9028(&v15) )
  {
    v6 = v17;
    *(_DWORD *)(v4 + 48) = v16;
    *(_DWORD *)(v4 + 52) = v6;
  }
  v7 = 65901340;
  v8 = 65901184;
  v9 = 65901340;
  v10 = 13;
  v11 = 1;
  do
  {
    if ( !v10 )
      break;
    v11 = *(_BYTE *)v9++ == *MK_FP(__ES__, v8++);
    --v10;
  }
  while ( v11 );
  if ( v11 )
    v7 = 0;
  v12 = v3ED9020(v7);
  v13 = v12 && v3ED901C(v12, 65901524);
  *(_BYTE *)(v4 + 44) = v13;
  return v4;
}
// 3ED901C: using guessed type int (__stdcall *)(_DWORD, _DWORD);
// 3ED9020: using guessed type int (__stdcall *)(_DWORD);
// 3ED9028: using guessed type int (__stdcall *)(_DWORD);
// 3ED902C: using guessed type int (__stdcall *)(_DWORD);
	//----- (00003CA0) --------------------------------------------------------
int __fastcall sub_3CA0(int a1, int a2, int a3)
{
  int v3; // edi@1
  unsigned int v4; // esi@1
  int v5; // eax@1
  int v6; // edx@1
  int v7; // edx@1
  char v9; // [sp+8h] [bp-78h]@1
  int v10; // [sp+68h] [bp-18h]@1
  int v11; // [sp+6Ch] [bp-14h]@1
  int v12; // [sp+70h] [bp-10h]@1
  int v13; // [sp+74h] [bp-Ch]@1
  int v14; // [sp+78h] [bp-8h]@1
  unsigned int v15; // [sp+7Ch] [bp-4h]@1
  int v16; // [sp+80h] [bp+0h]@1
	  v15 = (unsigned int)&v16 ^ v3EDA03C;
  v3 = a3;
  v4 = a2;
  sub_1EF0((unsigned int)&v16 ^ v3EDA03C, a2, (int)&v9);
  sub_1346(v5, v6, (int)&v9, v3, v4);
  sub_109F((int)&v10, v7, (int)&v9, (int)&v10);
  return v14 ^ v13 ^ v12 ^ v11 ^ v10;
}
	//----- (00003D00) --------------------------------------------------------
int __fastcall sub_3D00(int a1, int a2, int a3, unsigned int *a4, int a5)
{
  unsigned int *v5; // ebx@1
  int v6; // edi@1
  unsigned int v7; // ecx@1
  signed __int64 v8; // qax@1
  int v9; // esi@1
  unsigned __int8 v10; // cf@1
  unsigned int v12; // [sp+14h] [bp+8h]@7
  unsigned int v13; // [sp+18h] [bp+Ch]@2
	  v5 = a4;
  v6 = a3;
  v7 = a5;
  v8 = 8i64 * (unsigned int)a5;
  v9 = (*(_DWORD *)v6 >> 3) & 0x3F;
  v10 = __CFADD__((_DWORD)v8, *(_DWORD *)v6);
  *(_DWORD *)v6 += v8;
  *(_DWORD *)(v6 + 4) += HIDWORD(v8) + v10;
  if ( v9 )
  {
    v7 = v9 + a5;
    v5 = (unsigned int *)((char *)a4 - v9);
    v13 = v7;
    if ( v7 < 0x40 )
      goto LABEL_10;
    for ( ; (unsigned int)v9 < 0x40; ++v9 )
    {
      LOBYTE(v8) = *((_BYTE *)v5 + v9);
      *(_BYTE *)(v6 + v9 + 40) = v8;
    }
    LODWORD(v8) = sub_74A0(v8, (unsigned int *)(v6 + 40), v6 + 8);
    a5 = v13 - 64;
    v7 = a5;
    v5 += 16;
    v9 = 0;
  }
  if ( v7 >= 0x40 )
  {
    v12 = v7 >> 6;
    do
    {
      LODWORD(v8) = sub_74A0(v8, v5, v6 + 8);
      a5 -= 64;
      v5 += 16;
      --v12;
    }
    while ( v12 );
    v7 = a5;
  }
LABEL_10:
  while ( v9 < v7 )
  {
    *(_BYTE *)(v6 + v9 + 40) = *((_BYTE *)v5 + v9);
    ++v9;
  }
  return v8;
}
	//----- (00003DA5) --------------------------------------------------------
void __fastcall sub_3DA5(int a1, int a2, int a3)
{
  int v3; // esi@1
  int v4; // edi@1
  int v5; // ecx@1
  int v6; // eax@1
  int v7; // eax@3
  int v8; // edx@3
	  v3 = a3;
  v4 = a3 + 1984;
  v5 = *(_DWORD *)(a3 + 1984);
  *(_DWORD *)v3 = 65901244;
  *(_DWORD *)(v3 + 20) = 65901236;
  (*(void (**)(void))(*(_DWORD *)v5 + 28))();
  *(_DWORD *)v4 = 0;
  (***(void (****)(void))(v3 + 552))();
  v6 = *(_DWORD *)(v3 + 28);
  *(_DWORD *)(v3 + 552) = 0;
  if ( v6 )
  {
    (*(void (__stdcall **)(int))(**(_DWORD **)(v3 + 24) + 20))(v6);
    *(_DWORD *)(v3 + 28) = 0;
  }
  v7 = (*(int (__stdcall **)(int, signed int))(**(_DWORD **)(v3 + 24) + 24))(v3 + 32, 520);
  sub_1FB4(v7, v8, v3 + 1988);
  *(_DWORD *)v3 = 65901200;
}
	//----- (00003E40) --------------------------------------------------------
int __fastcall sub_3E40(int a1, int a2, int a3, int a4, int a5, int a6, int a7)
{
  unsigned __int8 v7; // bl@1
  int v8; // edi@1
  int (__fastcall *v9)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD); // eax@1
  int v10; // ecx@3
  int result; // eax@3
  unsigned int v12; // eax@6
  unsigned int v13; // ecx@6
  int v14; // eax@8
  char v15; // [sp+6Ah] [bp-21Ah]@3
  char v16; // [sp+6Bh] [bp-219h]@1
  unsigned int v17; // [sp+280h] [bp-4h]@1
  int v18; // [sp+284h] [bp+0h]@1
	  v17 = (unsigned int)&v18 ^ v3EDA03C;
  v7 = 0;
  v8 = a3;
  *(_BYTE *)a6 = 0;
  v16 = 0;
  v9 = *(int (__fastcall **)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD))(a3 + 1976);
  if ( !v9 )
    goto LABEL_6;
  if ( v16 )
    return 0;
  v10 = a3 + *(_DWORD *)(a3 + 1980);
  v16 = 1;
  v15 = 0;
  result = v9(v9, &v15, v10, a4, a5, &v15, a7);
  if ( v15 && !result )
  {
    *(_DWORD *)(v8 + 1976) = 0;
    *(_DWORD *)(v8 + 1980) = 0;
LABEL_6:
    v12 = *(_DWORD *)(a5 + 8);
    v13 = *(_DWORD *)(a5 + 4);
    if ( v12 <= v13 && v13 - v12 >= 1 )
    {
      v7 = *(_BYTE *)(v12 + *(_DWORD *)a5);
      v14 = v12 + 1;
    }
    else
    {
      v14 = v13 + 1;
    }
    *(_DWORD *)(a5 + 8) = v14;
    if ( v14 > v13 )
      return 3;
    if ( (v7 ^ (unsigned int)*(_BYTE *)(v8 + 4)) <= 0xCD )
      JUMPOUT(__CS__, *(_DWORD *)(4 * *(_BYTE *)((v7 ^ *(_BYTE *)(v8 + 4)) + 0x3ED4B60) + 0x3ED4B2C));
    *(_BYTE *)a6 = 1;
    return 0;
  }
  return result;
}
	//----- (00004CF6) --------------------------------------------------------
int __fastcall sub_4CF6(int a1, int a2, int a3, const void *a4, int a5, int a6)
{
  int v6; // ebx@1
	  v6 = a3;
  memcpy((void *)a3, a4, 0x20u);
  *MK_FP(__ES__, a3 + 32) = *(_DWORD *)a5;
  *MK_FP(__ES__, a3 + 36) = *(_DWORD *)(a5 + 4);
  *MK_FP(__ES__, a3 + 40) = *(_DWORD *)(a5 + 8);
  *MK_FP(__ES__, a3 + 44) = *(_DWORD *)(a5 + 12);
  *(_DWORD *)(a3 + 156) = 0;
  *(_DWORD *)(a3 + 152) = a6;
  sub_3210(a6, a2, a3 + 48);
  return v6;
}
	//----- (00004F41) --------------------------------------------------------
char __fastcall sub_4F41(int a1, int a2, int a3)
{
  int v3; // ebx@1
  int v4; // eax@1
  int v5; // edi@1
  int v6; // edx@2
  int v7; // edx@3
  int v8; // edx@6
  int v9; // edx@6
  int v10; // esi@6
  int v11; // edx@6
  int v12; // eax@9
  int v13; // edx@9
  int v14; // edi@13
  int v15; // ecx@13
  char *v16; // esi@13
  char v17; // zf@13
  int v18; // eax@17
  int v19; // eax@18
  int v20; // edx@18
  char v22; // [sp+8h] [bp-29Ch]@18
  int v23; // [sp+14h] [bp-290h]@18
  int v24; // [sp+28h] [bp-27Ch]@6
  int v25; // [sp+2Ch] [bp-278h]@6
  unsigned int v26; // [sp+30h] [bp-274h]@6
  char *v27; // [sp+34h] [bp-270h]@2
  int v28; // [sp+38h] [bp-26Ch]@2
  int v29; // [sp+3Ch] [bp-268h]@2
  int v30; // [sp+40h] [bp-264h]@3
  int v31; // [sp+44h] [bp-260h]@2
  unsigned int v32; // [sp+48h] [bp-25Ch]@2
  unsigned int v33; // [sp+4Ch] [bp-258h]@2
  char v34; // [sp+50h] [bp-254h]@18
  unsigned __int8 v35; // [sp+56h] [bp-24Eh]@6
  unsigned __int8 v36; // [sp+57h] [bp-24Dh]@2
  char v37; // [sp+58h] [bp-24Ch]@18
  char v38; // [sp+160h] [bp-144h]@12
  char v39; // [sp+260h] [bp-44h]@6
  unsigned int v40; // [sp+2A0h] [bp-4h]@1
  int v41; // [sp+2A4h] [bp+0h]@1
	  v40 = (unsigned int)&v41 ^ v3EDA03C;
  v3 = a3;
  v4 = *(_DWORD *)(a3 + 1904);
  v5 = 0;
  if ( v4 )
  {
    v32 = *(_DWORD *)(a3 + 1904);
    v31 = a3 + 1648;
    v33 = 0;
    v27 = 0;
    v28 = 0;
    v29 = 1;
    LOBYTE(v4) = sub_6FE0((int)&v36, a2, (int)&v31, (int)&v36);
    if ( v36 )
    {
      while ( 1 )
      {
        LOBYTE(v4) = sub_6FE0((int)&v30, v6, (int)&v31, (int)&v30);
        if ( (unsigned __int8)v30 >= 0x40u
          || (LOBYTE(v4) = v33, v33 > v32)
          || (LOBYTE(v4) = v36 - 1, v36 != 1)
          || (sub_2E90((int)&v39, v7, (int)&v31, (int)&v39, 0x40u),
              sub_1CB0((int)&v25, v8, (int)&v31, (int)&v25),
              sub_6FE0((int)&v35, v9, (int)&v31, (int)&v35),
              v10 = v35,
              v26 = v35,
              v821A(&v24, v11, &v31, &v24, v35),
              LOBYTE(v4) = v33,
              v33 > v32)
          || v35 > 0xFFu )
          return v4;
        if ( !v39 )
          break;
        v12 = (*(int (__stdcall **)(char *))(**(_DWORD **)(v3 + 552) + 4))(&v39);
        if ( v12 != v5 )
          goto LABEL_12;
LABEL_20:
        v5 = 0;
        v27 = 0;
        v28 = 0;
        v29 = 1;
        LOBYTE(v4) = sub_6FE0((int)&v36, v6, (int)&v31, (int)&v36);
        if ( !v36 )
          return v4;
      }
      v12 = 0;
LABEL_12:
      if ( (unsigned __int8)(*(int (__stdcall **)(char *, int, int, int))(**(_DWORD **)(v3 + 552) + 12))(
                              &v38,
                              v12,
                              v25,
                              v10) )
      {
        v14 = v24;
        v15 = v10;
        v16 = &v38;
        v17 = 1;
        do
        {
          if ( !v15 )
            break;
          v17 = *v16++ == *MK_FP(__ES__, v14++);
          --v15;
        }
        while ( v17 );
        if ( !v17 )
        {
          v18 = (unsigned __int8)v30 + v3 + 1908;
          if ( !*(_BYTE *)v18 )
          {
            *(_BYTE *)v18 = 1;
            v29 = 0;
            v27 = &v37;
            v28 = 263;
            v34 = 3;
            sub_5730((int)&v34, v13, (int)&v27, (int)&v34);
            v19 = sub_524A((int)&v27, v20, (int)&v22, (int)&v27);
            sub_60F0(v19, v20, (int)&v22, v30);
            sub_1444((int)&v38, v20, v23, (int)&v38, v26);
            LOBYTE(v4) = v23;
            if ( *(_DWORD *)(v23 + 8) > *(_DWORD *)(v23 + 4) )
              return v4;
            sub_7AA0(v23, v13, (int)&v22);
            sub_51F2((int)&v37, v13, v3, (int)&v37, *(_DWORD *)(v23 + 8));
          }
        }
      }
      goto LABEL_20;
    }
  }
  return v4;
}
	//----- (000051C5) --------------------------------------------------------
int __fastcall sub_51C5(int a1, int a2, int a3, int a4, int a5, int a6, int a7)
{
  int v7; // ecx@1
  int result; // eax@1
  int v9; // et0@1
	  v7 = __ROL__(a3, 5);
  result = a7;
  *(_DWORD *)a6 += (a5 ^ a4 ^ *(_DWORD *)a2) + v7 + *(_DWORD *)a7 + 1859775393;
  v9 = __ROL__(*(_DWORD *)a2, 30);
  *(_DWORD *)a2 = v9;
  *(_DWORD *)a7 = 0;
  return result;
}
	//----- (000051F2) --------------------------------------------------------
int __fastcall sub_51F2(int a1, int a2, int a3, int a4, unsigned int a5)
{
  int v5; // esi@1
	  v5 = a3;
  sub_57D0(a1, a2, a3 + 32, a4, a5);
  return (*(int (**)(void))(**(_DWORD **)(v5 + 24) + 4))();
}
	//----- (00005210) --------------------------------------------------------
int __fastcall sub_5210(int a1, int a2, int a3, int a4, int a5, int a6, int a7)
{
  int v7; // ecx@1
  int result; // eax@1
  int v9; // et0@1
	  v7 = __ROL__(a3, 5);
  result = a7;
  *(_DWORD *)a6 += (a4 & *(_DWORD *)a2 | a5 & ~*(_DWORD *)a2) + v7 + *(_DWORD *)a7 + 1518500249;
  v9 = __ROL__(*(_DWORD *)a2, 30);
  *(_DWORD *)a2 = v9;
  *(_DWORD *)a7 = 0;
  return result;
}
	//----- (0000524A) --------------------------------------------------------
int __fastcall sub_524A(int a1, int a2, int a3, int a4)
{
  int v4; // esi@1
	  v4 = a3;
  *(_DWORD *)a3 = 0;
  *(_DWORD *)(a3 + 4) = 0;
  *(_DWORD *)(a3 + 8) = 1;
  *(_DWORD *)(v4 + 12) = v4;
  sub_6D70(a1, a2, a3, a4);
  return v4;
}
	//----- (00005270) --------------------------------------------------------
int __usercall sub_5270<eax>(char _CF<cf>, char _ZF<zf>, char _SF<sf>, char _OF<of>, int a5<eax>, int a6<edx>, int a7<ecx>, int a8<ebx>, int a9<edi>, int a10<esi>, char a11)
{
  int v11; // eax@6
  int v12; // eax@6
  int v13; // eax@6
  int v14; // edx@6
  int v15; // eax@8
  int v17; // [sp-4h] [bp-338h]@0
  bool v18; // [sp+0h] [bp-334h]@4
  int v19; // [sp+4h] [bp-330h]@1
  int (*v20)(void); // [sp+8h] [bp-32Ch]@2
  int v21; // [sp+334h] [bp+0h]@0
  void *v22; // [sp+338h] [bp+4h]@1
	  v3EDA230 = a5;
  v3EDA22C = a7;
  v3EDA228 = a6;
  v3EDA224 = a8;
  v3EDA220 = a10;
  v3EDA21C = a9;
  v3EDA248 = __SS__;
  v3EDA23C = __CS__;
  v3EDA218 = __DS__;
  v3EDA214 = __ES__;
  v3EDA210 = __FS__;
  v3EDA20C = __GS__;
  __asm { pushf }
  v3EDA240 = v17;
  v3EDA234 = v21;
  v3EDA238 = v22;
  v3EDA244 = &a11;
  v3EDA180 = 65537;
  v3EDA134 = v22;
  v3EDA128 = -1073740791;
  v3EDA12C = 1;
  v19 = v3ED9020(65901684);
  v18 = v19 && (v20 = (int (*)(void))v3ED901C(v19, 65901664)) != 0 && v20();
  v3EDA178 = v18;
  sub_11B0();
  v12 = v3ED905C(v11, v14, 1, 0);
  v13 = v3ED9058(v12, v14);
  if ( !v3EDA178 )
    sub_11B0();
  v15 = v3ED9054(v13, v14);
  return v3ED9050(v15);
}
// 3ED901C: using guessed type int (__stdcall *)(_DWORD, _DWORD);
// 3ED9020: using guessed type int (__stdcall *)(_DWORD);
// 3ED9050: using guessed type int (__stdcall *)(_DWORD);
// 3ED9054: using guessed type int (__fastcall *)(_DWORD, _DWORD);
// 3ED9058: using guessed type int (__fastcall *)(_DWORD, _DWORD);
// 3ED905C: using guessed type int (__fastcall *)(_DWORD, _DWORD, _DWORD, _DWORD);
	//----- (00005460) --------------------------------------------------------
signed int __stdcall sub_5460(int a1, int a2, int a3)
{
  signed int v4; // edi@5
	  if ( a2 == 1 )
  {
    sub_6E00(1);
    v3EDA124 = 0;
    if ( sub_5510(0x3ED9094u, 0x3ED909Cu) )
      return 0;
    sub_7340(0x3ED9088u, 0x3ED9090u);
    v3EDA124 = 1;
  }
  v4 = sub_22A0(a1, a2, a3);
  if ( !a2 )
  {
    if ( v3EDA124 )
    {
      sub_3840();
      sub_7340(0x3ED90A0u, 0x3ED90A4u);
      sub_7340(0x3ED90A8u, 0x3ED90ACu);
      v3EDA124 = 0;
    }
  }
  return v4;
}
	//----- (00005510) --------------------------------------------------------
int __cdecl sub_5510(unsigned int a1, unsigned int a2)
{
  unsigned int v2; // esi@1
  int result; // eax@1
	  v2 = a1;
  for ( result = 0; v2 < a2; v2 += 4 )
  {
    if ( result )
      break;
    if ( *(_DWORD *)v2 )
      result = (*(int (**)(void))v2)();
  }
  return result;
}
	//----- (00005540) --------------------------------------------------------
unsigned int __fastcall sub_5540(int a1, int a2, int a3, unsigned int a4)
{
  unsigned int result; // eax@1
  unsigned int v5; // edx@1
	  result = *(_DWORD *)(a3 + 8);
  v5 = *(_DWORD *)(a3 + 4);
  if ( result <= v5 && v5 - result >= a4 )
  {
    result += a4;
    *(_DWORD *)(a3 + 8) = result;
  }
  else
  {
    *(_DWORD *)(a3 + 8) = v5 + 1;
  }
  return result;
}
	//----- (00005580) --------------------------------------------------------
int __usercall sub_5580<eax>(int a1<eax>, int a2<edx>, int a3<ecx>, int a4<ebx>, int a5<edi>, int a6<esi>, char a7)
{
  if ( a3 == v3EDA03C )
    __asm { rep retn }
  return sub_5270(
           (unsigned int)a3 < v3EDA03C,
           a3 == v3EDA03C,
           a3 - v3EDA03C < 0,
           __OFSUB__(a3, v3EDA03C),
           a1,
           a2,
           a3,
           a4,
           a5,
           a6,
           a7);
}
	//----- (00005704) --------------------------------------------------------
void *__cdecl sub_5704(void *a1, unsigned __int8 a2, unsigned int a3)
{
  int v3; // edi@1
  unsigned int v4; // eax@1
  int v5; // eax@1
  unsigned int v6; // ecx@1
  int v7; // ecx@3
	  v3 = (int)a1;
  v4 = a2;
  BYTE1(v4) = a2;
  v5 = v4 | _byteswap_ulong(v4);
  v6 = a3 >> 2;
  if ( a3 >> 2 )
  {
    memset32(a1, v5, v6);
    v3 = (int)((char *)a1 + 4 * v6);
    v6 = 0;
  }
  LOBYTE(v6) = 3;
  v7 = a3 & v6;
  if ( v7 )
  {
    while ( v7 )
    {
      *MK_FP(__ES__, v3++) = v5;
      --v7;
    }
  }
  return a1;
}
	//----- (00005730) --------------------------------------------------------
int __fastcall sub_5730(int a1, int a2, int a3, int a4)
{
  unsigned int v4; // edx@1
  unsigned int v5; // esi@1
  int result; // eax@2
	  v4 = *(_DWORD *)(a3 + 8);
  v5 = *(_DWORD *)(a3 + 4);
  if ( v4 <= v5 && (result = v5 - v4, v5 - v4 >= 1) )
  {
    result = *(_DWORD *)a3;
    *(_BYTE *)(v4 + *(_DWORD *)a3) = *(_BYTE *)a4;
    ++*(_DWORD *)(a3 + 8);
  }
  else
  {
    *(_DWORD *)(a3 + 8) = v5 + 1;
  }
  return result;
}
	//----- (000057D0) --------------------------------------------------------
int __fastcall sub_57D0(int a1, int a2, int a3, int a4, unsigned int a5)
{
  unsigned int v5; // esi@1
  int v6; // eax@2
  char v7; // dl@2
  int v8; // edi@2
  int v9; // eax@2
  int result; // eax@2
	  v5 = 0;
  if ( a5 )
  {
    do
    {
      ++*(_BYTE *)(a3 + 256);
      v6 = *(_BYTE *)(a3 + 256);
      *(_BYTE *)(a3 + 257) += *(_BYTE *)(v6 + a3);
      v7 = *(_BYTE *)(v6 + a3);
      v8 = v6 + a3;
      v9 = *(_BYTE *)(a3 + 257);
      *(_BYTE *)v8 = *(_BYTE *)(v9 + a3);
      *(_BYTE *)(a3 + v9) = v7;
      ++v5;
      result = a4;
      *(_BYTE *)(v5 + result - 1) ^= *(_BYTE *)((unsigned __int8)(*(_BYTE *)(*(_BYTE *)(a3 + 256) + a3)
                                                                + *(_BYTE *)(*(_BYTE *)(a3 + 257) + a3))
                                              + a3);
    }
    while ( v5 < a5 );
  }
  return result;
}
	//----- (0000583F) --------------------------------------------------------
char __fastcall sub_583F(int a1, int a2, int a3, int a4, unsigned int a5)
{
  int v5; // esi@1
  unsigned int v6; // eax@1
	  v5 = a3;
  LOBYTE(v6) = sub_6F20(a1, a2, a3, a5);
  if ( (_BYTE)v6 )
  {
    v6 = 0;
    if ( a5 )
    {
      do
        *(_BYTE *)(v6++ + a4) = *(_BYTE *)((*(_DWORD *)(v5 + 8))++ + *(_DWORD *)v5);
      while ( v6 < a5 );
    }
  }
  return v6;
}
	//----- (000058A1) --------------------------------------------------------
unsigned int __fastcall sub_58A1(int a1, int a2, int a3, unsigned int a4, unsigned int a5)
{
  unsigned int result; // eax@1
  signed int v6; // edx@1
	  result = a4;
  v6 = 7;
  do
  {
    *(_BYTE *)(v6 + a3) = result;
    result = __PAIR__(a5, result) >> 8;
    --v6;
    a5 >>= 8;
  }
  while ( v6 >= 0 );
  return result;
}
	//----- (000058E8) --------------------------------------------------------
char __fastcall sub_58E8(int a1, int a2, int a3)
{
  return sub_583F(a1, a2, a3, a2, 0x20u);
}
	//----- (0000595D) --------------------------------------------------------
void __cdecl sub_595D(int a1, int a2, int a3)
{
  JUMPOUT(0xA290000u);
}
	//----- (00005990) --------------------------------------------------------
int __fastcall sub_5990(int a1, int a2, int a3)
{
  int v3; // esi@1
  int result; // eax@1
  int v5; // eax@2
  int v6; // [sp+4h] [bp-4h]@1
	  v3 = a3;
  result = (**(int (__stdcall ***)(_DWORD))a3)(24);
  v6 = result;
  if ( result )
  {
    v5 = sub_5F90(24, result);
    if ( v5 )
    {
      *(_DWORD *)(v5 + 8) = 65871842;
      *(_DWORD *)(v5 + 12) = 65887278;
      *(_DWORD *)v5 = 65901572;
      *(_DWORD *)(v5 + 4) = v3;
      *(_DWORD *)(v5 + 16) = 65884740;
      *(_DWORD *)(v5 + 20) = 0;
    }
    result = v6;
  }
  return result;
}
	//----- (000059F0) --------------------------------------------------------
signed int __cdecl sub_59F0(int a1)
{
  int v1; // esi@1
  unsigned int v2; // edx@3
  signed int v3; // eax@3
  signed int result; // eax@7
  int v5; // eax@8
  int v6; // eax@9
	  v1 = a1 - 65863680;
  if ( a1 - 65863680 < 0 || (unsigned int)v1 > v3ED000C )
  {
    result = 0;
  }
  else
  {
    v2 = 0;
    v3 = 65863748;
    if ( !v3ED0040 )
      goto LABEL_7;
    while ( (unsigned int)v1 < *(_DWORD *)v3 || v1 >= (unsigned int)(*(_DWORD *)v3 + *(_DWORD *)(v3 + 4)) )
    {
      ++v2;
      v3 += 12;
      if ( v2 >= v3ED0040 )
        goto LABEL_7;
    }
    v5 = *(_DWORD *)(v3 + 8) - 2;
    if ( v5 && (v6 = v5 - 14) != 0 && v6 != 16 )
LABEL_7:
      result = 0;
    else
      result = 1;
  }
  return result;
}
	//----- (00005A70) --------------------------------------------------------
int __fastcall sub_5A70(int a1, int a2, int a3)
{
  int v3; // esi@1
  int v4; // eax@1
  int v5; // eax@2
  int v6; // edx@2
  int result; // eax@3
	  v3 = a3;
  v4 = (**(int (__stdcall ***)(_DWORD))a3)(60);
  if ( v4 && (v5 = sub_5F90(60, v4)) != 0 )
    result = sub_3A00(v5, v6, v5, v3);
  else
    result = 0;
  return result;
}
	//----- (00005A9C) --------------------------------------------------------
int __fastcall sub_5A9C(int a1, int a2, int a3)
{
  int result; // eax@1
	  result = a3;
  *(_DWORD *)(a3 + 32) = 0;
  *(_BYTE *)(a3 + 36) = 0;
  return result;
}
	//----- (00005F00) --------------------------------------------------------
unsigned int __fastcall sub_5F00(int a1, int a2, int a3, int a4)
{
  int v4; // esi@1
  int v5; // ST04_4@1
  int v6; // edx@1
  int v7; // eax@1
  int v8; // edx@1
  unsigned int result; // eax@1
  unsigned int *v10; // ecx@1
  unsigned __int32 v11; // [sp+Ch] [bp-Ch]@1
  int v12; // [sp+10h] [bp-8h]@1
  unsigned int v13; // [sp+14h] [bp-4h]@1
  int v14; // [sp+18h] [bp+0h]@1
	  v13 = (unsigned int)&v14 ^ v3EDA03C;
  v4 = a3;
  v5 = ((-9 - (unsigned __int8)(*(_QWORD *)a3 >> 3)) & 0x3F) + 1;
  v6 = _byteswap_ulong(*(_QWORD *)a3);
  v11 = _byteswap_ulong(*(_DWORD *)(a3 + 4));
  v12 = v6;
  v7 = sub_3D00(v5, v6, a3, (unsigned int *)0x3ED90D0, v5);
  sub_3D00(v7, v8, v4, (unsigned int *)&v11, 8);
  result = 0;
  v10 = (unsigned int *)(v4 + 8);
  do
  {
    *(_DWORD *)(a4 + 4 * result++) = _byteswap_ulong(*v10);
    ++v10;
  }
  while ( result < 8 );
  return result;
}
	//----- (00005F90) --------------------------------------------------------
int __cdecl sub_5F90(int a1, int a2)
{
  return a2;
}
	//----- (00005FA0) --------------------------------------------------------
char __fastcall sub_5FA0(int a1, int a2, int a3, int a4)
{
  int v4; // ebx@1
  int v5; // esi@1
  int v6; // ecx@1
  int v7; // eax@1
  int v8; // edx@1
  int v9; // ecx@2
  int v10; // ecx@6
  char result; // al@9
  int v12; // edi@10
  int v13; // eax@10
  int v14; // ecx@12
  int v15; // eax@12
  int v16; // edx@12
  int v17; // [sp+Ch] [bp-4h]@4
  int v18; // [sp+18h] [bp+8h]@1
  int v19; // [sp+18h] [bp+8h]@12
	  v4 = a4;
  v5 = a3;
  *(_BYTE *)(a3 + 12) = 0;
  *(_DWORD *)(a3 + 16) = 5;
  v6 = *(_DWORD *)(a4 + 8);
  v7 = *(_DWORD *)(a4 + 4) - v6;
  v8 = v6 + *(_DWORD *)a4;
  v18 = 0;
  if ( (unsigned int)v7 >= 2 )
  {
    v18 = *(_WORD *)v8;
    v9 = 2;
  }
  else
  {
    v9 = v7 + 1;
  }
  v17 = 0;
  if ( v9 <= (unsigned int)v7 && (unsigned int)(v7 - v9) >= 4 )
  {
    v17 = *(_DWORD *)(v9 + v8);
    v10 = v9 + 4;
  }
  else
  {
    v10 = v7 + 1;
  }
  if ( v10 <= (unsigned int)v7 )
  {
    v12 = (unsigned __int16)v18;
    v13 = v7 - v10;
    if ( v13 >= (unsigned int)(unsigned __int16)v18 )
    {
      v14 = v8 + v10;
      v16 = (unsigned __int16)v18;
      v19 = v14;
      v15 = sub_3CA0(v13, v16, v14);
      if ( v17 == v15 )
      {
        *(_DWORD *)(v5 + 4) = v12;
        *(_DWORD *)v5 = v19;
        *(_DWORD *)(v5 + 8) = 0;
        sub_5540(v15, v19, v4, v12 + 6);
        result = 1;
        *(_DWORD *)(v5 + 16) = 0;
        *(_BYTE *)(v5 + 12) = 1;
      }
      else
      {
        sub_5540(v15, v16, v4, v12 + 6);
        *(_DWORD *)(v5 + 16) = 3;
        result = 0;
      }
    }
    else
    {
      *(_DWORD *)(v5 + 16) = 2;
      result = 0;
    }
  }
  else
  {
    *(_DWORD *)(v5 + 16) = 1;
    result = 0;
  }
  return result;
}
	//----- (000060F0) --------------------------------------------------------
int __fastcall sub_60F0(int a1, int a2, int a3, char a4)
{
  int result; // eax@1
  unsigned int v5; // edx@1
  unsigned int v6; // esi@1
	  result = *(_DWORD *)(a3 + 12);
  v5 = *(_DWORD *)(result + 8);
  v6 = *(_DWORD *)(result + 4);
  if ( v5 <= v6 && v6 - v5 >= 1 )
  {
    *(_BYTE *)(v5 + *(_DWORD *)result) = a4;
    ++*(_DWORD *)(result + 8);
  }
  else
  {
    *(_DWORD *)(result + 8) = v6 + 1;
  }
  return result;
}
	//----- (00006D70) --------------------------------------------------------
int __fastcall sub_6D70(int a1, int a2, int a3, int a4)
{
  int v4; // eax@1
  unsigned int v5; // edx@1
  unsigned int v6; // esi@1
  int v7; // eax@5
  unsigned int v8; // esi@5
  unsigned int v9; // edi@5
  int v10; // eax@7
  int result; // eax@7
  int v12; // eax@8
	  *(_DWORD *)(a3 + 12) = a4;
  *(_DWORD *)(a3 + 16) = a4;
  *(_DWORD *)(a3 + 20) = *(_DWORD *)(a4 + 8);
  v4 = *(_DWORD *)(a3 + 12);
  v5 = *(_DWORD *)(v4 + 8);
  v6 = *(_DWORD *)(v4 + 4);
  if ( v5 <= v6 && v6 - v5 >= 2 )
  {
    *(_WORD *)(v5 + *(_DWORD *)v4) = 0;
    *(_DWORD *)(v4 + 8) += 2;
  }
  else
  {
    *(_DWORD *)(v4 + 8) = v6 + 1;
  }
  v7 = *(_DWORD *)(a3 + 12);
  v8 = *(_DWORD *)(v7 + 8);
  v9 = *(_DWORD *)(v7 + 4);
  if ( v8 <= v9 && v9 - v8 >= 4 )
  {
    *(_DWORD *)(v8 + *(_DWORD *)v7) = 0;
    *(_DWORD *)(v7 + 8) += 4;
    v12 = *(_DWORD *)(a3 + 12);
    *(_DWORD *)(a3 + 24) = v12;
    result = *(_DWORD *)(v12 + 8);
    *(_DWORD *)(a3 + 28) = result;
  }
  else
  {
    *(_DWORD *)(v7 + 8) = v9 + 1;
    v10 = *(_DWORD *)(a3 + 12);
    *(_DWORD *)(a3 + 24) = v10;
    result = *(_DWORD *)(v10 + 8);
    *(_DWORD *)(a3 + 28) = result;
  }
  return result;
}
	//----- (00006E00) --------------------------------------------------------
int __usercall sub_6E00<eax>(int a1<esi>)
{
  int result; // eax@3
  int v2; // eax@4
  int v3; // esi@4
  int v4; // esi@4
  int v5; // esi@4
  int v6; // esi@4
  int v7; // [sp+0h] [bp-10h]@4
  int v8; // [sp+4h] [bp-Ch]@4
  int v9; // [sp+8h] [bp-8h]@1
  int v10; // [sp+Ch] [bp-4h]@1
	  v9 = 0;
  v10 = 0;
  if ( v3EDA03C != -1153374642 && v3EDA03C & 0xFFFF0000 )
  {
    result = ~v3EDA03C;
    v3EDA040 = ~v3EDA03C;
  }
  else
  {
    v2 = v3ED906C(&v9, a1);
    v3 = v3ED9068(v2) ^ v9 ^ v10;
    v4 = v3ED9064() ^ v3;
    v5 = v3ED9024() ^ v4;
    result = v3ED9060(&v7);
    v6 = v7 ^ v8 ^ v5;
    if ( v6 == -1153374642 )
    {
      v3EDA03C = -1153374641;
      v3EDA040 = 1153374640;
    }
    else
    {
      if ( !(v6 & 0xFFFF0000) )
      {
        result = v6 << 16;
        v6 |= v6 << 16;
      }
      v3EDA03C = v6;
      v3EDA040 = ~v6;
    }
  }
  return result;
}
// 3ED9024: using guessed type int (*)(void);
// 3ED9060: using guessed type int (__stdcall *)(_DWORD);
// 3ED9064: using guessed type int (*)(void);
// 3ED9068: using guessed type int (__fastcall *)(_DWORD);
// 3ED906C: using guessed type int (__stdcall *)(_DWORD, _DWORD);
	//----- (00006EA9) --------------------------------------------------------
char __fastcall sub_6EA9(int a1, int a2, int a3, int a4)
{
  unsigned int v4; // kr00_4@1
	  v4 = strlen((const char *)a4);
  return sub_1346(v4, a4 + 1, a3, a4, v4);
}
	//----- (00006ECA) --------------------------------------------------------
char __fastcall sub_6ECA(int a1, int a2, int a3, int a4, int a5)
{
  int v5; // eax@1
  int v6; // eax@1
  int v8; // eax@4
  int v9; // esi@6
  __int64 v10; // qax@6
  int v11; // [sp+4h] [bp-4h]@1
	  v5 = *(_DWORD *)(a3 + 32);
  v11 = 0;
  v6 = v5 - 1;
  if ( v6 )
  {
    if ( v6 != 1 )
      return 0;
    v8 = (*(int (__stdcall **)(int, int *))(a3 + 20))(a4, &v11);
  }
  else
  {
    v8 = (*(int (__stdcall **)(int, int *))(a3 + 4))(a4, &v11);
  }
  v9 = v8;
  LODWORD(v10) = v8430(v11, 0, 0, 1);
  *(_QWORD *)a5 = (unsigned int)v9 + v10;
  return 1;
}
	//----- (00006F20) --------------------------------------------------------
char __fastcall sub_6F20(int a1, int a2, int a3, unsigned int a4)
{
  unsigned int v4; // edx@1
  unsigned int v5; // eax@1
  char result; // al@3
	  v4 = *(_DWORD *)(a3 + 8);
  v5 = *(_DWORD *)(a3 + 4);
  if ( v4 > v5 || v5 - v4 < a4 )
  {
    *(_DWORD *)(a3 + 8) = v5 + 1;
    result = 0;
  }
  else
  {
    result = 1;
  }
  return result;
}
	//----- (00006F50) --------------------------------------------------------
char __fastcall sub_6F50(int a1, int (__cdecl *a2)(_DWORD), int a3, int a4, int a5)
{
  int v6; // [sp-10h] [bp-28h]@1
  int *v7; // [sp+0h] [bp-18h]@1
  int v8; // [sp+8h] [bp-10h]@1
  signed int v9; // [sp+Ch] [bp-Ch]@1
  int v10; // [sp+10h] [bp-8h]@1
  int v11; // [sp+14h] [bp-4h]@1
  int v12; // [sp+18h] [bp+0h]@1
	  v9 = 65886887;
  v8 = a1;
  v10 = v3EDA03C ^ 0x3ED9510;
  v7 = &v6;
  v11 = 0;
  *(_DWORD *)a3 = a2((unsigned int)&v12 ^ v3EDA03C);
  return 1;
}
	//----- (00006FE0) --------------------------------------------------------
char __fastcall sub_6FE0(int a1, int a2, int a3, int a4)
{
  unsigned int v4; // eax@1
  unsigned int v5; // edx@1
	  *(_BYTE *)a4 = 0;
  v4 = *(_DWORD *)(a3 + 8);
  v5 = *(_DWORD *)(a3 + 4);
  if ( v4 <= v5 && v5 - v4 >= 1 )
  {
    LOBYTE(v4) = *(_BYTE *)(v4 + *(_DWORD *)a3);
    *(_BYTE *)a4 = v4;
    ++*(_DWORD *)(a3 + 8);
  }
  else
  {
    *(_DWORD *)(a3 + 8) = v5 + 1;
  }
  return v4;
}
	//----- (000070C0) --------------------------------------------------------
signed int __fastcall sub_70C0(int a1, int a2, int a3, int a4, int a5)
{
  char v5; // dl@3
  unsigned int v6; // eax@4
  unsigned int v7; // ecx@4
  unsigned int v8; // eax@9
  unsigned int v9; // ecx@9
  int v10; // ebx@9
  unsigned int v11; // eax@15
  unsigned int v12; // ecx@15
  signed int result; // eax@21
  int v14; // esi@22
  int v15; // [sp+Ch] [bp-10Ch]@1
  int v16; // [sp+10h] [bp-108h]@0
  char v17; // [sp+14h] [bp-104h]@2
  unsigned int v18; // [sp+114h] [bp-4h]@1
  int v19; // [sp+118h] [bp+0h]@1
	  v18 = (unsigned int)&v19 ^ v3EDA03C;
  v15 = a3;
  if ( *(_BYTE *)(a4 + 12) )
    sub_2E90((int)&v17, a2, a4, (int)&v17, 0x100u);
  v5 = *(_BYTE *)(a4 + 12);
  if ( v5
    && ((v6 = *(_DWORD *)(a4 + 8), v7 = *(_DWORD *)(a4 + 4), v16 = 0, v6 <= v7) && v7 - v6 >= 4 ? (v16 = *(_DWORD *)(v6 + *(_DWORD *)a4),
                                                                                                   *(_DWORD *)(a4 + 8) = v6 + 4) : (*(_DWORD *)(a4 + 8) = v7 + 1),
        v5) )
  {
    v8 = *(_DWORD *)(a4 + 8);
    v9 = *(_DWORD *)(a4 + 4);
    v10 = 0;
    if ( v8 <= v9 && v9 - v8 >= 4 )
    {
      v10 = *(_DWORD *)(v8 + *(_DWORD *)a4);
      *(_DWORD *)(a4 + 8) = v8 + 4;
    }
    else
    {
      *(_DWORD *)(a4 + 8) = v9 + 1;
    }
  }
  else
  {
    v10 = v16;
  }
  if ( *(_BYTE *)(a4 + 12)
    && ((v11 = *(_DWORD *)(a4 + 8), v12 = *(_DWORD *)(a4 + 4), v11 <= v12) && v12 - v11 >= 1 ? (*(_DWORD *)(a4 + 8) = v11 + 1) : (*(_DWORD *)(a4 + 8) = v12 + 1),
        *(_BYTE *)(a4 + 12) && *(_DWORD *)(a4 + 8) <= *(_DWORD *)(a4 + 4)) )
  {
    *(_DWORD *)v15 = 0;
    *(_DWORD *)(v15 + 4) = 0;
    v14 = (*(int (__fastcall **)(int, _DWORD, int, int))(*(_DWORD *)a5 + 4))(
            v17 != 0 ? (int)&v17 : 0,
            *(_DWORD *)(*(_DWORD *)a5 + 4),
            a5,
            v17 != 0 ? (int)&v17 : 0);
    if ( v14 )
    {
      if ( v16 )
      {
        *(_DWORD *)v15 = (*(int (__fastcall **)(_DWORD, _DWORD, int, int, int))(*(_DWORD *)a5 + 8))(
                           *(_DWORD *)(*(_DWORD *)a5 + 8),
                           *(_DWORD *)a5,
                           a5,
                           v14,
                           v16);
        *(_DWORD *)(v15 + 4) = (*(int (__fastcall **)(_DWORD, _DWORD, int, int, int))(*(_DWORD *)a5 + 8))(
                                 *(_DWORD *)(*(_DWORD *)a5 + 8),
                                 *(_DWORD *)a5,
                                 a5,
                                 v14,
                                 v10);
      }
    }
    result = 0;
  }
  else
  {
    result = 3;
  }
  return result;
}
	//----- (00007340) --------------------------------------------------------
void __cdecl sub_7340(unsigned int a1, unsigned int a2)
{
  unsigned int i; // esi@1
	  for ( i = a1; i < a2; i += 4 )
  {
    if ( *(_DWORD *)i )
      (*(void (**)(void))i)();
  }
}
	//----- (00007363) --------------------------------------------------------
char __fastcall sub_7363(int a1, int a2, int a3)
{
  return sub_1444(a1, a2, a3, a2, 0x14u);
}
	//----- (000074A0) --------------------------------------------------------
int __fastcall sub_74A0(int a1, unsigned int *a2, int a3)
{
  signed int v3; // eax@1
  char *v4; // eax@3
  unsigned int v5; // edx@4
  int v6; // edi@4
  int v7; // ebx@4
  int v8; // edi@4
  int v9; // esi@4
  int v10; // ebx@4
  int v11; // esi@4
  int v12; // edx@4
  int v13; // edi@4
  unsigned __int8 v14; // sf@4
  unsigned __int8 v15; // of@4
  int v16; // ebx@5
  int v17; // esi@5
  int v18; // edi@5
  int v19; // edx@5
  int v20; // eax@5
  int v21; // ebx@5
  int v22; // ecx@5
  int v23; // ecx@7
  int v24; // ebx@7
  int v25; // ecx@7
  int v26; // ebx@7
  int v27; // ecx@7
  int v28; // eax@7
  int v29; // edi@7
  int v30; // ebx@7
  int v31; // edi@7
  int v32; // ebx@7
  int v33; // ecx@7
  int v34; // edi@7
  int v35; // ecx@7
  int v36; // edi@7
  int v37; // ecx@7
  int v38; // edx@7
  int v39; // ebx@7
  int v40; // ecx@7
  int v41; // ebx@7
  int v42; // ecx@7
  int v43; // ecx@7
  int v44; // edi@7
  int v45; // ecx@7
  int v46; // edi@7
  int v47; // ecx@7
  int v48; // edi@7
  int v49; // ebx@7
  int v50; // edi@7
  int v51; // ebx@7
  int v52; // ecx@7
  int v53; // esi@7
  int v54; // ebx@7
  int v55; // esi@7
  int v56; // ebx@7
  int v57; // esi@7
  int v58; // edi@7
  int v59; // esi@7
  int v60; // edi@7
  int v61; // esi@7
  int v62; // edi@7
  int v63; // ebx@7
  int v64; // edi@7
  int v65; // ebx@7
  int v66; // esi@7
  int v67; // esi@7
  int v68; // edi@7
  int v69; // esi@7
  int v70; // edi@7
  int v71; // edi@7
  int v72; // ebx@7
  int v73; // edi@7
  int v74; // ebx@7
  int v75; // esi@7
  int v76; // edi@7
  int v77; // edx@7
  int v78; // edi@7
  int v79; // edx@7
  int v80; // edi@7
  int v81; // ebx@7
  int v82; // edi@7
  int v83; // ebx@7
  int v84; // ecx@7
  int v85; // esi@7
  int v86; // edi@7
  int v87; // esi@7
  int v88; // edi@7
  int v89; // esi@7
  int v90; // edi@7
  int v91; // esi@7
  int v92; // edi@7
  int v93; // esi@7
  int v94; // esi@7
  int v95; // edi@7
  int v96; // esi@7
  int v97; // edi@7
  char v98; // cf@7
  int v99; // edi@8
  int v100; // ebx@8
  int v101; // esi@8
  int v102; // ecx@8
  int v103; // edx@8
  int v104; // ecx@8
  int v105; // eax@8
  int v106; // ecx@8
  int v107; // eax@8
  int v108; // edx@8
  int result; // eax@8
  char v110[8]; // [sp+4h] [bp-134h]@3
  int v111; // [sp+Ch] [bp-12Ch]@2
  int v112; // [sp+10h] [bp-128h]@7
  int v113; // [sp+14h] [bp-124h]@7
  int v114; // [sp+18h] [bp-120h]@7
  int v115; // [sp+1Ch] [bp-11Ch]@7
  int v116; // [sp+20h] [bp-118h]@7
  int v117; // [sp+24h] [bp-114h]@7
  int v118[57]; // [sp+28h] [bp-110h]@7
  int v119; // [sp+10Ch] [bp-2Ch]@1
  int v120; // [sp+110h] [bp-28h]@7
  int v121; // [sp+114h] [bp-24h]@5
  int v122; // [sp+118h] [bp-20h]@3
  int v123; // [sp+11Ch] [bp-1Ch]@7
  int v124; // [sp+120h] [bp-18h]@5
  unsigned int v125; // [sp+124h] [bp-14h]@5
  int v126; // [sp+128h] [bp-10h]@5
  int v127; // [sp+12Ch] [bp-Ch]@5
  int v128; // [sp+130h] [bp-8h]@5
  int v129; // [sp+134h] [bp-4h]@7
	  v119 = a3;
  v3 = 0;
  do
  {
    *(&v111 + v3++) = _byteswap_ulong(*a2);
    ++a2;
  }
  while ( v3 < 16 );
  v122 = v3;
  v4 = &v110[4 * v3];
  do
  {
    v5 = *((_DWORD *)v4 - 13);
    v6 = __ROR__(*(_DWORD *)v4, 19);
    v7 = __ROR__(*(_DWORD *)v4, 17);
    v8 = (*(_DWORD *)v4 >> 10) ^ v7 ^ v6;
    v9 = __ROR__(v5, 18);
    v10 = __ROR__(*((_DWORD *)v4 - 13), 7);
    v11 = (v5 >> 3) ^ v10 ^ v9;
    v12 = v122 + 1;
    v13 = *((_DWORD *)v4 - 5) + *((_DWORD *)v4 - 14) + v11 + v8;
    v4 += 4;
    v15 = __OFSUB__(v122 + 1, 64);
    v14 = v122 - 63 < 0;
    *((_DWORD *)v4 + 1) = v13;
    v122 = v12;
  }
  while ( v14 ^ v15 );
  v16 = *(_DWORD *)(a3 + 20);
  v17 = *(_DWORD *)a3;
  v18 = *(_DWORD *)(a3 + 16);
  v19 = *(_DWORD *)(a3 + 8);
  v124 = *(_DWORD *)(a3 + 4);
  v20 = *(_DWORD *)(a3 + 12);
  v122 = v16;
  v21 = *(_DWORD *)(a3 + 24);
  v22 = *(_DWORD *)(a3 + 28);
  v121 = v17;
  v127 = v18;
  v128 = v21;
  v126 = v22;
  v125 = 0;
  while ( 1 )
  {
    v23 = __ROR__(v18, 25);
    v24 = __ROR__(v18, 11);
    v25 = v24 ^ v23;
    v26 = __ROR__(v18, 6);
    v120 = v26 ^ v25;
    v27 = v126
        + *(int *)((char *)&v111 + v125)
        + *(_DWORD *)(v125 + 65900816)
        + (v18 & v122 ^ v128 & ~v18)
        + (v26 ^ v25);
    v28 = v27 + v20;
    v129 = v27;
    v120 = v17 & v124;
    v123 = v17 ^ v124;
    v29 = __ROR__(v17, 22);
    v30 = __ROR__(v17, 13);
    v31 = v30 ^ v29;
    v32 = __ROR__(v17, 2);
    v126 = v27 + (v32 ^ v31) + (v17 & v124 ^ v19 & (v17 ^ v124));
    v33 = __ROR__(v28, 25);
    v34 = __ROR__(v28, 11);
    v35 = v34 ^ v33;
    v36 = __ROR__(v28, 6);
    v37 = v128
        + *(_DWORD *)(v125 + 65900820)
        + *(int *)((char *)&v112 + v125)
        + (v28 & v127 ^ v122 & ~v28)
        + (v36 ^ v35);
    v38 = v37 + v19;
    v129 = v37;
    v39 = __ROR__(v126, 22);
    v40 = __ROR__(v126, 13);
    v41 = v40 ^ v39;
    v42 = __ROR__(v126, 2);
    v128 = v129 + (v42 ^ v41) + (v17 & v124 ^ v126 & (v17 ^ v124));
    v43 = __ROR__(v38, 25);
    v44 = __ROR__(v38, 11);
    v45 = v44 ^ v43;
    v46 = __ROR__(v38, 6);
    v47 = v122 + *(_DWORD *)(v125 + 65900824) + *(int *)((char *)&v113 + v125) + (v38 & v28 ^ v127 & ~v38) + (v46 ^ v45);
    v124 += v47;
    v129 = v47;
    v48 = __ROR__(v128, 22);
    v49 = __ROR__(v128, 13);
    v50 = v49 ^ v48;
    v51 = __ROR__(v128, 2);
    v52 = v47 + (v51 ^ v50) + (v17 & v128 ^ v126 & (v17 ^ v128));
    v53 = __ROR__(v124, 25);
    v54 = __ROR__(v124, 11);
    v55 = v54 ^ v53;
    v56 = __ROR__(v124, 6);
    v123 = v56 ^ v55;
    v57 = v127
        + *(_DWORD *)(v125 + 65900828)
        + *(int *)((char *)&v114 + v125)
        + (v124 & v38 ^ v28 & ~v124)
        + (v56 ^ v55);
    v121 += v57;
    v129 = v57;
    v58 = __ROR__(v52, 22);
    v59 = __ROR__(v52, 13);
    v60 = v59 ^ v58;
    v61 = __ROR__(v52, 2);
    v127 = v129 + (v61 ^ v60) + (v52 & v128 ^ v126 & (v52 ^ v128));
    v62 = __ROR__(v121, 25);
    v63 = __ROR__(v121, 11);
    v64 = v63 ^ v62;
    v65 = __ROR__(v121, 6);
    v123 = v65 ^ v64;
    v66 = v28
        + *(_DWORD *)(v125 + 65900832)
        + *(int *)((char *)&v115 + v125)
        + (v121 & v124 ^ v38 & ~v121)
        + (v65 ^ v64);
    v126 += v66;
    v129 = v66;
    v67 = __ROR__(v127, 22);
    v68 = __ROR__(v127, 13);
    v69 = v68 ^ v67;
    v70 = __ROR__(v127, 2);
    v20 = v129 + (v70 ^ v69) + (v127 & v52 ^ v128 & (v127 ^ v52));
    v71 = __ROR__(v126, 25);
    v72 = __ROR__(v126, 11);
    v73 = v72 ^ v71;
    v74 = __ROR__(v126, 6);
    v123 = v74 ^ v73;
    v75 = v38
        + *(_DWORD *)(v125 + 65900836)
        + *(int *)((char *)&v116 + v125)
        + (v121 & v126 ^ v124 & ~v126)
        + (v74 ^ v73);
    v128 += v75;
    v76 = __ROR__(v20, 22);
    v77 = __ROR__(v20, 13);
    v78 = v77 ^ v76;
    v79 = __ROR__(v20, 2);
    v19 = v75 + (v79 ^ v78) + (v20 & v127 ^ v52 & (v20 ^ v127));
    v80 = __ROR__(v128, 25);
    v81 = __ROR__(v128, 11);
    v82 = v81 ^ v80;
    v83 = __ROR__(v128, 6);
    v123 = v83 ^ v82;
    v84 = v124
        + *(_DWORD *)(v125 + 65900840)
        + *(int *)((char *)&v117 + v125)
        + (v128 & v126 ^ v121 & ~v128)
        + (v83 ^ v82)
        + v52;
    v129 = v124
         + *(_DWORD *)(v125 + 65900840)
         + *(int *)((char *)&v117 + v125)
         + (v128 & v126 ^ v121 & ~v128)
         + (v83 ^ v82);
    v85 = __ROR__(v19, 22);
    v86 = __ROR__(v19, 13);
    v87 = v86 ^ v85;
    v88 = __ROR__(v19, 2);
    v122 = v84;
    v124 = v129 + (v88 ^ v87) + (v19 & v20 ^ v127 & (v19 ^ v20));
    v89 = __ROR__(v84, 25);
    v90 = __ROR__(v84, 11);
    v91 = v90 ^ v89;
    v92 = __ROR__(v84, 6);
    v93 = v121 + *(_DWORD *)(v125 + 65900844) + v118[v125 / 4] + (v84 & v128 ^ v126 & ~v84) + (v92 ^ v91);
    v127 += v93;
    v129 = v93;
    v94 = __ROR__(v124, 22);
    v95 = __ROR__(v124, 13);
    v96 = v95 ^ v94;
    v97 = __ROR__(v124, 2);
    v17 = (v124 & v19 ^ v20 & (v124 ^ v19)) + v129 + (v97 ^ v96);
    v98 = v125 + 32 < 0x100;
    v121 = v17;
    v125 += 32;
    if ( !v98 )
      break;
    v18 = v127;
  }
  v99 = v119;
  v100 = v17 + *(_DWORD *)v119;
  v101 = v124 + *(_DWORD *)(v119 + 4);
  v102 = v19 + *(_DWORD *)(v119 + 8);
  v103 = v122;
  *(_DWORD *)(v119 + 8) = v102;
  v104 = v20 + *(_DWORD *)(v99 + 12);
  v105 = *(_DWORD *)(v99 + 16);
  *(_DWORD *)(v99 + 12) = v104;
  v106 = v128;
  *(_DWORD *)(v99 + 16) = v127 + v105;
  v107 = v103 + *(_DWORD *)(v99 + 20);
  v108 = v126;
  *(_DWORD *)(v99 + 20) = v107;
  *(_DWORD *)(v99 + 24) += v106;
  result = v108 + *(_DWORD *)(v99 + 28);
  *(_DWORD *)v99 = v100;
  *(_DWORD *)(v99 + 4) = v101;
  *(_DWORD *)(v99 + 28) = result;
  return result;
}
// 74A0: using guessed type char var_134[8];
// 74A0: using guessed type int var_110[57];
	//----- (00007AA0) --------------------------------------------------------
unsigned int __fastcall sub_7AA0(int a1, int a2, int a3)
{
  int v3; // esi@1
  int v4; // eax@1
  int v5; // ecx@1
  unsigned __int16 v6; // dx@1
  unsigned __int16 v7; // bx@1
  int v8; // ecx@1
  unsigned int v9; // edx@1
  unsigned int v10; // edi@1
  int v11; // esi@5
  unsigned int result; // eax@5
  unsigned int v13; // edx@5
  int v14; // [sp+Ch] [bp-Ch]@1
  unsigned int v15; // [sp+10h] [bp-8h]@1
  int v16; // [sp+14h] [bp-4h]@1
	  v3 = a3;
  v4 = *(_DWORD *)(a3 + 12);
  v5 = *(_DWORD *)(a3 + 24);
  v6 = *(_WORD *)(v5 + 8) - *(_WORD *)(v3 + 28);
  v14 = v4;
  v15 = *(_DWORD *)(v4 + 8);
  *(_DWORD *)(v5 + 8) = *(_DWORD *)(v3 + 28);
  v7 = v6;
  v16 = sub_3CA0(*(_DWORD *)(v3 + 12), v6, **(_DWORD **)(v3 + 12) + *(_DWORD *)(*(_DWORD *)(v3 + 12) + 8));
  *(_DWORD *)(*(_DWORD *)(v3 + 16) + 8) = *(_DWORD *)(v3 + 20);
  v8 = *(_DWORD *)(v3 + 12);
  v9 = *(_DWORD *)(v8 + 8);
  v10 = *(_DWORD *)(v8 + 4);
  if ( v9 <= v10 && v10 - v9 >= 2 )
  {
    *(_WORD *)(v9 + *(_DWORD *)v8) = v7;
    *(_DWORD *)(v8 + 8) += 2;
  }
  else
  {
    *(_DWORD *)(v8 + 8) = v10 + 1;
  }
  v11 = *(_DWORD *)(v3 + 12);
  result = *(_DWORD *)(v11 + 8);
  v13 = *(_DWORD *)(v11 + 4);
  if ( result <= v13 && v13 - result >= 4 )
  {
    *(_DWORD *)(result + *(_DWORD *)v11) = v16;
    *(_DWORD *)(v11 + 8) += 4;
    result = v15;
    *(_DWORD *)(v14 + 8) = v15;
  }
  else
  {
    *(_DWORD *)(v11 + 8) = v13 + 1;
    *(_DWORD *)(v14 + 8) = v15;
  }
  return result;
}
	//----- (00007B60) --------------------------------------------------------
int __fastcall sub_7B60(int a1, int a2, int a3, int a4)
{
  int v4; // esi@1
  int v5; // eax@1
  int v6; // edx@1
  int v7; // eax@1
  int v8; // edx@1
  int v9; // eax@1
  int v10; // edx@1
  int v11; // eax@1
  int v12; // edx@1
  char v14; // [sp+8h] [bp-78h]@1
  char v15; // [sp+68h] [bp-18h]@1
  unsigned int v16; // [sp+7Ch] [bp-4h]@1
  int v17; // [sp+80h] [bp+0h]@1
	  v16 = (unsigned int)&v17 ^ v3EDA03C;
  v4 = a3;
  v5 = sub_109F((int)&v15, a2, a3, (int)&v15);
  sub_1EF0(v5, v6, (int)&v14);
  LOBYTE(v9) = sub_1346(v7, v8, (int)&v14, v4 + 160, 0x40u);
  LOBYTE(v11) = sub_1346(v9, v10, (int)&v14, (int)&v15, 0x14u);
  return sub_109F(v11, v12, (int)&v14, a4);
}
	//----- (00007BC2) --------------------------------------------------------
char __fastcall sub_7BC2(int a1, int a2, int a3)
{
  return sub_583F(a1, a2, a3, a2, 0x10u);
}
	//----- (00007C0D) --------------------------------------------------------
char __fastcall sub_7C0D(int a1, int a2, int a3, int a4, int a5, int a6)
{
  int v6; // edi@1
  int v7; // eax@1
  int v8; // ebx@1
  signed int v9; // esi@1
  int v10; // edx@1
  int v12; // edx@5
  int v13; // eax@6
  int v14; // edx@6
  int v15; // ebx@8
  char v16; // bl@15
  int v17; // eax@17
  int v18; // edx@17
  unsigned __int64 v19; // [sp+Ch] [bp-10h]@5
  int v20; // [sp+14h] [bp-8h]@1
  int v21; // [sp+18h] [bp-4h]@1
	  v6 = a6;
  v7 = *(_DWORD *)a6;
  v8 = a3;
  v9 = 16384;
  v20 = a3;
  a6 = (*(int (__fastcall **)(int, int, int, signed int))v7)(v7, a2, a6, 16384);
  if ( !(unsigned __int8)v8249(&v21, v10, v8, a4, &v21) )
  {
    (*(void (__fastcall **)(_DWORD, int, int, int))(*(_DWORD *)v6 + 4))(*(_DWORD *)v6, v10, v6, a6);
    return 0;
  }
  if ( !sub_6ECA((int)&v19, v10, v8, v21, (int)&v19) )
  {
    v13 = (*(int (__fastcall **)(_DWORD, int, int, int))(*(_DWORD *)v6 + 4))(*(_DWORD *)v6, v12, v6, a6);
    v82D3(v13, v14, v8, v21);
    return 0;
  }
  if ( v19 )
  {
    v15 = a5;
    while ( 1 )
    {
      if ( v19 <= (unsigned int)v9 )
        v9 = v19;
      if ( !(unsigned __int8)v8280(&a4, v12, v20, v21, a6, v9, &a4) || v9 != a4 )
        break;
      (**(void (__fastcall ***)(void (__fastcall **)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD), int, int, int, signed int))v15)(
        *(void (__fastcall ***)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD))v15,
        v12,
        v15,
        a6,
        v9);
      v19 -= (unsigned int)v9;
      if ( !v19 )
        goto LABEL_15;
      v9 = 16384;
    }
    v16 = 0;
  }
  else
  {
LABEL_15:
    v16 = 1;
  }
  v17 = (*(int (__fastcall **)(_DWORD, int, int, int))(*(_DWORD *)v6 + 4))(*(_DWORD *)v6, v12, v6, a6);
  v82D3(v17, v18, v20, v21);
  return v16;
}
	//----- (00007E52) --------------------------------------------------------
void __usercall sub_7E52(int a1<eax>, int a2<esi>)
{
  signed int v2; // ecx@1
  int v3; // ebx@2
  char *v4; // eax@3
  int v5; // edi@4
  int v6; // edi@5
  int v7; // eax@5
  int v8; // ebx@5
  int v9; // ebx@7
  char v10[56]; // [sp+0h] [bp-194h]@3
  int *v11; // [sp+28h] [bp-16Ch]@9
  char *v12; // [sp+2Ch] [bp-168h]@9
  int v13; // [sp+38h] [bp-15Ch]@2
  char v14[80]; // [sp+3Ch] [bp-158h]@5
  char v15; // [sp+8Ch] [bp-108h]@7
  int v16; // [sp+178h] [bp-1Ch]@5
  int v17; // [sp+17Ch] [bp-18h]@5
  int v18; // [sp+180h] [bp-14h]@5
  int v19; // [sp+184h] [bp-10h]@5
  int v20; // [sp+188h] [bp-Ch]@5
  int v21; // [sp+18Ch] [bp-8h]@5
  int v22; // [sp+190h] [bp-4h]@5
	  v2 = 0;
  do
  {
    BYTE3(v3) = 0;
    *(_WORD *)((char *)&v3 + 1) = *(_BYTE *)a1;
    LOBYTE(v3) = *(_BYTE *)(a1 + 1);
    *(&v13 + v2++) = *(_BYTE *)(a1 + 3) | ((*(_BYTE *)(a1 + 2) | (v3 << 8)) << 8);
    a1 += 4;
  }
  while ( v2 < 16 );
  v4 = &v10[4 * v2];
  do
  {
    ++v2;
    v5 = __ROL__(*(_DWORD *)v4 ^ *((_DWORD *)v4 - 2) ^ *((_DWORD *)v4 + 6) ^ *((_DWORD *)v4 + 11), 1);
    *((_DWORD *)v4 + 14) = v5;
    v4 += 4;
  }
  while ( v2 < 80 );
  v6 = *(_DWORD *)(a2 + 12);
  v21 = *(_DWORD *)a2;
  v19 = *(_DWORD *)(a2 + 4);
  v22 = *(_DWORD *)(a2 + 8);
  v7 = *(_DWORD *)(a2 + 16);
  v18 = v6;
  v20 = v7;
  v8 = (int)v14;
  v16 = 4;
  v17 = 20;
  do
  {
    sub_5210((int)&v20, (int)&v19, v21, v22, v6, (int)&v20, v8 - 4);
    sub_5210((int)&v18, (int)&v21, v20, v19, v22, (int)&v18, v8);
    sub_5210((int)&v22, (int)&v20, v18, v21, v19, (int)&v22, v8 + 4);
    sub_5210((int)&v19, (int)&v18, v22, v20, v21, (int)&v19, v8 + 8);
    v6 = v18;
    sub_5210((int)&v21, (int)&v22, v19, v18, v20, (int)&v21, v8 + 12);
    v8 += 20;
    --v16;
  }
  while ( v16 );
  v9 = (int)&v15;
  do
  {
    sub_51C5((int)&v20, (int)&v19, v21, v22, v6, (int)&v20, v9 - 4);
    sub_51C5((int)&v18, (int)&v21, v20, v19, v22, (int)&v18, v9);
    sub_51C5((int)&v22, (int)&v20, v18, v21, v19, (int)&v22, v9 + 4);
    sub_51C5((int)&v19, (int)&v18, v22, v20, v21, (int)&v19, v9 + 8);
    v6 = v18;
    sub_51C5((int)&v21, (int)&v22, v19, v18, v20, (int)&v21, v9 + 12);
    v17 += 5;
    v9 += 20;
  }
  while ( v17 < 40 );
  v12 = &v14[4 * v17 - 4];
  v11 = &v20;
  JUMPOUT(v8000);
}
// 7E52: using guessed type char var_194[56];
// 7E52: using guessed type char var_158[80];
	// ALL OK, 75 function(s) have been successfully decompiled

Share this post


Link to post
Share on other sites
On 8/1/2015 at 8:48 PM, klepp0906 said:

best forum... ever!

This ^^

And thanks for Sharing Suspense :D

Share this post


Link to post
Share on other sites
On 25/07/2016 at 10:37 PM, Vesper said:

If you really don't know what to do with that .bin file, here's a path to start...

Next step is to hook the warden to know what value are pushed into those functions and figure out what exact arythmetic it performs on them to get a result.

	/* This file has been generated by the Hex-Rays decompiler.
   Copyright (c) 2007-2011 Hex-Rays <[email protected]>
	   Detected compiler: Unknown
*/
	#include <defs.h>
//-------------------------------------------------------------------------
// Data declarations
//-------------------------------------------------------------------------
// Function declarations
	int __fastcall sub_109F(int a1, int a2, int a3, int a4);
unsigned int __fastcall sub_1120(int a1, int a2, int a3, int a4, unsigned int a5);
void __cdecl sub_11B0();
char __fastcall sub_11F0(int a1, int a2, int a3, int a4, int a5);
void *__fastcall sub_12D0(int a1, int a2, void *a3, const void *a4);
char __fastcall sub_1346(int a1, int a2, int a3, int a4, unsigned int a5);
int __fastcall sub_13F0(int a1, int a2, int a3, int a4);
char __fastcall sub_1444(int a1, int a2, int a3, int a4, unsigned int a5);
unsigned int __cdecl sub_1540(int a1);
char __fastcall sub_1570(int a1, int a2, int a3, int *a4, int a5);
bool __cdecl sub_1AB0(int a1);
unsigned int __fastcall sub_1CB0(int a1, int a2, int a3, int a4);
signed int __fastcall sub_1CED(int a1, int a2, int a3, int a4, int a5);
void __fastcall sub_1EF0(int a1, int a2, int a3);
int __fastcall sub_1F1B(int a1, int a2, int a3, unsigned int a4, unsigned int a5);
void __fastcall sub_1FB4(int a1, int a2, int a3);
int __cdecl sub_2210(int a1, unsigned int a2);
signed int __stdcall sub_22A0(int a1, int a2, int a3);
int __fastcall sub_22C7(int a1, int a2, int a3);
int __fastcall sub_2E90(int a1, int a2, int a3, int a4, unsigned int a5);
int __fastcall sub_3170(int a1, int a2, int a3, int a4);
void __fastcall sub_3210(int a1, int a2, int a3);
int __fastcall sub_3387(int a1, int a2, int a3, int a4);
__int16 __fastcall sub_33C0(int a1, int a2, int a3, int a4);
int __cdecl sub_3610(int a1);
char __fastcall sub_3810(int a1, int a2, int a3, unsigned int a4);
int (*__cdecl sub_3840())(void);
signed int __fastcall sub_3890(int a1, int a2, int a3, int a4, int a5);
int __fastcall sub_3A00(int a1, int a2, int a3, int a4);
int __fastcall sub_3CA0(int a1, int a2, int a3);
int __fastcall sub_3D00(int a1, int a2, int a3, unsigned int *a4, int a5);
void __fastcall sub_3DA5(int a1, int a2, int a3);
int __fastcall sub_3E40(int a1, int a2, int a3, int a4, int a5, int a6, int a7);
int __fastcall sub_4CF6(int a1, int a2, int a3, const void *a4, int a5, int a6);
char __fastcall sub_4F41(int a1, int a2, int a3);
int __fastcall sub_51C5(int a1, int a2, int a3, int a4, int a5, int a6, int a7);
int __fastcall sub_51F2(int a1, int a2, int a3, int a4, unsigned int a5);
int __fastcall sub_5210(int a1, int a2, int a3, int a4, int a5, int a6, int a7);
int __fastcall sub_524A(int a1, int a2, int a3, int a4);
// int __usercall sub_5270<eax>(char _CF<cf>, char _ZF<zf>, char _SF<sf>, char _OF<of>, int a5<eax>, int a6<edx>, int a7<ecx>, int a8<ebx>, int a9<edi>, int a10<esi>, char a11);
signed int __stdcall sub_5460(int a1, int a2, int a3);
int __cdecl sub_5510(unsigned int a1, unsigned int a2);
unsigned int __fastcall sub_5540(int a1, int a2, int a3, unsigned int a4);
// int __usercall sub_5580<eax>(int a1<eax>, int a2<edx>, int a3<ecx>, int a4<ebx>, int a5<edi>, int a6<esi>, char a7);
void *__cdecl sub_5704(void *a1, unsigned __int8 a2, unsigned int a3);
int __fastcall sub_5730(int a1, int a2, int a3, int a4);
int __fastcall sub_57D0(int a1, int a2, int a3, int a4, unsigned int a5);
char __fastcall sub_583F(int a1, int a2, int a3, int a4, unsigned int a5);
unsigned int __fastcall sub_58A1(int a1, int a2, int a3, unsigned int a4, unsigned int a5);
char __fastcall sub_58E8(int a1, int a2, int a3);
void __cdecl sub_595D(int a1, int a2, int a3);
int __fastcall sub_5990(int a1, int a2, int a3);
signed int __cdecl sub_59F0(int a1);
int __fastcall sub_5A70(int a1, int a2, int a3);
int __fastcall sub_5A9C(int a1, int a2, int a3);
unsigned int __fastcall sub_5F00(int a1, int a2, int a3, int a4);
int __cdecl sub_5F90(int a1, int a2);
char __fastcall sub_5FA0(int a1, int a2, int a3, int a4);
int __fastcall sub_60F0(int a1, int a2, int a3, char a4);
int __fastcall sub_6D70(int a1, int a2, int a3, int a4);
// int __usercall sub_6E00<eax>(int a1<esi>);
char __fastcall sub_6EA9(int a1, int a2, int a3, int a4);
char __fastcall sub_6ECA(int a1, int a2, int a3, int a4, int a5);
char __fastcall sub_6F20(int a1, int a2, int a3, unsigned int a4);
char __fastcall sub_6F50(int a1, int (__cdecl *a2)(_DWORD), int a3, int a4, int a5);
char __fastcall sub_6FE0(int a1, int a2, int a3, int a4);
signed int __fastcall sub_70C0(int a1, int a2, int a3, int a4, int a5);
void __cdecl sub_7340(unsigned int a1, unsigned int a2);
char __fastcall sub_7363(int a1, int a2, int a3);
int __fastcall sub_74A0(int a1, unsigned int *a2, int a3);
unsigned int __fastcall sub_7AA0(int a1, int a2, int a3);
int __fastcall sub_7B60(int a1, int a2, int a3, int a4);
char __fastcall sub_7BC2(int a1, int a2, int a3);
char __fastcall sub_7C0D(int a1, int a2, int a3, int a4, int a5, int a6);
// void __usercall sub_7E52(int a1<eax>, int a2<esi>);
//----- (0000109F) --------------------------------------------------------
int __fastcall sub_109F(int a1, int a2, int a3, int a4)
{
  int v4; // edi@1
  int v5; // esi@1
  int v6; // edx@1
  int v7; // edx@1
  int result; // eax@1
  signed int v9; // esi@1
  unsigned int v10; // ecx@2
  signed int v11; // edx@2
  char v12; // [sp+8h] [bp-Ch]@1
  unsigned int v13; // [sp+10h] [bp-4h]@1
  int v14; // [sp+14h] [bp+0h]@1
	  v13 = (unsigned int)&v14 ^ v3EDA03C;
  v4 = a4;
  v5 = a3;
  sub_58A1((unsigned int)&v14 ^ v3EDA03C, a2, (int)&v12, *(_DWORD *)a3, *(_DWORD *)(a3 + 4));
  sub_1346(*(_DWORD *)v5 >> 3, v6, v5, 65900752, ((-9 - (unsigned __int8)(*(_DWORD *)v5 >> 3)) & 0x3F) + 1);
  sub_1346((int)&v12, v7, v5, (int)&v12, 8u);
  result = v5 + 8;
  v9 = 5;
  do
  {
    v10 = *(_DWORD *)result;
    v11 = 3;
    do
    {
      *(_BYTE *)(v4 + v11) = v10;
      v10 >>= 8;
      --v11;
    }
    while ( v11 >= 0 );
    result += 4;
    v4 += 4;
    --v9;
  }
  while ( v9 );
  return result;
}
	//----- (00001120) --------------------------------------------------------
unsigned int __fastcall sub_1120(int a1, int a2, int a3, int a4, unsigned int a5)
{
  unsigned int v5; // edx@1
  unsigned int v6; // eax@1
  unsigned __int8 v7; // bl@3
  unsigned int v8; // esi@3
  int v9; // edi@4
  char v10; // dl@4
  int v11; // eax@4
  char v12; // ST0F_1@4
  unsigned int result; // eax@4
	  LOBYTE(v5) = 0;
  v6 = 0;
  do
  {
    *(_BYTE *)(v6 + a3) = v6;
    ++v6;
  }
  while ( v6 < 0x100 );
  v7 = 0;
  *(_BYTE *)(a3 + 256) = 0;
  *(_BYTE *)(a3 + 257) = 0;
  v8 = 0;
  do
  {
    v9 = (unsigned __int8)v5;
    v10 = *(_BYTE *)(v8++ + a3) + *(_BYTE *)((unsigned __int8)v5 + a4);
    v7 += v10;
    v11 = a3 + v7;
    v12 = *(_BYTE *)(v8 + a3 - 1);
    *(_BYTE *)(v8 + a3 - 1) = *(_BYTE *)v11;
    *(_BYTE *)v11 = v12;
    result = (v9 + 1) / a5;
    v5 = (v9 + 1) % a5;
  }
  while ( v8 < 0x100 );
  return result;
}
	//----- (000011B0) --------------------------------------------------------
void __cdecl sub_11B0()
{
  v3EDA44C = 0;
}
	//----- (000011F0) --------------------------------------------------------
char __fastcall sub_11F0(int a1, int a2, int a3, int a4, int a5)
{
  char result; // al@2
  void (__stdcall *v6)(_DWORD, _DWORD); // esi@4
  int v7; // eax@4
  int v8; // edx@4
  int v9; // edi@4
  int v10; // [sp+8h] [bp-50h]@3
  int v11; // [sp+Ch] [bp-4Ch]@3
  char v12; // [sp+10h] [bp-48h]@3
  int v13; // [sp+50h] [bp-8h]@1
  int v14; // [sp+54h] [bp-4h]@1
	  v14 = a2;
  v13 = a3;
  if ( v3EDA090 )
  {
    v10 = v3ED900C(v3EDA038);
    v11 = a5;
    if ( v849E(&v12, 0) )
    {
      result = 0;
    }
    else
    {
      v6 = v3ED9010;
      v7 = v3ED9010(v3EDA038, &v10);
      v9 = ((int (__fastcall *)(int, int, int))v14)(v7, v8, a4);
      v6(v3EDA038, v10);
      *(_DWORD *)v13 = v9;
      result = 1;
    }
  }
  else
  {
    result = sub_6F50(a4, (int (__cdecl *)(_DWORD))a2, a3, a4, a5);
  }
  return result;
}
// 3ED900C: using guessed type int (__stdcall *)(_DWORD);
// 3ED9010: using guessed type int (__stdcall *)(_DWORD, _DWORD);
	//----- (000012D0) --------------------------------------------------------
void *__fastcall sub_12D0(int a1, int a2, void *a3, const void *a4)
{
  void *result; // eax@1
	  result = a3;
  memcpy(a3, a4, 0x102u);
  return result;
}
	//----- (00001346) --------------------------------------------------------
char __fastcall sub_1346(int a1, int a2, int a3, int a4, unsigned int a5)
{
  int v5; // edi@1
  int v6; // ebx@1
  unsigned __int8 v7; // cf@1
  int v8; // eax@2
	  v5 = a3;
  v6 = (*(_DWORD *)a3 >> 3) & 0x3F;
  v7 = __CFADD__(8 * a5, *(_DWORD *)a3);
  *(_DWORD *)v5 += 8 * a5;
  *(_DWORD *)(v5 + 4) += v7;
  if ( v6 )
  {
    a5 += v6;
    v8 = a4 - v6;
    a4 -= v6;
    if ( a5 >= 0x40 )
    {
      while ( (unsigned int)v6 < 0x40 )
      {
        *(_BYTE *)(a3 + v6 + 28) = *(_BYTE *)(v6 + v8);
        ++v6;
      }
      sub_7E52(a3 + 28, a3 + 8);
    }
  }
  else
  {
    LOBYTE(v8) = a5;
    if ( a5 >= 0x40 )
      sub_7E52(a4, a3 + 8);
  }
  while ( v6 < a5 )
  {
    LOBYTE(v8) = *(_BYTE *)(v6 + a4);
    *(_BYTE *)(a3 + v6++ + 28) = v8;
  }
  return v8;
}
	//----- (000013F0) --------------------------------------------------------
int __fastcall sub_13F0(int a1, int a2, int a3, int a4)
{
  int i; // edi@1
  int v5; // eax@2
  char v6; // dl@2
  int v7; // esi@2
  int v8; // eax@2
  char v9; // bl@2
  int result; // eax@2
	  for ( i = a4; i; *(_BYTE *)result = v6 )
  {
    ++*(_BYTE *)(a3 + 256);
    v5 = *(_BYTE *)(a3 + 256);
    *(_BYTE *)(a3 + 257) += *(_BYTE *)(v5 + a3);
    v6 = *(_BYTE *)(v5 + a3);
    v7 = v5 + a3;
    v8 = *(_BYTE *)(a3 + 257);
    v9 = *(_BYTE *)(v8 + a3);
    result = a3 + v8;
    --i;
    *(_BYTE *)v7 = v9;
  }
  return result;
}
	//----- (00001444) --------------------------------------------------------
char __fastcall sub_1444(int a1, int a2, int a3, int a4, unsigned int a5)
{
  unsigned int v5; // edi@1
  int v6; // esi@1
  int v7; // eax@1
  char v8; // bl@4
	  v5 = a5;
  v6 = a3;
  LOBYTE(v7) = sub_3810(a1, a2, a3, a5);
  if ( (_BYTE)v7 && a5 )
  {
    v7 = a4;
    do
    {
      v8 = *(_BYTE *)v7;
      --v5;
      ++v7;
      *(_BYTE *)((*(_DWORD *)(v6 + 8))++ + *(_DWORD *)v6) = v8;
    }
    while ( v5 );
  }
  return v7;
}
	//----- (00001540) --------------------------------------------------------
unsigned int __cdecl sub_1540(int a1)
{
  unsigned int result; // eax@1
	  result = sub_2210(65863680, a1 - 65863680);
  if ( result )
    result = ~(unsigned __int8)(*(_DWORD *)(result + 36) >> 31) & 1;
  return result;
}
	//----- (00001570) --------------------------------------------------------
char __fastcall sub_1570(int a1, int a2, int a3, int *a4, int a5)
{
  int v5; // edi@1
  int v6; // ebx@1
  int v7; // eax@1
  int v8; // edx@1
  int *v9; // ecx@2
  int v10; // esi@2
  int v11; // eax@4
  int v12; // edx@4
	  v5 = a3;
  v6 = a3 + 96;
  sub_5704((void *)(a3 + 96), 0x36u, 0x40u);
  v7 = (int)sub_5704((void *)(v5 + 160), 0x5Cu, 0x40u);
  v8 = a5;
  if ( a5 )
  {
    v9 = a4;
    v7 = v5 + 160;
    v10 = a5;
    do
    {
      *(_BYTE *)(v7 - 64) ^= *(_BYTE *)v9;
      v8 = *(_BYTE *)v9;
      *(_BYTE *)v7 ^= v8;
      v9 = (int *)((char *)v9 + 1);
      ++v7;
      --v10;
    }
    while ( v10 );
  }
  sub_1EF0(v7, v8, v5);
  return sub_1346(v11, v12, v5, v6, 0x40u);
}
	//----- (00001AB0) --------------------------------------------------------
bool __cdecl sub_1AB0(int a1)
{
  bool result; // eax@2
  int v2; // eax@3
	  if ( *(_WORD *)a1 != 23117 || (v2 = a1 + *(_DWORD *)(a1 + 60), *(_DWORD *)v2 != 17744) )
    result = 0;
  else
    result = *(_WORD *)(v2 + 24) == 267;
  return result;
}
	//----- (00001CB0) --------------------------------------------------------
unsigned int __fastcall sub_1CB0(int a1, int a2, int a3, int a4)
{
  unsigned int result; // eax@1
  unsigned int v5; // edx@1
	  *(_DWORD *)a4 = 0;
  result = *(_DWORD *)(a3 + 8);
  v5 = *(_DWORD *)(a3 + 4);
  if ( result <= v5 && v5 - result >= 4 )
  {
    result = *(_DWORD *)(result + *(_DWORD *)a3);
    *(_DWORD *)a4 = result;
    *(_DWORD *)(a3 + 8) += 4;
  }
  else
  {
    *(_DWORD *)(a3 + 8) = v5 + 1;
  }
  return result;
}
	//----- (00001CED) --------------------------------------------------------
signed int __fastcall sub_1CED(int a1, int a2, int a3, int a4, int a5)
{
  int v5; // esi@1
  int v6; // edx@1
  signed int result; // eax@2
  int v8; // edx@6
  int v9; // edx@9
  int v10; // eax@13
  int v11; // ST04_4@13
  int v12; // edx@13
  int v13; // eax@13
  int v14; // ST04_4@13
  int v15; // edx@13
  int v16; // eax@13
  int v17; // ST04_4@13
  int v18; // edx@13
  int v19; // edx@14
  int v20; // eax@16
  int v21; // ST04_4@16
  int v22; // edx@16
  int v23; // eax@16
  int v24; // ST04_4@16
  int v25; // edx@16
  int v26; // eax@16
  int v27; // ST04_4@16
  int v28; // edx@16
  int v29; // [sp+Ch] [bp-11Ch]@6
  int v30; // [sp+10h] [bp-118h]@9
  int v31; // [sp+14h] [bp-114h]@9
  int v32; // [sp+18h] [bp-110h]@9
  int v33; // [sp+1Ch] [bp-10Ch]@9
  unsigned __int8 v34; // [sp+23h] [bp-105h]@1
  char v35; // [sp+24h] [bp-104h]@5
  unsigned int v36; // [sp+124h] [bp-4h]@1
  int v37; // [sp+128h] [bp+0h]@1
	  v36 = (unsigned int)&v37 ^ v3EDA03C;
  v5 = a3;
  sub_6FE0((int)&v34, a2, a5, (int)&v34);
  if ( *(_DWORD *)(a5 + 8) > *(_DWORD *)(a5 + 4) )
    return 2;
  if ( !v34 )
    goto LABEL_4;
  sub_2E90((int)&v35, v6, a5, (int)&v35, 0x100u);
  if ( *(_DWORD *)(a5 + 8) > *(_DWORD *)(a5 + 4) )
    return 2;
  v29 = (*(int (__fastcall **)(_DWORD, char *, int, int))(*(_DWORD *)a4 + 4))(
          *(_DWORD *)a4,
          &v35,
          a4,
          v35 != 0 ? (int)&v35 : 0);
  if ( v34 != 1 )
  {
    if ( v34 != 2 )
    {
      result = 3;
LABEL_12:
      *(_DWORD *)(v5 + 32) = 0;
      *(_BYTE *)(v5 + 36) = 0;
      return result;
    }
    sub_1CB0((int)&v30, v8, a5, (int)&v30);
    sub_1CB0((int)&v33, v9, a5, (int)&v33);
    sub_1CB0((int)&v32, v9, a5, (int)&v32);
    sub_1CB0((int)&v31, v9, a5, (int)&v31);
    if ( *(_DWORD *)(a5 + 8) <= *(_DWORD *)(a5 + 4) )
    {
      if ( !v29 )
      {
        result = 0;
        goto LABEL_12;
      }
      v10 = (*(int (__fastcall **)(_DWORD, int, int, int, int))(*(_DWORD *)a4 + 8))(*(_DWORD *)a4, v9, a4, v29, v30);
      v11 = v33;
      *(_DWORD *)(v5 + 16) = v10;
      v13 = (*(int (__fastcall **)(_DWORD, int, int, int, int))(*(_DWORD *)a4 + 8))(*(_DWORD *)a4, v12, a4, v29, v11);
      v14 = v32;
      *(_DWORD *)(v5 + 20) = v13;
      v16 = (*(int (__fastcall **)(_DWORD, int, int, int, int))(*(_DWORD *)a4 + 8))(*(_DWORD *)a4, v15, a4, v29, v14);
      v17 = v31;
      *(_DWORD *)(v5 + 24) = v16;
      *(_DWORD *)(v5 + 28) = (*(int (__fastcall **)(_DWORD, int, _DWORD, _DWORD, _DWORD))(*(_DWORD *)a4 + 8))(
                               *(_DWORD *)a4,
                               v18,
                               a4,
                               v29,
                               v17);
      *(_DWORD *)(v5 + 32) = 2;
LABEL_17:
      *(_BYTE *)(v5 + 36) = 1;
      return 0;
    }
    return 2;
  }
  sub_1CB0((int)&v31, v8, a5, (int)&v31);
  sub_1CB0((int)&v32, v19, a5, (int)&v32);
  sub_1CB0((int)&v33, v19, a5, (int)&v33);
  sub_1CB0((int)&v30, v19, a5, (int)&v30);
  if ( *(_DWORD *)(a5 + 8) > *(_DWORD *)(a5 + 4) )
    return 2;
  if ( v29 )
  {
    v20 = (*(int (__fastcall **)(_DWORD, int, int, int, int))(*(_DWORD *)a4 + 8))(*(_DWORD *)a4, v19, a4, v29, v31);
    v21 = v32;
    *(_DWORD *)v5 = v20;
    v23 = (*(int (__fastcall **)(_DWORD, int, _DWORD, _DWORD, _DWORD))(*(_DWORD *)a4 + 8))(
            *(_DWORD *)a4,
            v22,
            a4,
            v29,
            v21);
    v24 = v33;
    *(_DWORD *)(v5 + 4) = v23;
    v26 = (*(int (__fastcall **)(_DWORD, int, _DWORD, _DWORD, _DWORD))(*(_DWORD *)a4 + 8))(
            *(_DWORD *)a4,
            v25,
            a4,
            v29,
            v24);
    v27 = v30;
    *(_DWORD *)(v5 + 8) = v26;
    *(_DWORD *)(v5 + 12) = (*(int (__fastcall **)(_DWORD, int, _DWORD, _DWORD, _DWORD))(*(_DWORD *)a4 + 8))(
                             *(_DWORD *)a4,
                             v28,
                             a4,
                             v29,
                             v27);
    *(_DWORD *)(v5 + 32) = 1;
    goto LABEL_17;
  }
LABEL_4:
  *(_DWORD *)(v5 + 32) = 0;
  *(_BYTE *)(v5 + 36) = 0;
  return 0;
}
	//----- (00001EF0) --------------------------------------------------------
void __fastcall sub_1EF0(int a1, int a2, int a3)
{
  *(_DWORD *)a3 = 0;
  *(_DWORD *)(a3 + 4) = 0;
  *(_DWORD *)(a3 + 8) = 1732584193;
  *(_DWORD *)(a3 + 12) = -271733879;
  *(_DWORD *)(a3 + 16) = -1732584194;
  *(_DWORD *)(a3 + 20) = 271733878;
  *(_DWORD *)(a3 + 24) = -1009589776;
}
	//----- (00001F1B) --------------------------------------------------------
int __fastcall sub_1F1B(int a1, int a2, int a3, unsigned int a4, unsigned int a5)
{
  __m64 v5; // ST00_8@1
  __m64 v6; // mm1@1
  int result; // eax@1
	  HIDWORD(v5.m64_u64) = *(_DWORD *)a3;
  LODWORD(v5.m64_u64) = *(_DWORD *)a2;
  v6 = _m_paddd(_m_pmaddwd(v5, (__m64)__PAIR__(a4, a5)), _m_pmullw(v5, (__m64)__PAIR__(a4, a5)));
  *(_DWORD *)a3 = _mm_cvtsi64_si32(v6);
  result = _mm_cvtsi64_si32(_m_psrlq(v6, 0x20u));
  *(_DWORD *)a2 = result;
  return result;
}
// 1F1B: could not find valid save-restore pair for ebp
	//----- (00001FB4) --------------------------------------------------------
void __fastcall sub_1FB4(int a1, int a2, int a3)
{
  *(_DWORD *)(a3 + 32) = 0;
  *(_BYTE *)(a3 + 36) = 0;
}
	//----- (00002210) --------------------------------------------------------
int __cdecl sub_2210(int a1, unsigned int a2)
{
  int v2; // ecx@1
  unsigned int v3; // esi@1
  unsigned int v4; // edx@1
  int result; // eax@1
  unsigned int v6; // ecx@2
	  v2 = a1 + *(_DWORD *)(a1 + 60);
  v3 = *(_WORD *)(v2 + 6);
  v4 = 0;
  result = *(_WORD *)(v2 + 20) + v2 + 24;
  if ( *(_WORD *)(v2 + 6) )
  {
    while ( 1 )
    {
      v6 = *(_DWORD *)(result + 12);
      if ( a2 >= v6 )
      {
        if ( a2 < v6 + *(_DWORD *)(result + 8) )
          break;
      }
      ++v4;
      result += 40;
      if ( v4 >= v3 )
        goto LABEL_5;
    }
  }
  else
  {
LABEL_5:
    result = 0;
  }
  return result;
}
	//----- (000022A0) --------------------------------------------------------
signed int __stdcall sub_22A0(int a1, int a2, int a3)
{
  if ( v3ED0000 == 23117 && a2 == 1 )
    v3ED9004(a1);
  return 1;
}
// 3ED9004: using guessed type int (__stdcall *)(_DWORD);
	//----- (000022C7) --------------------------------------------------------
int __fastcall sub_22C7(int a1, int a2, int a3)
{
  int v3; // esi@1
  int v4; // edi@1
  int v5; // eax@1
  int v6; // edx@1
  int v7; // ecx@1
  int v8; // ecx@1
  int v9; // edx@1
  int v10; // edx@1
  int v11; // edx@1
  int v12; // edi@1
  int v13; // edi@1
  int v14; // ecx@1
  int v15; // ecx@1
  int v16; // eax@1
  int v17; // ebx@1
  int v18; // eax@1
  signed __int32 v19; // eax@1
  int v22; // eax@1
  int v23; // eax@1
  int v24; // edi@1
  int v25; // ebx@1
  int v26; // ebx@1
  int v27; // eax@1
  int v28; // ecx@1
  int v29; // eax@1
  int v30; // edi@1
  int v31; // edx@1
  unsigned __int32 v32; // eax@1
  signed __int32 v33; // eax@1
  signed __int32 v35; // edx@1
  unsigned int v37; // ebx@1
  unsigned __int32 v38; // eax@1
  int v39; // edi@1
  int v40; // edi@1
  int v41; // eax@1
  int v42; // eax@1
  int v43; // eax@1
  int v44; // eax@1
  signed __int32 v45; // eax@1
  signed __int32 v47; // edx@1
  int v49; // ebx@1
  int v50; // edx@1
  int v51; // edx@1
  int v52; // ecx@1
  unsigned __int32 v53; // ecx@1
  int v54; // eax@1
  int v55; // eax@1
  int v56; // edi@1
  int v57; // edx@1
  unsigned __int32 v58; // edx@1
  int v59; // edi@1
  int v60; // edi@1
  int v61; // eax@1
  int v62; // eax@1
  signed __int32 v63; // edx@1
  int v64; // eax@1
  signed __int32 v65; // eax@1
  int v66; // ecx@1
  int v67; // ebx@1
  int v68; // ecx@1
  int v69; // ecx@1
  int v70; // ecx@1
  signed __int32 v73; // eax@1
  int v74; // ebx@1
  unsigned int v75; // edi@1
  int v76; // eax@1
  int v77; // eax@1
  unsigned __int32 v78; // eax@1
  int v79; // edi@1
  signed __int32 v80; // eax@1
  int v81; // ecx@1
  signed __int32 v83; // edx@1
  signed __int32 v85; // edx@1
  int v86; // ecx@1
  signed __int32 v87; // eax@1
  int v90; // edx@1
  signed __int32 v91; // edx@1
  int v92; // eax@1
  int v93; // eax@1
  signed __int32 v96; // edx@1
  int v97; // eax@1
  signed __int32 v98; // eax@1
  signed __int32 v101; // edx@1
  int v102; // eax@1
  int v103; // eax@1
  signed __int32 v106; // edx@1
  int v107; // eax@1
  int v108; // eax@1
  int v109; // eax@1
  signed __int32 v110; // eax@1
  signed __int32 v113; // eax@1
  int v114; // ebx@1
  int v115; // edi@1
  int v116; // eax@1
  int v117; // eax@1
  int v118; // eax@1
  int v119; // ecx@1
  int v120; // edx@1
  int v121; // ecx@1
  unsigned int v122; // ecx@1
  int v123; // edx@1
  int v124; // eax@1
  unsigned int v125; // edi@1
  int v126; // eax@1
  int v127; // ebx@1
  int v128; // eax@1
  int v129; // ebx@1
  int v130; // edi@1
  int v131; // edi@1
  int v132; // ecx@1
  int v133; // eax@1
  int v134; // edx@1
  int v135; // eax@1
  int v136; // ecx@1
  unsigned int v137; // ecx@1
  int v138; // eax@1
  int v139; // eax@1
  int v140; // edi@1
  unsigned __int32 v141; // edi@1
  signed __int32 v142; // edx@1
  int v143; // eax@1
  int v144; // eax@1
  signed __int32 v145; // eax@1
  int v148; // edi@1
  int v149; // edi@1
  int v150; // eax@1
  unsigned __int32 v151; // eax@1
  int v152; // ecx@1
  int v153; // ecx@1
  int v154; // edx@1
  int v155; // edx@1
  signed __int32 v156; // edx@1
  int v157; // eax@1
  signed __int32 v158; // eax@1
  signed __int32 v161; // eax@1
  int v162; // edi@1
  int v163; // eax@1
  int v164; // eax@1
  int v165; // eax@1
  signed __int32 v167; // edx@1
  signed __int32 v169; // edx@1
  signed __int32 v170; // eax@1
  int v171; // ecx@1
  int v174; // edi@1
  int v175; // edi@1
  int v176; // ecx@1
  int v177; // ebx@1
  int v178; // ebx@1
  int v179; // ecx@1
  int v180; // eax@1
  int v181; // eax@1
  int v182; // eax@1
  int v183; // ebx@1
  int v184; // ebx@1
  int v185; // ecx@1
  int v186; // ecx@1
  int v187; // edi@1
  int v188; // edx@1
  unsigned __int32 v189; // edx@1
  int v190; // edi@1
  int v191; // edi@1
  int v192; // eax@1
  int v193; // ecx@1
  int v194; // eax@1
  int v195; // ebx@1
  unsigned __int32 v196; // ebx@1
  int v197; // eax@1
  int v198; // eax@1
  int v199; // edx@1
  int v200; // ecx@1
  int v201; // edi@1
  unsigned __int32 v202; // edi@1
  int v203; // ecx@1
  unsigned __int32 v204; // ecx@1
  int v205; // edx@1
  int v206; // ebx@1
  int v207; // ebx@1
  int v208; // edx@1
  signed __int32 v209; // edx@1
  int v210; // edi@1
  unsigned __int32 v211; // edi@1
  int v212; // eax@1
  int v213; // ecx@1
  int v214; // ecx@1
  int v215; // eax@1
  int v216; // eax@1
  int v217; // eax@1
  int v218; // eax@1
  int v219; // eax@1
  int v222; // ecx@1
  int v223; // edx@1
  int v224; // eax@1
  int v225; // eax@1
  int v226; // edx@1
  int v227; // edx@1
  int v228; // ecx@1
  unsigned __int32 v229; // ecx@1
  int v230; // ecx@1
  signed __int32 v231; // eax@1
  int v232; // ecx@1
  signed __int32 v235; // edx@1
  signed __int32 v236; // eax@1
  int v237; // ecx@1
  signed __int32 v240; // edx@1
  int v241; // ecx@1
  int v244; // edx@1
  int v245; // ebx@1
  int v246; // ebx@1
  int v247; // ecx@1
  int v248; // ecx@1
  int v249; // eax@1
  int v250; // edi@1
  int v251; // edi@1
  int v252; // eax@1
  int v253; // eax@1
  int v254; // eax@1
  int v255; // ecx@1
  int v256; // ebx@1
  int v257; // ebx@1
  int v258; // eax@1
  int v259; // edx@1
  int v260; // eax@1
  int result; // eax@1
  unsigned int v262; // [sp+Ch] [bp-10h]@1
  unsigned int v263; // [sp+10h] [bp-Ch]@1
  signed __int32 v264; // [sp+14h] [bp-8h]@1
  signed __int32 v265; // [sp+18h] [bp-4h]@1
	  v3 = a3;
  v4 = *(_DWORD *)a3;
  v5 = __ROL__(*(_DWORD *)a3 + 1788801274, 20);
  v5 += 1307572625;
  v6 = __ROL__(*(_DWORD *)(a3 + 4) - v5 - 402749954, 23);
  v6 -= 1307572625;
  v7 = __ROL__(*(_DWORD *)(a3 + 8) - v6 + v5 - 1412288184, 20);
  v8 = v5 ^ v7;
  v265 = v6;
  v9 = __ROL__((v5 ^ v6 ^ v8) + *(_DWORD *)(v3 + 12) + 731755463, 17);
  v263 = _byteswap_ulong(v8) + v9;
  v10 = __ROL__(v8 + v263 + *(_DWORD *)(v3 + 12) - v265 + v5 + 426222069, 2);
  v11 = v8 ^ v10;
  v12 = __ROL__(v265 + v263 + v4 - v8 + v11 + 1050944700, 29);
  v13 = -v263 ^ v12;
  v14 = __ROL__(*(_DWORD *)(v3 + 12) + (v11 ^ v13 ^ v263) + v8 + 1350149820, 25);
  v15 = ~v13 ^ v14;
  v16 = __ROL__(*(_DWORD *)(v3 + 8) + (v11 & v13 ^ v15 & (v11 ^ v13)) + v263 - 1583002981, 13);
  v265 = v13;
  v263 = v16 - v15;
  v17 = *(_DWORD *)(v3 + 8) + (v13 & v15 ^ (v16 - v15) & (v13 ^ v15)) - v13;
  v264 = v15;
  v262 = v11 + v17 - 771404559;
  v18 = __ROL__(*(_DWORD *)(v3 + 4) + (v262 ^ (v15 | ~(v16 - v15))) + v13 + 326427415, 15);
  v19 = v18 - _byteswap_ulong(v15);
  v265 = v19;
  _EAX = _InterlockedExchange((signed __int32 *)&v263, v19);
  _EDX = _InterlockedExchange((signed __int32 *)&v262, v13);
  __asm { arpl    ax, dx }
  v22 = _InterlockedExchange((signed __int32 *)&v263, _EAX);
  _InterlockedExchange((signed __int32 *)&v262, _EDX);
  sub_1F1B(v22, (int)&v264, (int)&v265, v263, v262);
  v23 = __ROL__(*(_DWORD *)(v3 + 12) + (v262 ^ v265 & (v262 ^ v263)) + v264 - 201174377, 9);
  v24 = __ROL__(*(_DWORD *)v3 + ((v23 + v265 + 1) ^ v262 & (v265 ^ (v23 + v265 + 1))) + v263 + 1521245252, 13);
  v264 = v23 + v265 + 1;
  v263 = v24 - v262;
  v25 = __ROL__(*(_DWORD *)v3 + v8393(v24 - v262) + v262 + 1711369870, 16);
  v26 = ~v264 ^ v25;
  v27 = *(_DWORD *)(v3 + 12) + v8393(~v264, v26, v264);
  v28 = __ROL__(v27 + v265 + 456403427, 2);
  v265 = v264 + v28;
  v29 = v8393(v27, v26, v264 + v28);
  v30 = __ROL__(*(_DWORD *)(v3 + 12) + v29 + v264 + 803119615, 13);
  v264 = ~v265 ^ v30;
  v31 = __ROL__(*(_DWORD *)v3 + (v26 ^ v265 ^ v264) + v263 - 1226865879, 11);
  v32 = _byteswap_ulong(-v26);
  v263 = v32 + v31;
  v33 = v26 + *(_DWORD *)v3 + v8393(v32, v32 + v31, v264, v265) + ~v264 + 1746554013;
  v262 = v33;
  _EAX = _InterlockedExchange((signed __int32 *)&v263, v33);
  _EDX = _InterlockedExchange(&v265, v35);
  __asm { arpl    ax, dx }
  _InterlockedExchange((signed __int32 *)&v263, _EAX);
  _InterlockedExchange(&v265, _EDX);
  v37 = v262;
  v38 = _byteswap_ulong(-v263);
  v39 = __ROL__(*(_DWORD *)(v3 + 12) + (v262 ^ v264 ^ v263) + v265 + 805168589, 17);
  v40 = v39 - v38;
  v265 = v40;
  v41 = v8393(v38, v263, v262, v40);
  v42 = __ROL__(v41 + v264 + *(_DWORD *)(v3 + 4) - 43557586, 20);
  v43 = v42 - v37;
  v264 = v43;
  v44 = __ROL__(*(_DWORD *)v3 + (v40 ^ v37 & (v40 ^ v43)) + v263 + 826542159, 15);
  v45 = ~v37 + v44;
  v263 = v45;
  _EAX = _InterlockedExchange(&v264, v45);
  _EDX = _InterlockedExchange(&v265, v47);
  __asm { arpl    ax, dx }
  _InterlockedExchange(&v264, _EAX);
  _InterlockedExchange(&v265, _EDX);
  v49 = *(_DWORD *)v3;
  v50 = __ROL__(*(_DWORD *)v3 + (v265 & v264 ^ v263 & (v265 ^ v264)) + v262 - 740058111, 20);
  v51 = v50 + v263 + 1;
  v52 = __ROL__(*(_DWORD *)(v3 + 8) + (v263 ^ (v264 | ~v51)) + v265 - 1992235156, 24);
  v53 = v52 - _byteswap_ulong(~v264);
  v54 = __ROL__(*(_DWORD *)v3 + (v51 ^ v53 ^ v263) + v264 - 288212232, 22);
  v55 = v54 - v51;
  v56 = *(_DWORD *)(v3 + 4) + (v51 ^ (v55 | ~v53));
  v262 = v51;
  v265 = v53;
  v264 = v55;
  v57 = __ROL__(v56 + v263 - 1782283388, 26);
  v58 = _byteswap_ulong(~v55) ^ v57;
  v59 = __ROL__(*(_DWORD *)(v3 + 4) + (v53 ^ v55 ^ v58) + v262 - 1945646361, 30);
  v60 = v58 + v59;
  v263 = v58;
  v61 = v8393(v55, v58, v60, v55);
  v62 = __ROL__(v61 + v265 + *(_DWORD *)(v3 + 12) - 294194379, 25);
  v63 = v62 + v60 + 1;
  v64 = __ROL__(v264 + v263 + v49 - v63 + v60 + 383169415, 14);
  v65 = v64 - v60;
  v66 = __ROL__(v65 + v263 + *(_DWORD *)(v3 + 4) - v63 + v60 - 1274156547, 15);
  v263 = v66 + v60 + 1;
  v67 = *(_DWORD *)(v3 + 4) + (v263 ^ v65 & (v63 ^ v263));
  v264 = v65;
  v68 = __ROL__(v67 + v60 - 854093792, 5);
  v69 = v68 + v65 + 1;
  v262 = v69;
  v70 = __ROL__(*(_DWORD *)(v3 + 12) + (v263 ^ (v65 | ~v69)) + v63 - 465767766, 27);
  v265 = v65 + v70;
  _EAX = _InterlockedExchange((signed __int32 *)&v262, v65);
  _EDX = _InterlockedExchange((signed __int32 *)&v263, v63);
  __asm { arpl    ax, dx }
  v73 = _InterlockedExchange((signed __int32 *)&v262, _EAX);
  _InterlockedExchange((signed __int32 *)&v263, _EDX);
  v74 = v263;
  v75 = v262;
  v76 = v8393(v73, v262, v265, v263);
  v77 = __ROL__(v76 + v264 + *(_DWORD *)(v3 + 12) - 124346331, 9);
  v78 = _byteswap_ulong(-v265) ^ v77;
  v264 = v78;
  v79 = *(_DWORD *)v3 + (v265 ^ (v78 | ~v75));
  v80 = ~v78;
  v81 = __ROL__(v79 + v74 - 1862556212, 2);
  v263 = v80 ^ v81;
  _EAX = _InterlockedExchange((signed __int32 *)&v262, v80);
  _EDX = _InterlockedExchange(&v265, v83);
  __asm { arpl    ax, dx }
  _InterlockedExchange((signed __int32 *)&v262, _EAX);
  _InterlockedExchange(&v265, _EDX);
  v85 = v262;
  v86 = __ROL__(*(_DWORD *)v3 + (v265 ^ v264 ^ v263) + v262 - 590344321, 29);
  v87 = _byteswap_ulong(-v265);
  v262 = v86 - v87;
  _EAX = _InterlockedExchange(&v264, v87);
  _EDX = _InterlockedExchange((signed __int32 *)&v263, v85);
  __asm { arpl    ax, dx }
  _InterlockedExchange(&v264, _EAX);
  _InterlockedExchange((signed __int32 *)&v263, _EDX);
  v90 = __ROL__(*(_DWORD *)(v3 + 8) + (v262 ^ v264 ^ v263) + v265 + 2080986712, 16);
  v91 = v90 + v264 + 1;
  v265 = v91;
  v92 = __ROL__(*(_DWORD *)v3 + (v263 ^ (v91 | ~v262)) + v264 + 138246194, 7);
  v93 = v91 ^ v92;
  v264 = v93;
  _EAX = _InterlockedExchange((signed __int32 *)&v262, v93);
  _EDX = _InterlockedExchange((signed __int32 *)&v263, v91);
  __asm { arpl    ax, dx }
  _InterlockedExchange((signed __int32 *)&v262, _EAX);
  v96 = _InterlockedExchange((signed __int32 *)&v263, _EDX);
  v97 = __ROL__(v263 + (v264 ^ v265 & (v262 ^ v264)) + *(_DWORD *)(v3 + 4) - 25213308, 30);
  v98 = v265 + v97;
  v263 = v98;
  _EAX = _InterlockedExchange((signed __int32 *)&v262, v98);
  _EDX = _InterlockedExchange(&v264, v96);
  __asm { arpl    ax, dx }
  _InterlockedExchange((signed __int32 *)&v262, _EAX);
  v101 = _InterlockedExchange(&v264, _EDX);
  v102 = __ROL__(*(_DWORD *)(v3 + 8) + (v265 & v264 ^ v263 & (v265 ^ v264)) + v262 - 1108810995, 31);
  v103 = v263 ^ v102;
  v262 = v103;
  _EAX = _InterlockedExchange(&v265, v103);
  _EDX = _InterlockedExchange(&v264, v101);
  __asm { arpl    ax, dx }
  _InterlockedExchange(&v265, _EAX);
  _InterlockedExchange(&v264, _EDX);
  v106 = v264;
  v107 = __ROL__(v265 + (v262 ^ v264 ^ v263) + *(_DWORD *)(v3 + 4) - 297420551, 30);
  v108 = v263 + v107;
  v265 = v108;
  v109 = __ROL__(*(_DWORD *)v3 + (v262 ^ v108 ^ v263) + v264 - 1007158588, 15);
  v110 = v109 + v263 + 1;
  v264 = v110;
  _EAX = _InterlockedExchange(&v265, v110);
  _EDX = _InterlockedExchange((signed __int32 *)&v262, v106);
  __asm { arpl    ax, dx }
  v113 = _InterlockedExchange(&v265, _EAX);
  _InterlockedExchange((signed __int32 *)&v262, _EDX);
  v114 = *(_DWORD *)(v3 + 12);
  v115 = v264;
  v116 = v8393(v113, v265, v262, v264);
  v117 = __ROL__(v114 + v116 + v263 + 34429626, 13);
  v118 = v262 ^ v117;
  v263 = v118;
  v119 = __ROL__(v114 + (v265 ^ v115 ^ v118) + v262 + 810441070, 30);
  v120 = v119 + v118 + 1;
  v121 = __ROL__(v265 + v118 + *(_DWORD *)v3 - v115 + v120 - 1493052571, 23);
  v122 = v121 - _byteswap_ulong(v118);
  v262 = v120;
  v123 = __ROL__(*(_DWORD *)v3 + (v120 & v122 ^ v118 & (v120 ^ v122)) + v115 - 310045284, 16);
  v265 = v122;
  v264 = v262 + v123;
  v124 = sub_1F1B(v118, (int)&v262, (int)&v264, v118, v122);
  v125 = v262;
  v126 = v8393(v124, v265, v262, v264);
  v127 = v126 + v263 + *(_DWORD *)(v3 + 12) - 243531110;
  v128 = *(_DWORD *)(v3 + 8);
  v127 = __ROL__(v127, 23);
  v129 = v127 - v125;
  v130 = __ROL__(v128 + (v265 ^ v264 ^ v129) + v125 - 973653713, 20);
  v131 = ~v264 ^ v130;
  v132 = v128 + (v131 & v264 ^ v129 & (v131 ^ v264));
  v133 = v265;
  v134 = __ROL__(v132 + v265 - 317140539, 30);
  v265 = v134 - v129;
  v135 = v8393(v133, v134 - v129, v129, v131);
  v136 = __ROL__(v135 + v264 + *(_DWORD *)(v3 + 4) - 331228956, 31);
  v137 = v129 + v136;
  v138 = __ROL__(*(_DWORD *)(v3 + 4) + (v131 & v265 ^ v137 & (v131 ^ v265)) + v129 - 1368208514, 19);
  v139 = ~v131 + v138;
  v263 = v139;
  v140 = __ROL__(*(_DWORD *)(v3 + 4) + (v265 ^ v137 ^ v139) + v131 + 1411275020, 28);
  v141 = _byteswap_ulong(-v137) + v140;
  v142 = v265;
  v143 = *(_DWORD *)v3 + (v141 ^ (v137 | ~v139));
  v264 = v137;
  v144 = __ROL__(v143 + v265 - 875095672, 5);
  v145 = _byteswap_ulong(v137) ^ v144;
  v262 = v141;
  v265 = v145;
  _EAX = _InterlockedExchange((signed __int32 *)&v263, v145);
  _EDX = _InterlockedExchange((signed __int32 *)&v262, v142);
  __asm { arpl    ax, dx }
  _InterlockedExchange((signed __int32 *)&v263, _EAX);
  _InterlockedExchange((signed __int32 *)&v262, _EDX);
  v148 = __ROL__(*(_DWORD *)(v3 + 12) + (v262 ^ v265 ^ v263) + v264 - 542816250, 7);
  v149 = v262 ^ v148;
  v150 = __ROL__(*(_DWORD *)v3 + (v149 ^ v265 & (v262 ^ v149)) + v263 - 397515647, 14);
  v151 = _byteswap_ulong(~v265) ^ v150;
  v152 = __ROL__(*(_DWORD *)v3 + (v265 ^ v149 ^ v151) + v262 - 1994564279, 23);
  v153 = ~v151 ^ v152;
  v154 = *(_DWORD *)(v3 + 8) + (v153 ^ v149 ^ v151);
  v263 = v151;
  v262 = v153;
  v155 = __ROL__(v154 + v265 + 1730515082, 2);
  v156 = v155 - v149;
  v157 = __ROL__(*(_DWORD *)(v3 + 12) + (v156 ^ v153 & (v156 ^ v151)) + v149 + 1783879536, 14);
  v158 = _byteswap_ulong(~v153) ^ v157;
  v265 = v156;
  v264 = v158;
  _EAX = _InterlockedExchange((signed __int32 *)&v263, v158);
  _EDX = _InterlockedExchange(&v265, v156);
  __asm { arpl    ax, dx }
  v161 = _InterlockedExchange((signed __int32 *)&v263, _EAX);
  _InterlockedExchange(&v265, _EDX);
  v162 = v264;
  v163 = v8393(v161, v265, v264, v262);
  v164 = __ROL__(v163 + v263 + *(_DWORD *)(v3 + 4) - 863388681, 30);
  v165 = ~v162 ^ v164;
  v263 = v165;
  _EAX = _InterlockedExchange(&v265, v165);
  _EDX = _InterlockedExchange((signed __int32 *)&v262, v167);
  __asm { arpl    ax, dx }
  _InterlockedExchange(&v265, _EAX);
  _InterlockedExchange((signed __int32 *)&v262, _EDX);
  v169 = v262;
  v170 = _byteswap_ulong(~v263);
  v171 = __ROL__(*(_DWORD *)v3 + (v265 ^ v264 ^ v263) + v262 - 291313153, 16);
  v262 = v171 - v170;
  _EAX = _InterlockedExchange(&v264, v170);
  _EDX = _InterlockedExchange(&v265, v169);
  __asm { arpl    ax, dx }
  _InterlockedExchange(&v264, _EAX);
  _InterlockedExchange(&v265, _EDX);
  v174 = __ROL__(*(_DWORD *)(v3 + 4) + (v263 ^ (v264 | ~v262)) + v265 + 1647080717, 13);
  v175 = v264 + v174;
  v176 = *(_DWORD *)(v3 + 8);
  v177 = __ROL__(v264 + v263 + *(_DWORD *)v3 - v262 + v175 - 1113757831, 21);
  v178 = v177 - v263;
  v264 = v178;
  v179 = __ROL__(v176 + (v262 ^ v175 ^ v178) + v263 + 228922901, 7);
  v263 = ~v175 + v179;
  v180 = v8393(~v175, v178, v263);
  v181 = __ROL__(*(_DWORD *)v3 + v180 + v262 + 545626728, 24);
  v182 = v181 - v263;
  v183 = __ROL__(*(_DWORD *)(v3 + 4) + (v182 & v178 ^ v263 & (v182 ^ v178)) + v175 - 2139171116, 20);
  v184 = v183 - v263;
  v185 = __ROL__(*(_DWORD *)(v3 + 12) + (v182 & v184 ^ v263 & (v182 ^ v184)) + v264 - 309490666, 13);
  v186 = ~v182 + v185;
  v187 = *(_DWORD *)v3 + (v182 ^ (v184 | ~v186));
  v264 = v186;
  v188 = __ROL__(v187 + v263 - 1466651521, 2);
  v189 = _byteswap_ulong(~v184) + v188;
  v190 = __ROL__(v184 + v186 + *(_DWORD *)(v3 + 12) - v189 + v182 - 2147087047, 26);
  v191 = v184 + v190;
  v263 = v189;
  v192 = __ROL__(*(_DWORD *)(v3 + 12) + v8393(v182, v189, v191, v186) + v184 + 700891458, 6);
  v193 = v192 + v191 + 1;
  v194 = *(_DWORD *)(v3 + 4);
  v262 = ~v191;
  v195 = __ROL__(v194 + (v193 ^ (v191 | ~v263)) + v264 + 359723466, 7);
  v196 = v195 - _byteswap_ulong(~v191);
  v265 = v193;
  v197 = __ROL__(v196 + v263 + v194 - v193 + v191 + 1352492736, 15);
  v198 = ~v191 ^ v197;
  v199 = v193 & v196 ^ v198 & (v193 ^ v196);
  v200 = *(_DWORD *)(v3 + 4);
  v201 = __ROL__(v200 + v199 + v191 + 731862510, 23);
  v202 = v201 - _byteswap_ulong(~v198);
  v203 = __ROL__(v200 + (v202 ^ (v198 | ~v196)) + v265 - 136239548, 6);
  v204 = _byteswap_ulong(-v198) ^ v203;
  v205 = *(_DWORD *)(v3 + 4) + (v202 ^ v204 ^ v198);
  v263 = ~v204;
  v206 = __ROL__(v205 + v196 + 1423683416, 3);
  v207 = ~v204 ^ v206;
  v262 = v202;
  v208 = __ROL__(*(_DWORD *)(v3 + 12) + (v202 ^ v204 ^ v207) + v198 - 373081087, 9);
  v209 = v204 + v208;
  v210 = __ROL__(v204 + v207 + *(_DWORD *)(v3 + 4) - v209 + v202 - 2092948728, 9);
  v211 = _byteswap_ulong(~v204) + v210;
  v212 = *(_DWORD *)v3 + (v211 ^ v209 & (v211 ^ v207));
  v262 = v211;
  v213 = __ROL__(v212 + v204 - 141321586, 23);
  v214 = v209 + v213;
  v215 = *(_DWORD *)(v3 + 4) + (v211 ^ v214 ^ v209);
  v265 = v214;
  v216 = __ROL__(v215 + v207 + 758207654, 17);
  v217 = v216 - v214;
  v264 = v217;
  v218 = __ROL__(*(_DWORD *)(v3 + 8) + (v211 ^ (v214 | ~v217)) + v209 - 105656967, 28);
  v219 = v214 ^ v218;
  v263 = v219;
  _EAX = _InterlockedExchange(&v264, v219);
  _EDX = _InterlockedExchange((signed __int32 *)&v262, v209);
  __asm { arpl    ax, dx }
  _InterlockedExchange(&v264, _EAX);
  _InterlockedExchange((signed __int32 *)&v262, _EDX);
  v222 = *(_DWORD *)v3;
  v223 = *(_DWORD *)(v3 + 8);
  v224 = __ROL__(*(_DWORD *)v3 + (v265 ^ (v263 | ~v264)) + v262 + 19130758, 5);
  v225 = v224 - v263;
  v262 = v225;
  v226 = __ROL__(v265 + v264 + v223 - v263 + v225 - 1012075900, 25);
  v227 = ~v225 ^ v226;
  v228 = __ROL__(v264 + v263 + v222 - v225 + v227 + 1202620042, 22);
  v229 = _byteswap_ulong(v263) ^ v228;
  v264 = v229;
  v230 = *(_DWORD *)v3 + (v227 ^ v225 & (v227 ^ v229));
  v231 = -v225;
  v232 = __ROL__(v230 + v263 + 1999161866, 19);
  v265 = v227;
  v263 = v231 ^ v232;
  _EAX = _InterlockedExchange(&v264, v231);
  _EDX = _InterlockedExchange(&v265, v227);
  __asm { arpl    ax, dx }
  _InterlockedExchange(&v264, _EAX);
  _InterlockedExchange(&v265, _EDX);
  v235 = v262;
  v236 = _byteswap_ulong(v263);
  v237 = __ROL__(*(_DWORD *)(v3 + 12) + (v264 ^ (v263 | ~v265)) + v262 - 1358273280, 15);
  v262 = v237 - v236;
  _EAX = _InterlockedExchange(&v265, v236);
  _EDX = _InterlockedExchange(&v264, v235);
  __asm { arpl    ax, dx }
  _InterlockedExchange(&v265, _EAX);
  _InterlockedExchange(&v264, _EDX);
  v240 = v265;
  v241 = __ROL__(*(_DWORD *)(v3 + 8) + (v264 ^ (v263 | ~v262)) + v265 + 581750887, 9);
  v265 = ~v263 ^ v241;
  _EAX = _InterlockedExchange((signed __int32 *)&v262, ~v263);
  _EDX = _InterlockedExchange(&v264, v240);
  __asm { arpl    ax, dx }
  _InterlockedExchange((signed __int32 *)&v262, _EAX);
  _InterlockedExchange(&v264, _EDX);
  v244 = __ROL__(*(_DWORD *)(v3 + 12) + (v262 ^ v265 ^ v263) + v264 + 737343371, 14);
  v264 = v244 + v263 + 1;
  v245 = __ROL__(*(_DWORD *)(v3 + 12) + (v262 ^ v265 & (v262 ^ v264)) + v263 - 539841844, 9);
  v246 = v265 + v245;
  v247 = __ROL__(v265 + v246 + *(_DWORD *)(v3 + 4) - v264 + v262 + 1228078, 5);
  v248 = ~v246 ^ v247;
  v249 = *(_DWORD *)v3 + (v246 ^ v264 & (v248 ^ v246));
  v262 = v248;
  v250 = __ROL__(v249 + v265 - 1603625506, 29);
  v251 = v264 + v250;
  v252 = v8393(v249, v251, v248);
  v253 = __ROL__(*(_DWORD *)(v3 + 4) + v252 + v264 + 1417801983, 25);
  v254 = -v262 ^ v253;
  v264 = v254;
  v255 = *(_DWORD *)(v3 + 12);
  v256 = __ROL__(*(_DWORD *)(v3 + 8) + (v262 & v251 ^ v254 & (v262 ^ v251)) + v246 - 739996948, 14);
  v257 = ~v251 ^ v256;
  v258 = __ROL__(v255 + (v257 ^ (v251 | ~v254)) + v262 - 1378347547, 7);
  v259 = v251 + v258 + *(_DWORD *)v3;
  *(_DWORD *)(v3 + 4) += v251;
  v260 = *(_DWORD *)(v3 + 8);
  *(_DWORD *)v3 = v259;
  result = v264 + v260;
  *(_DWORD *)(v3 + 8) = result;
  *(_DWORD *)(v3 + 12) = v257 + v255;
  _m_femms();
  return result;
}
	//----- (00002E90) --------------------------------------------------------
int __fastcall sub_2E90(int a1, int a2, int a3, int a4, unsigned int a5)
{
  int v5; // esi@1
  unsigned int v6; // ecx@1
  unsigned int v7; // eax@1
  unsigned __int8 v8; // dl@1
  int v9; // ecx@3
  int result; // eax@9
	  v5 = a3;
  v6 = *(_DWORD *)(a3 + 8);
  v7 = *(_DWORD *)(v5 + 4);
  v8 = 0;
  if ( v6 <= v7 && v7 - v6 >= 1 )
  {
    v8 = *(_BYTE *)(v6 + *(_DWORD *)v5);
    v9 = v6 + 1;
  }
  else
  {
    v9 = v7 + 1;
  }
  *(_DWORD *)(v5 + 8) = v9;
  if ( v9 <= v7 && v7 - v9 >= v8 && v8 < a5 )
    sub_595D(a4, v9 + *(_DWORD *)v5, v8);
  result = v7 + 1;
  *(_DWORD *)(v5 + 8) = result;
  return result;
}
	//----- (00003170) --------------------------------------------------------
int __fastcall sub_3170(int a1, int a2, int a3, int a4)
{
  unsigned int v4; // edx@2
  int result; // eax@3
  int v6; // esi@4
	  if ( *(_BYTE *)(a3 + 12) && (v4 = *(_DWORD *)(a3 + 4), *(_DWORD *)(a3 + 8) <= v4) )
  {
    result = a4;
    v6 = *(_DWORD *)(a3 + 8);
    *(_DWORD *)a4 = v6 + *(_DWORD *)a3;
    *(_DWORD *)(a4 + 4) = v4 - v6;
    *(_DWORD *)(a4 + 8) = 0;
  }
  else
  {
    result = a4;
    *(_DWORD *)a4 = 65901181;
    *(_DWORD *)(a4 + 4) = -1;
    *(_DWORD *)(a4 + 8) = 0;
  }
  return result;
}
	//----- (00003210) --------------------------------------------------------
void __fastcall sub_3210(int a1, int a2, int a3)
{
  *(_DWORD *)a3 = 0;
  *(_DWORD *)(a3 + 4) = 0;
  *(_DWORD *)(a3 + 8) = 1779033703;
  *(_DWORD *)(a3 + 12) = -1150833019;
  *(_DWORD *)(a3 + 16) = 1013904242;
  *(_DWORD *)(a3 + 20) = -1521486534;
  *(_DWORD *)(a3 + 24) = 1359893119;
  *(_DWORD *)(a3 + 28) = -1694144372;
  *(_DWORD *)(a3 + 32) = 528734635;
  *(_DWORD *)(a3 + 36) = 1541459225;
}
	//----- (00003387) --------------------------------------------------------
int __fastcall sub_3387(int a1, int a2, int a3, int a4)
{
  int v4; // eax@1
  int v5; // ecx@1
  int result; // eax@2
  int v7; // esi@3
	  v4 = a3;
  v5 = a4 - 1;
  if ( a4 )
  {
    v7 = v4;
    while ( *(_BYTE *)a2 && v5 )
    {
      *(_BYTE *)v4++ = *(_BYTE *)a2++;
      --v5;
    }
    *(_BYTE *)v4 = 0;
    result = v4 - v7;
  }
  else
  {
    result = 0;
  }
  return result;
}
	//----- (000033C0) --------------------------------------------------------
__int16 __fastcall sub_33C0(int a1, int a2, int a3, int a4)
{
  unsigned int v4; // eax@1
  unsigned int v5; // edx@1
	  *(_WORD *)a4 = 0;
  v4 = *(_DWORD *)(a3 + 8);
  v5 = *(_DWORD *)(a3 + 4);
  if ( v4 <= v5 && v5 - v4 >= 2 )
  {
    LOWORD(v4) = *(_WORD *)(v4 + *(_DWORD *)a3);
    *(_WORD *)a4 = v4;
    *(_DWORD *)(a3 + 8) += 2;
  }
  else
  {
    *(_DWORD *)(a3 + 8) = v5 + 1;
  }
  return v4;
}
	//----- (00003610) --------------------------------------------------------
int __cdecl sub_3610(int a1)
{
  int v1; // eax@1
	  v1 = v3ED9048(0, a1);
  return v3ED904C(v1);
}
// 3ED9048: using guessed type int (__stdcall *)(_DWORD, _DWORD);
// 3ED904C: using guessed type int (__stdcall *)(_DWORD);
	//----- (00003810) --------------------------------------------------------
char __fastcall sub_3810(int a1, int a2, int a3, unsigned int a4)
{
  unsigned int v4; // edx@1
  unsigned int v5; // esi@1
  int v6; // eax@2
  char result; // al@5
	  v4 = *(_DWORD *)(a3 + 4);
  v5 = *(_DWORD *)(a3 + 8);
  if ( v5 <= v4 )
    v6 = v4 - v5;
  else
    v6 = 0;
  if ( v6 < a4 )
  {
    *(_DWORD *)(a3 + 8) = v4 + 1;
    result = 0;
  }
  else
  {
    result = 1;
  }
  return result;
}
	//----- (00003840) --------------------------------------------------------
int (*__cdecl sub_3840())(void)
{
  int (*result)(void); // eax@1
  int v1; // edi@2
  signed int i; // esi@2
	  result = (int (*)(void))v3EDA120;
  if ( v3EDA120 )
  {
    v1 = 4 * v3EDA120 + 65904800;
    for ( i = 65904800; i < (unsigned int)v1; i += 4 )
    {
      result = *(int (**)(void))i;
      if ( *(_DWORD *)i )
        result = (int (*)(void))result();
    }
  }
  return result;
}
	//----- (00003890) --------------------------------------------------------
signed int __fastcall sub_3890(int a1, int a2, int a3, int a4, int a5)
{
  int v5; // edi@1
  char v6; // dl@3
  unsigned int v7; // eax@4
  unsigned int v8; // ecx@4
  unsigned int v9; // eax@9
  unsigned int v10; // ecx@9
  unsigned __int8 v11; // bl@9
  signed int result; // eax@16
  int v13; // eax@17
  int v14; // [sp+Ch] [bp-114h]@0
  unsigned __int8 v15; // [sp+17h] [bp-109h]@0
  int v16; // [sp+18h] [bp-108h]@1
  char v17; // [sp+1Ch] [bp-104h]@2
  unsigned int v18; // [sp+11Ch] [bp-4h]@1
  int v19; // [sp+120h] [bp+0h]@1
	  v18 = (unsigned int)&v19 ^ v3EDA03C;
  v5 = a5;
  v16 = a3;
  if ( *(_BYTE *)(a4 + 12) )
    sub_2E90((int)&v17, a2, a4, (int)&v17, 0x100u);
  v6 = *(_BYTE *)(a4 + 12);
  if ( v6
    && ((v7 = *(_DWORD *)(a4 + 8), v8 = *(_DWORD *)(a4 + 4), v14 = 0, v7 <= v8) && v8 - v7 >= 4 ? (v14 = *(_DWORD *)(v7 + *(_DWORD *)a4),
                                                                                                   *(_DWORD *)(a4 + 8) = v7 + 4) : (*(_DWORD *)(a4 + 8) = v8 + 1),
        v6) )
  {
    v9 = *(_DWORD *)(a4 + 8);
    v10 = *(_DWORD *)(a4 + 4);
    v11 = 0;
    if ( v9 <= v10 && (v5 = a5, v10 - v9 >= 1) )
    {
      v11 = *(_BYTE *)(v9 + *(_DWORD *)a4);
      *(_DWORD *)(a4 + 8) = v9 + 1;
    }
    else
    {
      *(_DWORD *)(a4 + 8) = v10 + 1;
    }
  }
  else
  {
    v11 = v15;
  }
  if ( v6 && *(_DWORD *)(a4 + 8) <= *(_DWORD *)(a4 + 4) )
  {
    v13 = (*(int (__fastcall **)(_DWORD, char *, int, int))(*(_DWORD *)v5 + 4))(
            *(_DWORD *)(*(_DWORD *)v5 + 4),
            &v17,
            v5,
            v17 != 0 ? (int)&v17 : 0);
    if ( v13 && v14 && (!v11 || v11 == 1) )
    {
      if ( v11 == 1 )
        *(_DWORD *)v16 = (*(int (__fastcall **)(int, _DWORD, int, int, int))(*(_DWORD *)v5 + 8))(
                           v13,
                           *(_DWORD *)(*(_DWORD *)v5 + 8),
                           v5,
                           v13,
                           v14);
      else
        *(_DWORD *)v16 = 0;
    }
    else
    {
      *(_DWORD *)v16 = 0;
    }
    result = 0;
  }
  else
  {
    result = 3;
  }
  return result;
}
	//----- (00003A00) --------------------------------------------------------
int __fastcall sub_3A00(int a1, int a2, int a3, int a4)
{
  int v4; // ebx@1
  int v5; // edx@1
  int v6; // eax@4
  signed int v7; // eax@5
  signed int v8; // edi@5
  signed int v9; // esi@5
  signed int v10; // ecx@5
  char v11; // zf@5
  int v12; // eax@10
  char v13; // al@12
  int v15; // [sp+8h] [bp-118h]@3
  int v16; // [sp+Ch] [bp-114h]@4
  int v17; // [sp+10h] [bp-110h]@4
  unsigned int v18; // [sp+11Ch] [bp-4h]@1
  int v19; // [sp+120h] [bp+0h]@1
	  v18 = (unsigned int)&v19 ^ v3EDA03C;
  v4 = a3;
  *(_DWORD *)(a3 + 4) = a4;
  *(_DWORD *)a3 = 65901440;
  v3ED902C(a3 + 8);
  if ( *(_DWORD *)(v4 + 12) < 0x1000u )
    *(_DWORD *)(v4 + 12) = 4096;
  *(_DWORD *)(v4 + 56) = sub_5990(4096, v5, a4);
  *(_DWORD *)(v4 + 48) = 0;
  *(_DWORD *)(v4 + 52) = 0;
  v15 = 276;
  if ( v3ED9028(&v15) )
  {
    v6 = v17;
    *(_DWORD *)(v4 + 48) = v16;
    *(_DWORD *)(v4 + 52) = v6;
  }
  v7 = 65901340;
  v8 = 65901184;
  v9 = 65901340;
  v10 = 13;
  v11 = 1;
  do
  {
    if ( !v10 )
      break;
    v11 = *(_BYTE *)v9++ == *MK_FP(__ES__, v8++);
    --v10;
  }
  while ( v11 );
  if ( v11 )
    v7 = 0;
  v12 = v3ED9020(v7);
  v13 = v12 && v3ED901C(v12, 65901524);
  *(_BYTE *)(v4 + 44) = v13;
  return v4;
}
// 3ED901C: using guessed type int (__stdcall *)(_DWORD, _DWORD);
// 3ED9020: using guessed type int (__stdcall *)(_DWORD);
// 3ED9028: using guessed type int (__stdcall *)(_DWORD);
// 3ED902C: using guessed type int (__stdcall *)(_DWORD);
	//----- (00003CA0) --------------------------------------------------------
int __fastcall sub_3CA0(int a1, int a2, int a3)
{
  int v3; // edi@1
  unsigned int v4; // esi@1
  int v5; // eax@1
  int v6; // edx@1
  int v7; // edx@1
  char v9; // [sp+8h] [bp-78h]@1
  int v10; // [sp+68h] [bp-18h]@1
  int v11; // [sp+6Ch] [bp-14h]@1
  int v12; // [sp+70h] [bp-10h]@1
  int v13; // [sp+74h] [bp-Ch]@1
  int v14; // [sp+78h] [bp-8h]@1
  unsigned int v15; // [sp+7Ch] [bp-4h]@1
  int v16; // [sp+80h] [bp+0h]@1
	  v15 = (unsigned int)&v16 ^ v3EDA03C;
  v3 = a3;
  v4 = a2;
  sub_1EF0((unsigned int)&v16 ^ v3EDA03C, a2, (int)&v9);
  sub_1346(v5, v6, (int)&v9, v3, v4);
  sub_109F((int)&v10, v7, (int)&v9, (int)&v10);
  return v14 ^ v13 ^ v12 ^ v11 ^ v10;
}
	//----- (00003D00) --------------------------------------------------------
int __fastcall sub_3D00(int a1, int a2, int a3, unsigned int *a4, int a5)
{
  unsigned int *v5; // ebx@1
  int v6; // edi@1
  unsigned int v7; // ecx@1
  signed __int64 v8; // qax@1
  int v9; // esi@1
  unsigned __int8 v10; // cf@1
  unsigned int v12; // [sp+14h] [bp+8h]@7
  unsigned int v13; // [sp+18h] [bp+Ch]@2
	  v5 = a4;
  v6 = a3;
  v7 = a5;
  v8 = 8i64 * (unsigned int)a5;
  v9 = (*(_DWORD *)v6 >> 3) & 0x3F;
  v10 = __CFADD__((_DWORD)v8, *(_DWORD *)v6);
  *(_DWORD *)v6 += v8;
  *(_DWORD *)(v6 + 4) += HIDWORD(v8) + v10;
  if ( v9 )
  {
    v7 = v9 + a5;
    v5 = (unsigned int *)((char *)a4 - v9);
    v13 = v7;
    if ( v7 < 0x40 )
      goto LABEL_10;
    for ( ; (unsigned int)v9 < 0x40; ++v9 )
    {
      LOBYTE(v8) = *((_BYTE *)v5 + v9);
      *(_BYTE *)(v6 + v9 + 40) = v8;
    }
    LODWORD(v8) = sub_74A0(v8, (unsigned int *)(v6 + 40), v6 + 8);
    a5 = v13 - 64;
    v7 = a5;
    v5 += 16;
    v9 = 0;
  }
  if ( v7 >= 0x40 )
  {
    v12 = v7 >> 6;
    do
    {
      LODWORD(v8) = sub_74A0(v8, v5, v6 + 8);
      a5 -= 64;
      v5 += 16;
      --v12;
    }
    while ( v12 );
    v7 = a5;
  }
LABEL_10:
  while ( v9 < v7 )
  {
    *(_BYTE *)(v6 + v9 + 40) = *((_BYTE *)v5 + v9);
    ++v9;
  }
  return v8;
}
	//----- (00003DA5) --------------------------------------------------------
void __fastcall sub_3DA5(int a1, int a2, int a3)
{
  int v3; // esi@1
  int v4; // edi@1
  int v5; // ecx@1
  int v6; // eax@1
  int v7; // eax@3
  int v8; // edx@3
	  v3 = a3;
  v4 = a3 + 1984;
  v5 = *(_DWORD *)(a3 + 1984);
  *(_DWORD *)v3 = 65901244;
  *(_DWORD *)(v3 + 20) = 65901236;
  (*(void (**)(void))(*(_DWORD *)v5 + 28))();
  *(_DWORD *)v4 = 0;
  (***(void (****)(void))(v3 + 552))();
  v6 = *(_DWORD *)(v3 + 28);
  *(_DWORD *)(v3 + 552) = 0;
  if ( v6 )
  {
    (*(void (__stdcall **)(int))(**(_DWORD **)(v3 + 24) + 20))(v6);
    *(_DWORD *)(v3 + 28) = 0;
  }
  v7 = (*(int (__stdcall **)(int, signed int))(**(_DWORD **)(v3 + 24) + 24))(v3 + 32, 520);
  sub_1FB4(v7, v8, v3 + 1988);
  *(_DWORD *)v3 = 65901200;
}
	//----- (00003E40) --------------------------------------------------------
int __fastcall sub_3E40(int a1, int a2, int a3, int a4, int a5, int a6, int a7)
{
  unsigned __int8 v7; // bl@1
  int v8; // edi@1
  int (__fastcall *v9)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD); // eax@1
  int v10; // ecx@3
  int result; // eax@3
  unsigned int v12; // eax@6
  unsigned int v13; // ecx@6
  int v14; // eax@8
  char v15; // [sp+6Ah] [bp-21Ah]@3
  char v16; // [sp+6Bh] [bp-219h]@1
  unsigned int v17; // [sp+280h] [bp-4h]@1
  int v18; // [sp+284h] [bp+0h]@1
	  v17 = (unsigned int)&v18 ^ v3EDA03C;
  v7 = 0;
  v8 = a3;
  *(_BYTE *)a6 = 0;
  v16 = 0;
  v9 = *(int (__fastcall **)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD))(a3 + 1976);
  if ( !v9 )
    goto LABEL_6;
  if ( v16 )
    return 0;
  v10 = a3 + *(_DWORD *)(a3 + 1980);
  v16 = 1;
  v15 = 0;
  result = v9(v9, &v15, v10, a4, a5, &v15, a7);
  if ( v15 && !result )
  {
    *(_DWORD *)(v8 + 1976) = 0;
    *(_DWORD *)(v8 + 1980) = 0;
LABEL_6:
    v12 = *(_DWORD *)(a5 + 8);
    v13 = *(_DWORD *)(a5 + 4);
    if ( v12 <= v13 && v13 - v12 >= 1 )
    {
      v7 = *(_BYTE *)(v12 + *(_DWORD *)a5);
      v14 = v12 + 1;
    }
    else
    {
      v14 = v13 + 1;
    }
    *(_DWORD *)(a5 + 8) = v14;
    if ( v14 > v13 )
      return 3;
    if ( (v7 ^ (unsigned int)*(_BYTE *)(v8 + 4)) <= 0xCD )
      JUMPOUT(__CS__, *(_DWORD *)(4 * *(_BYTE *)((v7 ^ *(_BYTE *)(v8 + 4)) + 0x3ED4B60) + 0x3ED4B2C));
    *(_BYTE *)a6 = 1;
    return 0;
  }
  return result;
}
	//----- (00004CF6) --------------------------------------------------------
int __fastcall sub_4CF6(int a1, int a2, int a3, const void *a4, int a5, int a6)
{
  int v6; // ebx@1
	  v6 = a3;
  memcpy((void *)a3, a4, 0x20u);
  *MK_FP(__ES__, a3 + 32) = *(_DWORD *)a5;
  *MK_FP(__ES__, a3 + 36) = *(_DWORD *)(a5 + 4);
  *MK_FP(__ES__, a3 + 40) = *(_DWORD *)(a5 + 8);
  *MK_FP(__ES__, a3 + 44) = *(_DWORD *)(a5 + 12);
  *(_DWORD *)(a3 + 156) = 0;
  *(_DWORD *)(a3 + 152) = a6;
  sub_3210(a6, a2, a3 + 48);
  return v6;
}
	//----- (00004F41) --------------------------------------------------------
char __fastcall sub_4F41(int a1, int a2, int a3)
{
  int v3; // ebx@1
  int v4; // eax@1
  int v5; // edi@1
  int v6; // edx@2
  int v7; // edx@3
  int v8; // edx@6
  int v9; // edx@6
  int v10; // esi@6
  int v11; // edx@6
  int v12; // eax@9
  int v13; // edx@9
  int v14; // edi@13
  int v15; // ecx@13
  char *v16; // esi@13
  char v17; // zf@13
  int v18; // eax@17
  int v19; // eax@18
  int v20; // edx@18
  char v22; // [sp+8h] [bp-29Ch]@18
  int v23; // [sp+14h] [bp-290h]@18
  int v24; // [sp+28h] [bp-27Ch]@6
  int v25; // [sp+2Ch] [bp-278h]@6
  unsigned int v26; // [sp+30h] [bp-274h]@6
  char *v27; // [sp+34h] [bp-270h]@2
  int v28; // [sp+38h] [bp-26Ch]@2
  int v29; // [sp+3Ch] [bp-268h]@2
  int v30; // [sp+40h] [bp-264h]@3
  int v31; // [sp+44h] [bp-260h]@2
  unsigned int v32; // [sp+48h] [bp-25Ch]@2
  unsigned int v33; // [sp+4Ch] [bp-258h]@2
  char v34; // [sp+50h] [bp-254h]@18
  unsigned __int8 v35; // [sp+56h] [bp-24Eh]@6
  unsigned __int8 v36; // [sp+57h] [bp-24Dh]@2
  char v37; // [sp+58h] [bp-24Ch]@18
  char v38; // [sp+160h] [bp-144h]@12
  char v39; // [sp+260h] [bp-44h]@6
  unsigned int v40; // [sp+2A0h] [bp-4h]@1
  int v41; // [sp+2A4h] [bp+0h]@1
	  v40 = (unsigned int)&v41 ^ v3EDA03C;
  v3 = a3;
  v4 = *(_DWORD *)(a3 + 1904);
  v5 = 0;
  if ( v4 )
  {
    v32 = *(_DWORD *)(a3 + 1904);
    v31 = a3 + 1648;
    v33 = 0;
    v27 = 0;
    v28 = 0;
    v29 = 1;
    LOBYTE(v4) = sub_6FE0((int)&v36, a2, (int)&v31, (int)&v36);
    if ( v36 )
    {
      while ( 1 )
      {
        LOBYTE(v4) = sub_6FE0((int)&v30, v6, (int)&v31, (int)&v30);
        if ( (unsigned __int8)v30 >= 0x40u
          || (LOBYTE(v4) = v33, v33 > v32)
          || (LOBYTE(v4) = v36 - 1, v36 != 1)
          || (sub_2E90((int)&v39, v7, (int)&v31, (int)&v39, 0x40u),
              sub_1CB0((int)&v25, v8, (int)&v31, (int)&v25),
              sub_6FE0((int)&v35, v9, (int)&v31, (int)&v35),
              v10 = v35,
              v26 = v35,
              v821A(&v24, v11, &v31, &v24, v35),
              LOBYTE(v4) = v33,
              v33 > v32)
          || v35 > 0xFFu )
          return v4;
        if ( !v39 )
          break;
        v12 = (*(int (__stdcall **)(char *))(**(_DWORD **)(v3 + 552) + 4))(&v39);
        if ( v12 != v5 )
          goto LABEL_12;
LABEL_20:
        v5 = 0;
        v27 = 0;
        v28 = 0;
        v29 = 1;
        LOBYTE(v4) = sub_6FE0((int)&v36, v6, (int)&v31, (int)&v36);
        if ( !v36 )
          return v4;
      }
      v12 = 0;
LABEL_12:
      if ( (unsigned __int8)(*(int (__stdcall **)(char *, int, int, int))(**(_DWORD **)(v3 + 552) + 12))(
                              &v38,
                              v12,
                              v25,
                              v10) )
      {
        v14 = v24;
        v15 = v10;
        v16 = &v38;
        v17 = 1;
        do
        {
          if ( !v15 )
            break;
          v17 = *v16++ == *MK_FP(__ES__, v14++);
          --v15;
        }
        while ( v17 );
        if ( !v17 )
        {
          v18 = (unsigned __int8)v30 + v3 + 1908;
          if ( !*(_BYTE *)v18 )
          {
            *(_BYTE *)v18 = 1;
            v29 = 0;
            v27 = &v37;
            v28 = 263;
            v34 = 3;
            sub_5730((int)&v34, v13, (int)&v27, (int)&v34);
            v19 = sub_524A((int)&v27, v20, (int)&v22, (int)&v27);
            sub_60F0(v19, v20, (int)&v22, v30);
            sub_1444((int)&v38, v20, v23, (int)&v38, v26);
            LOBYTE(v4) = v23;
            if ( *(_DWORD *)(v23 + 8) > *(_DWORD *)(v23 + 4) )
              return v4;
            sub_7AA0(v23, v13, (int)&v22);
            sub_51F2((int)&v37, v13, v3, (int)&v37, *(_DWORD *)(v23 + 8));
          }
        }
      }
      goto LABEL_20;
    }
  }
  return v4;
}
	//----- (000051C5) --------------------------------------------------------
int __fastcall sub_51C5(int a1, int a2, int a3, int a4, int a5, int a6, int a7)
{
  int v7; // ecx@1
  int result; // eax@1
  int v9; // et0@1
	  v7 = __ROL__(a3, 5);
  result = a7;
  *(_DWORD *)a6 += (a5 ^ a4 ^ *(_DWORD *)a2) + v7 + *(_DWORD *)a7 + 1859775393;
  v9 = __ROL__(*(_DWORD *)a2, 30);
  *(_DWORD *)a2 = v9;
  *(_DWORD *)a7 = 0;
  return result;
}
	//----- (000051F2) --------------------------------------------------------
int __fastcall sub_51F2(int a1, int a2, int a3, int a4, unsigned int a5)
{
  int v5; // esi@1
	  v5 = a3;
  sub_57D0(a1, a2, a3 + 32, a4, a5);
  return (*(int (**)(void))(**(_DWORD **)(v5 + 24) + 4))();
}
	//----- (00005210) --------------------------------------------------------
int __fastcall sub_5210(int a1, int a2, int a3, int a4, int a5, int a6, int a7)
{
  int v7; // ecx@1
  int result; // eax@1
  int v9; // et0@1
	  v7 = __ROL__(a3, 5);
  result = a7;
  *(_DWORD *)a6 += (a4 & *(_DWORD *)a2 | a5 & ~*(_DWORD *)a2) + v7 + *(_DWORD *)a7 + 1518500249;
  v9 = __ROL__(*(_DWORD *)a2, 30);
  *(_DWORD *)a2 = v9;
  *(_DWORD *)a7 = 0;
  return result;
}
	//----- (0000524A) --------------------------------------------------------
int __fastcall sub_524A(int a1, int a2, int a3, int a4)
{
  int v4; // esi@1
	  v4 = a3;
  *(_DWORD *)a3 = 0;
  *(_DWORD *)(a3 + 4) = 0;
  *(_DWORD *)(a3 + 8) = 1;
  *(_DWORD *)(v4 + 12) = v4;
  sub_6D70(a1, a2, a3, a4);
  return v4;
}
	//----- (00005270) --------------------------------------------------------
int __usercall sub_5270<eax>(char _CF<cf>, char _ZF<zf>, char _SF<sf>, char _OF<of>, int a5<eax>, int a6<edx>, int a7<ecx>, int a8<ebx>, int a9<edi>, int a10<esi>, char a11)
{
  int v11; // eax@6
  int v12; // eax@6
  int v13; // eax@6
  int v14; // edx@6
  int v15; // eax@8
  int v17; // [sp-4h] [bp-338h]@0
  bool v18; // [sp+0h] [bp-334h]@4
  int v19; // [sp+4h] [bp-330h]@1
  int (*v20)(void); // [sp+8h] [bp-32Ch]@2
  int v21; // [sp+334h] [bp+0h]@0
  void *v22; // [sp+338h] [bp+4h]@1
	  v3EDA230 = a5;
  v3EDA22C = a7;
  v3EDA228 = a6;
  v3EDA224 = a8;
  v3EDA220 = a10;
  v3EDA21C = a9;
  v3EDA248 = __SS__;
  v3EDA23C = __CS__;
  v3EDA218 = __DS__;
  v3EDA214 = __ES__;
  v3EDA210 = __FS__;
  v3EDA20C = __GS__;
  __asm { pushf }
  v3EDA240 = v17;
  v3EDA234 = v21;
  v3EDA238 = v22;
  v3EDA244 = &a11;
  v3EDA180 = 65537;
  v3EDA134 = v22;
  v3EDA128 = -1073740791;
  v3EDA12C = 1;
  v19 = v3ED9020(65901684);
  v18 = v19 && (v20 = (int (*)(void))v3ED901C(v19, 65901664)) != 0 && v20();
  v3EDA178 = v18;
  sub_11B0();
  v12 = v3ED905C(v11, v14, 1, 0);
  v13 = v3ED9058(v12, v14);
  if ( !v3EDA178 )
    sub_11B0();
  v15 = v3ED9054(v13, v14);
  return v3ED9050(v15);
}
// 3ED901C: using guessed type int (__stdcall *)(_DWORD, _DWORD);
// 3ED9020: using guessed type int (__stdcall *)(_DWORD);
// 3ED9050: using guessed type int (__stdcall *)(_DWORD);
// 3ED9054: using guessed type int (__fastcall *)(_DWORD, _DWORD);
// 3ED9058: using guessed type int (__fastcall *)(_DWORD, _DWORD);
// 3ED905C: using guessed type int (__fastcall *)(_DWORD, _DWORD, _DWORD, _DWORD);
	//----- (00005460) --------------------------------------------------------
signed int __stdcall sub_5460(int a1, int a2, int a3)
{
  signed int v4; // edi@5
	  if ( a2 == 1 )
  {
    sub_6E00(1);
    v3EDA124 = 0;
    if ( sub_5510(0x3ED9094u, 0x3ED909Cu) )
      return 0;
    sub_7340(0x3ED9088u, 0x3ED9090u);
    v3EDA124 = 1;
  }
  v4 = sub_22A0(a1, a2, a3);
  if ( !a2 )
  {
    if ( v3EDA124 )
    {
      sub_3840();
      sub_7340(0x3ED90A0u, 0x3ED90A4u);
      sub_7340(0x3ED90A8u, 0x3ED90ACu);
      v3EDA124 = 0;
    }
  }
  return v4;
}
	//----- (00005510) --------------------------------------------------------
int __cdecl sub_5510(unsigned int a1, unsigned int a2)
{
  unsigned int v2; // esi@1
  int result; // eax@1
	  v2 = a1;
  for ( result = 0; v2 < a2; v2 += 4 )
  {
    if ( result )
      break;
    if ( *(_DWORD *)v2 )
      result = (*(int (**)(void))v2)();
  }
  return result;
}
	//----- (00005540) --------------------------------------------------------
unsigned int __fastcall sub_5540(int a1, int a2, int a3, unsigned int a4)
{
  unsigned int result; // eax@1
  unsigned int v5; // edx@1
	  result = *(_DWORD *)(a3 + 8);
  v5 = *(_DWORD *)(a3 + 4);
  if ( result <= v5 && v5 - result >= a4 )
  {
    result += a4;
    *(_DWORD *)(a3 + 8) = result;
  }
  else
  {
    *(_DWORD *)(a3 + 8) = v5 + 1;
  }
  return result;
}
	//----- (00005580) --------------------------------------------------------
int __usercall sub_5580<eax>(int a1<eax>, int a2<edx>, int a3<ecx>, int a4<ebx>, int a5<edi>, int a6<esi>, char a7)
{
  if ( a3 == v3EDA03C )
    __asm { rep retn }
  return sub_5270(
           (unsigned int)a3 < v3EDA03C,
           a3 == v3EDA03C,
           a3 - v3EDA03C < 0,
           __OFSUB__(a3, v3EDA03C),
           a1,
           a2,
           a3,
           a4,
           a5,
           a6,
           a7);
}
	//----- (00005704) --------------------------------------------------------
void *__cdecl sub_5704(void *a1, unsigned __int8 a2, unsigned int a3)
{
  int v3; // edi@1
  unsigned int v4; // eax@1
  int v5; // eax@1
  unsigned int v6; // ecx@1
  int v7; // ecx@3
	  v3 = (int)a1;
  v4 = a2;
  BYTE1(v4) = a2;
  v5 = v4 | _byteswap_ulong(v4);
  v6 = a3 >> 2;
  if ( a3 >> 2 )
  {
    memset32(a1, v5, v6);
    v3 = (int)((char *)a1 + 4 * v6);
    v6 = 0;
  }
  LOBYTE(v6) = 3;
  v7 = a3 & v6;
  if ( v7 )
  {
    while ( v7 )
    {
      *MK_FP(__ES__, v3++) = v5;
      --v7;
    }
  }
  return a1;
}
	//----- (00005730) --------------------------------------------------------
int __fastcall sub_5730(int a1, int a2, int a3, int a4)
{
  unsigned int v4; // edx@1
  unsigned int v5; // esi@1
  int result; // eax@2
	  v4 = *(_DWORD *)(a3 + 8);
  v5 = *(_DWORD *)(a3 + 4);
  if ( v4 <= v5 && (result = v5 - v4, v5 - v4 >= 1) )
  {
    result = *(_DWORD *)a3;
    *(_BYTE *)(v4 + *(_DWORD *)a3) = *(_BYTE *)a4;
    ++*(_DWORD *)(a3 + 8);
  }
  else
  {
    *(_DWORD *)(a3 + 8) = v5 + 1;
  }
  return result;
}
	//----- (000057D0) --------------------------------------------------------
int __fastcall sub_57D0(int a1, int a2, int a3, int a4, unsigned int a5)
{
  unsigned int v5; // esi@1
  int v6; // eax@2
  char v7; // dl@2
  int v8; // edi@2
  int v9; // eax@2
  int result; // eax@2
	  v5 = 0;
  if ( a5 )
  {
    do
    {
      ++*(_BYTE *)(a3 + 256);
      v6 = *(_BYTE *)(a3 + 256);
      *(_BYTE *)(a3 + 257) += *(_BYTE *)(v6 + a3);
      v7 = *(_BYTE *)(v6 + a3);
      v8 = v6 + a3;
      v9 = *(_BYTE *)(a3 + 257);
      *(_BYTE *)v8 = *(_BYTE *)(v9 + a3);
      *(_BYTE *)(a3 + v9) = v7;
      ++v5;
      result = a4;
      *(_BYTE *)(v5 + result - 1) ^= *(_BYTE *)((unsigned __int8)(*(_BYTE *)(*(_BYTE *)(a3 + 256) + a3)
                                                                + *(_BYTE *)(*(_BYTE *)(a3 + 257) + a3))
                                              + a3);
    }
    while ( v5 < a5 );
  }
  return result;
}
	//----- (0000583F) --------------------------------------------------------
char __fastcall sub_583F(int a1, int a2, int a3, int a4, unsigned int a5)
{
  int v5; // esi@1
  unsigned int v6; // eax@1
	  v5 = a3;
  LOBYTE(v6) = sub_6F20(a1, a2, a3, a5);
  if ( (_BYTE)v6 )
  {
    v6 = 0;
    if ( a5 )
    {
      do
        *(_BYTE *)(v6++ + a4) = *(_BYTE *)((*(_DWORD *)(v5 + 8))++ + *(_DWORD *)v5);
      while ( v6 < a5 );
    }
  }
  return v6;
}
	//----- (000058A1) --------------------------------------------------------
unsigned int __fastcall sub_58A1(int a1, int a2, int a3, unsigned int a4, unsigned int a5)
{
  unsigned int result; // eax@1
  signed int v6; // edx@1
	  result = a4;
  v6 = 7;
  do
  {
    *(_BYTE *)(v6 + a3) = result;
    result = __PAIR__(a5, result) >> 8;
    --v6;
    a5 >>= 8;
  }
  while ( v6 >= 0 );
  return result;
}
	//----- (000058E8) --------------------------------------------------------
char __fastcall sub_58E8(int a1, int a2, int a3)
{
  return sub_583F(a1, a2, a3, a2, 0x20u);
}
	//----- (0000595D) --------------------------------------------------------
void __cdecl sub_595D(int a1, int a2, int a3)
{
  JUMPOUT(0xA290000u);
}
	//----- (00005990) --------------------------------------------------------
int __fastcall sub_5990(int a1, int a2, int a3)
{
  int v3; // esi@1
  int result; // eax@1
  int v5; // eax@2
  int v6; // [sp+4h] [bp-4h]@1
	  v3 = a3;
  result = (**(int (__stdcall ***)(_DWORD))a3)(24);
  v6 = result;
  if ( result )
  {
    v5 = sub_5F90(24, result);
    if ( v5 )
    {
      *(_DWORD *)(v5 + 8) = 65871842;
      *(_DWORD *)(v5 + 12) = 65887278;
      *(_DWORD *)v5 = 65901572;
      *(_DWORD *)(v5 + 4) = v3;
      *(_DWORD *)(v5 + 16) = 65884740;
      *(_DWORD *)(v5 + 20) = 0;
    }
    result = v6;
  }
  return result;
}
	//----- (000059F0) --------------------------------------------------------
signed int __cdecl sub_59F0(int a1)
{
  int v1; // esi@1
  unsigned int v2; // edx@3
  signed int v3; // eax@3
  signed int result; // eax@7
  int v5; // eax@8
  int v6; // eax@9
	  v1 = a1 - 65863680;
  if ( a1 - 65863680 < 0 || (unsigned int)v1 > v3ED000C )
  {
    result = 0;
  }
  else
  {
    v2 = 0;
    v3 = 65863748;
    if ( !v3ED0040 )
      goto LABEL_7;
    while ( (unsigned int)v1 < *(_DWORD *)v3 || v1 >= (unsigned int)(*(_DWORD *)v3 + *(_DWORD *)(v3 + 4)) )
    {
      ++v2;
      v3 += 12;
      if ( v2 >= v3ED0040 )
        goto LABEL_7;
    }
    v5 = *(_DWORD *)(v3 + 8) - 2;
    if ( v5 && (v6 = v5 - 14) != 0 && v6 != 16 )
LABEL_7:
      result = 0;
    else
      result = 1;
  }
  return result;
}
	//----- (00005A70) --------------------------------------------------------
int __fastcall sub_5A70(int a1, int a2, int a3)
{
  int v3; // esi@1
  int v4; // eax@1
  int v5; // eax@2
  int v6; // edx@2
  int result; // eax@3
	  v3 = a3;
  v4 = (**(int (__stdcall ***)(_DWORD))a3)(60);
  if ( v4 && (v5 = sub_5F90(60, v4)) != 0 )
    result = sub_3A00(v5, v6, v5, v3);
  else
    result = 0;
  return result;
}
	//----- (00005A9C) --------------------------------------------------------
int __fastcall sub_5A9C(int a1, int a2, int a3)
{
  int result; // eax@1
	  result = a3;
  *(_DWORD *)(a3 + 32) = 0;
  *(_BYTE *)(a3 + 36) = 0;
  return result;
}
	//----- (00005F00) --------------------------------------------------------
unsigned int __fastcall sub_5F00(int a1, int a2, int a3, int a4)
{
  int v4; // esi@1
  int v5; // ST04_4@1
  int v6; // edx@1
  int v7; // eax@1
  int v8; // edx@1
  unsigned int result; // eax@1
  unsigned int *v10; // ecx@1
  unsigned __int32 v11; // [sp+Ch] [bp-Ch]@1
  int v12; // [sp+10h] [bp-8h]@1
  unsigned int v13; // [sp+14h] [bp-4h]@1
  int v14; // [sp+18h] [bp+0h]@1
	  v13 = (unsigned int)&v14 ^ v3EDA03C;
  v4 = a3;
  v5 = ((-9 - (unsigned __int8)(*(_QWORD *)a3 >> 3)) & 0x3F) + 1;
  v6 = _byteswap_ulong(*(_QWORD *)a3);
  v11 = _byteswap_ulong(*(_DWORD *)(a3 + 4));
  v12 = v6;
  v7 = sub_3D00(v5, v6, a3, (unsigned int *)0x3ED90D0, v5);
  sub_3D00(v7, v8, v4, (unsigned int *)&v11, 8);
  result = 0;
  v10 = (unsigned int *)(v4 + 8);
  do
  {
    *(_DWORD *)(a4 + 4 * result++) = _byteswap_ulong(*v10);
    ++v10;
  }
  while ( result < 8 );
  return result;
}
	//----- (00005F90) --------------------------------------------------------
int __cdecl sub_5F90(int a1, int a2)
{
  return a2;
}
	//----- (00005FA0) --------------------------------------------------------
char __fastcall sub_5FA0(int a1, int a2, int a3, int a4)
{
  int v4; // ebx@1
  int v5; // esi@1
  int v6; // ecx@1
  int v7; // eax@1
  int v8; // edx@1
  int v9; // ecx@2
  int v10; // ecx@6
  char result; // al@9
  int v12; // edi@10
  int v13; // eax@10
  int v14; // ecx@12
  int v15; // eax@12
  int v16; // edx@12
  int v17; // [sp+Ch] [bp-4h]@4
  int v18; // [sp+18h] [bp+8h]@1
  int v19; // [sp+18h] [bp+8h]@12
	  v4 = a4;
  v5 = a3;
  *(_BYTE *)(a3 + 12) = 0;
  *(_DWORD *)(a3 + 16) = 5;
  v6 = *(_DWORD *)(a4 + 8);
  v7 = *(_DWORD *)(a4 + 4) - v6;
  v8 = v6 + *(_DWORD *)a4;
  v18 = 0;
  if ( (unsigned int)v7 >= 2 )
  {
    v18 = *(_WORD *)v8;
    v9 = 2;
  }
  else
  {
    v9 = v7 + 1;
  }
  v17 = 0;
  if ( v9 <= (unsigned int)v7 && (unsigned int)(v7 - v9) >= 4 )
  {
    v17 = *(_DWORD *)(v9 + v8);
    v10 = v9 + 4;
  }
  else
  {
    v10 = v7 + 1;
  }
  if ( v10 <= (unsigned int)v7 )
  {
    v12 = (unsigned __int16)v18;
    v13 = v7 - v10;
    if ( v13 >= (unsigned int)(unsigned __int16)v18 )
    {
      v14 = v8 + v10;
      v16 = (unsigned __int16)v18;
      v19 = v14;
      v15 = sub_3CA0(v13, v16, v14);
      if ( v17 == v15 )
      {
        *(_DWORD *)(v5 + 4) = v12;
        *(_DWORD *)v5 = v19;
        *(_DWORD *)(v5 + 8) = 0;
        sub_5540(v15, v19, v4, v12 + 6);
        result = 1;
        *(_DWORD *)(v5 + 16) = 0;
        *(_BYTE *)(v5 + 12) = 1;
      }
      else
      {
        sub_5540(v15, v16, v4, v12 + 6);
        *(_DWORD *)(v5 + 16) = 3;
        result = 0;
      }
    }
    else
    {
      *(_DWORD *)(v5 + 16) = 2;
      result = 0;
    }
  }
  else
  {
    *(_DWORD *)(v5 + 16) = 1;
    result = 0;
  }
  return result;
}
	//----- (000060F0) --------------------------------------------------------
int __fastcall sub_60F0(int a1, int a2, int a3, char a4)
{
  int result; // eax@1
  unsigned int v5; // edx@1
  unsigned int v6; // esi@1
	  result = *(_DWORD *)(a3 + 12);
  v5 = *(_DWORD *)(result + 8);
  v6 = *(_DWORD *)(result + 4);
  if ( v5 <= v6 && v6 - v5 >= 1 )
  {
    *(_BYTE *)(v5 + *(_DWORD *)result) = a4;
    ++*(_DWORD *)(result + 8);
  }
  else
  {
    *(_DWORD *)(result + 8) = v6 + 1;
  }
  return result;
}
	//----- (00006D70) --------------------------------------------------------
int __fastcall sub_6D70(int a1, int a2, int a3, int a4)
{
  int v4; // eax@1
  unsigned int v5; // edx@1
  unsigned int v6; // esi@1
  int v7; // eax@5
  unsigned int v8; // esi@5
  unsigned int v9; // edi@5
  int v10; // eax@7
  int result; // eax@7
  int v12; // eax@8
	  *(_DWORD *)(a3 + 12) = a4;
  *(_DWORD *)(a3 + 16) = a4;
  *(_DWORD *)(a3 + 20) = *(_DWORD *)(a4 + 8);
  v4 = *(_DWORD *)(a3 + 12);
  v5 = *(_DWORD *)(v4 + 8);
  v6 = *(_DWORD *)(v4 + 4);
  if ( v5 <= v6 && v6 - v5 >= 2 )
  {
    *(_WORD *)(v5 + *(_DWORD *)v4) = 0;
    *(_DWORD *)(v4 + 8) += 2;
  }
  else
  {
    *(_DWORD *)(v4 + 8) = v6 + 1;
  }
  v7 = *(_DWORD *)(a3 + 12);
  v8 = *(_DWORD *)(v7 + 8);
  v9 = *(_DWORD *)(v7 + 4);
  if ( v8 <= v9 && v9 - v8 >= 4 )
  {
    *(_DWORD *)(v8 + *(_DWORD *)v7) = 0;
    *(_DWORD *)(v7 + 8) += 4;
    v12 = *(_DWORD *)(a3 + 12);
    *(_DWORD *)(a3 + 24) = v12;
    result = *(_DWORD *)(v12 + 8);
    *(_DWORD *)(a3 + 28) = result;
  }
  else
  {
    *(_DWORD *)(v7 + 8) = v9 + 1;
    v10 = *(_DWORD *)(a3 + 12);
    *(_DWORD *)(a3 + 24) = v10;
    result = *(_DWORD *)(v10 + 8);
    *(_DWORD *)(a3 + 28) = result;
  }
  return result;
}
	//----- (00006E00) --------------------------------------------------------
int __usercall sub_6E00<eax>(int a1<esi>)
{
  int result; // eax@3
  int v2; // eax@4
  int v3; // esi@4
  int v4; // esi@4
  int v5; // esi@4
  int v6; // esi@4
  int v7; // [sp+0h] [bp-10h]@4
  int v8; // [sp+4h] [bp-Ch]@4
  int v9; // [sp+8h] [bp-8h]@1
  int v10; // [sp+Ch] [bp-4h]@1
	  v9 = 0;
  v10 = 0;
  if ( v3EDA03C != -1153374642 && v3EDA03C & 0xFFFF0000 )
  {
    result = ~v3EDA03C;
    v3EDA040 = ~v3EDA03C;
  }
  else
  {
    v2 = v3ED906C(&v9, a1);
    v3 = v3ED9068(v2) ^ v9 ^ v10;
    v4 = v3ED9064() ^ v3;
    v5 = v3ED9024() ^ v4;
    result = v3ED9060(&v7);
    v6 = v7 ^ v8 ^ v5;
    if ( v6 == -1153374642 )
    {
      v3EDA03C = -1153374641;
      v3EDA040 = 1153374640;
    }
    else
    {
      if ( !(v6 & 0xFFFF0000) )
      {
        result = v6 << 16;
        v6 |= v6 << 16;
      }
      v3EDA03C = v6;
      v3EDA040 = ~v6;
    }
  }
  return result;
}
// 3ED9024: using guessed type int (*)(void);
// 3ED9060: using guessed type int (__stdcall *)(_DWORD);
// 3ED9064: using guessed type int (*)(void);
// 3ED9068: using guessed type int (__fastcall *)(_DWORD);
// 3ED906C: using guessed type int (__stdcall *)(_DWORD, _DWORD);
	//----- (00006EA9) --------------------------------------------------------
char __fastcall sub_6EA9(int a1, int a2, int a3, int a4)
{
  unsigned int v4; // kr00_4@1
	  v4 = strlen((const char *)a4);
  return sub_1346(v4, a4 + 1, a3, a4, v4);
}
	//----- (00006ECA) --------------------------------------------------------
char __fastcall sub_6ECA(int a1, int a2, int a3, int a4, int a5)
{
  int v5; // eax@1
  int v6; // eax@1
  int v8; // eax@4
  int v9; // esi@6
  __int64 v10; // qax@6
  int v11; // [sp+4h] [bp-4h]@1
	  v5 = *(_DWORD *)(a3 + 32);
  v11 = 0;
  v6 = v5 - 1;
  if ( v6 )
  {
    if ( v6 != 1 )
      return 0;
    v8 = (*(int (__stdcall **)(int, int *))(a3 + 20))(a4, &v11);
  }
  else
  {
    v8 = (*(int (__stdcall **)(int, int *))(a3 + 4))(a4, &v11);
  }
  v9 = v8;
  LODWORD(v10) = v8430(v11, 0, 0, 1);
  *(_QWORD *)a5 = (unsigned int)v9 + v10;
  return 1;
}
	//----- (00006F20) --------------------------------------------------------
char __fastcall sub_6F20(int a1, int a2, int a3, unsigned int a4)
{
  unsigned int v4; // edx@1
  unsigned int v5; // eax@1
  char result; // al@3
	  v4 = *(_DWORD *)(a3 + 8);
  v5 = *(_DWORD *)(a3 + 4);
  if ( v4 > v5 || v5 - v4 < a4 )
  {
    *(_DWORD *)(a3 + 8) = v5 + 1;
    result = 0;
  }
  else
  {
    result = 1;
  }
  return result;
}
	//----- (00006F50) --------------------------------------------------------
char __fastcall sub_6F50(int a1, int (__cdecl *a2)(_DWORD), int a3, int a4, int a5)
{
  int v6; // [sp-10h] [bp-28h]@1
  int *v7; // [sp+0h] [bp-18h]@1
  int v8; // [sp+8h] [bp-10h]@1
  signed int v9; // [sp+Ch] [bp-Ch]@1
  int v10; // [sp+10h] [bp-8h]@1
  int v11; // [sp+14h] [bp-4h]@1
  int v12; // [sp+18h] [bp+0h]@1
	  v9 = 65886887;
  v8 = a1;
  v10 = v3EDA03C ^ 0x3ED9510;
  v7 = &v6;
  v11 = 0;
  *(_DWORD *)a3 = a2((unsigned int)&v12 ^ v3EDA03C);
  return 1;
}
	//----- (00006FE0) --------------------------------------------------------
char __fastcall sub_6FE0(int a1, int a2, int a3, int a4)
{
  unsigned int v4; // eax@1
  unsigned int v5; // edx@1
	  *(_BYTE *)a4 = 0;
  v4 = *(_DWORD *)(a3 + 8);
  v5 = *(_DWORD *)(a3 + 4);
  if ( v4 <= v5 && v5 - v4 >= 1 )
  {
    LOBYTE(v4) = *(_BYTE *)(v4 + *(_DWORD *)a3);
    *(_BYTE *)a4 = v4;
    ++*(_DWORD *)(a3 + 8);
  }
  else
  {
    *(_DWORD *)(a3 + 8) = v5 + 1;
  }
  return v4;
}
	//----- (000070C0) --------------------------------------------------------
signed int __fastcall sub_70C0(int a1, int a2, int a3, int a4, int a5)
{
  char v5; // dl@3
  unsigned int v6; // eax@4
  unsigned int v7; // ecx@4
  unsigned int v8; // eax@9
  unsigned int v9; // ecx@9
  int v10; // ebx@9
  unsigned int v11; // eax@15
  unsigned int v12; // ecx@15
  signed int result; // eax@21
  int v14; // esi@22
  int v15; // [sp+Ch] [bp-10Ch]@1
  int v16; // [sp+10h] [bp-108h]@0
  char v17; // [sp+14h] [bp-104h]@2
  unsigned int v18; // [sp+114h] [bp-4h]@1
  int v19; // [sp+118h] [bp+0h]@1
	  v18 = (unsigned int)&v19 ^ v3EDA03C;
  v15 = a3;
  if ( *(_BYTE *)(a4 + 12) )
    sub_2E90((int)&v17, a2, a4, (int)&v17, 0x100u);
  v5 = *(_BYTE *)(a4 + 12);
  if ( v5
    && ((v6 = *(_DWORD *)(a4 + 8), v7 = *(_DWORD *)(a4 + 4), v16 = 0, v6 <= v7) && v7 - v6 >= 4 ? (v16 = *(_DWORD *)(v6 + *(_DWORD *)a4),
                                                                                                   *(_DWORD *)(a4 + 8) = v6 + 4) : (*(_DWORD *)(a4 + 8) = v7 + 1),
        v5) )
  {
    v8 = *(_DWORD *)(a4 + 8);
    v9 = *(_DWORD *)(a4 + 4);
    v10 = 0;
    if ( v8 <= v9 && v9 - v8 >= 4 )
    {
      v10 = *(_DWORD *)(v8 + *(_DWORD *)a4);
      *(_DWORD *)(a4 + 8) = v8 + 4;
    }
    else
    {
      *(_DWORD *)(a4 + 8) = v9 + 1;
    }
  }
  else
  {
    v10 = v16;
  }
  if ( *(_BYTE *)(a4 + 12)
    && ((v11 = *(_DWORD *)(a4 + 8), v12 = *(_DWORD *)(a4 + 4), v11 <= v12) && v12 - v11 >= 1 ? (*(_DWORD *)(a4 + 8) = v11 + 1) : (*(_DWORD *)(a4 + 8) = v12 + 1),
        *(_BYTE *)(a4 + 12) && *(_DWORD *)(a4 + 8) <= *(_DWORD *)(a4 + 4)) )
  {
    *(_DWORD *)v15 = 0;
    *(_DWORD *)(v15 + 4) = 0;
    v14 = (*(int (__fastcall **)(int, _DWORD, int, int))(*(_DWORD *)a5 + 4))(
            v17 != 0 ? (int)&v17 : 0,
            *(_DWORD *)(*(_DWORD *)a5 + 4),
            a5,
            v17 != 0 ? (int)&v17 : 0);
    if ( v14 )
    {
      if ( v16 )
      {
        *(_DWORD *)v15 = (*(int (__fastcall **)(_DWORD, _DWORD, int, int, int))(*(_DWORD *)a5 + 8))(
                           *(_DWORD *)(*(_DWORD *)a5 + 8),
                           *(_DWORD *)a5,
                           a5,
                           v14,
                           v16);
        *(_DWORD *)(v15 + 4) = (*(int (__fastcall **)(_DWORD, _DWORD, int, int, int))(*(_DWORD *)a5 + 8))(
                                 *(_DWORD *)(*(_DWORD *)a5 + 8),
                                 *(_DWORD *)a5,
                                 a5,
                                 v14,
                                 v10);
      }
    }
    result = 0;
  }
  else
  {
    result = 3;
  }
  return result;
}
	//----- (00007340) --------------------------------------------------------
void __cdecl sub_7340(unsigned int a1, unsigned int a2)
{
  unsigned int i; // esi@1
	  for ( i = a1; i < a2; i += 4 )
  {
    if ( *(_DWORD *)i )
      (*(void (**)(void))i)();
  }
}
	//----- (00007363) --------------------------------------------------------
char __fastcall sub_7363(int a1, int a2, int a3)
{
  return sub_1444(a1, a2, a3, a2, 0x14u);
}
	//----- (000074A0) --------------------------------------------------------
int __fastcall sub_74A0(int a1, unsigned int *a2, int a3)
{
  signed int v3; // eax@1
  char *v4; // eax@3
  unsigned int v5; // edx@4
  int v6; // edi@4
  int v7; // ebx@4
  int v8; // edi@4
  int v9; // esi@4
  int v10; // ebx@4
  int v11; // esi@4
  int v12; // edx@4
  int v13; // edi@4
  unsigned __int8 v14; // sf@4
  unsigned __int8 v15; // of@4
  int v16; // ebx@5
  int v17; // esi@5
  int v18; // edi@5
  int v19; // edx@5
  int v20; // eax@5
  int v21; // ebx@5
  int v22; // ecx@5
  int v23; // ecx@7
  int v24; // ebx@7
  int v25; // ecx@7
  int v26; // ebx@7
  int v27; // ecx@7
  int v28; // eax@7
  int v29; // edi@7
  int v30; // ebx@7
  int v31; // edi@7
  int v32; // ebx@7
  int v33; // ecx@7
  int v34; // edi@7
  int v35; // ecx@7
  int v36; // edi@7
  int v37; // ecx@7
  int v38; // edx@7
  int v39; // ebx@7
  int v40; // ecx@7
  int v41; // ebx@7
  int v42; // ecx@7
  int v43; // ecx@7
  int v44; // edi@7
  int v45; // ecx@7
  int v46; // edi@7
  int v47; // ecx@7
  int v48; // edi@7
  int v49; // ebx@7
  int v50; // edi@7
  int v51; // ebx@7
  int v52; // ecx@7
  int v53; // esi@7
  int v54; // ebx@7
  int v55; // esi@7
  int v56; // ebx@7
  int v57; // esi@7
  int v58; // edi@7
  int v59; // esi@7
  int v60; // edi@7
  int v61; // esi@7
  int v62; // edi@7
  int v63; // ebx@7
  int v64; // edi@7
  int v65; // ebx@7
  int v66; // esi@7
  int v67; // esi@7
  int v68; // edi@7
  int v69; // esi@7
  int v70; // edi@7
  int v71; // edi@7
  int v72; // ebx@7
  int v73; // edi@7
  int v74; // ebx@7
  int v75; // esi@7
  int v76; // edi@7
  int v77; // edx@7
  int v78; // edi@7
  int v79; // edx@7
  int v80; // edi@7
  int v81; // ebx@7
  int v82; // edi@7
  int v83; // ebx@7
  int v84; // ecx@7
  int v85; // esi@7
  int v86; // edi@7
  int v87; // esi@7
  int v88; // edi@7
  int v89; // esi@7
  int v90; // edi@7
  int v91; // esi@7
  int v92; // edi@7
  int v93; // esi@7
  int v94; // esi@7
  int v95; // edi@7
  int v96; // esi@7
  int v97; // edi@7
  char v98; // cf@7
  int v99; // edi@8
  int v100; // ebx@8
  int v101; // esi@8
  int v102; // ecx@8
  int v103; // edx@8
  int v104; // ecx@8
  int v105; // eax@8
  int v106; // ecx@8
  int v107; // eax@8
  int v108; // edx@8
  int result; // eax@8
  char v110[8]; // [sp+4h] [bp-134h]@3
  int v111; // [sp+Ch] [bp-12Ch]@2
  int v112; // [sp+10h] [bp-128h]@7
  int v113; // [sp+14h] [bp-124h]@7
  int v114; // [sp+18h] [bp-120h]@7
  int v115; // [sp+1Ch] [bp-11Ch]@7
  int v116; // [sp+20h] [bp-118h]@7
  int v117; // [sp+24h] [bp-114h]@7
  int v118[57]; // [sp+28h] [bp-110h]@7
  int v119; // [sp+10Ch] [bp-2Ch]@1
  int v120; // [sp+110h] [bp-28h]@7
  int v121; // [sp+114h] [bp-24h]@5
  int v122; // [sp+118h] [bp-20h]@3
  int v123; // [sp+11Ch] [bp-1Ch]@7
  int v124; // [sp+120h] [bp-18h]@5
  unsigned int v125; // [sp+124h] [bp-14h]@5
  int v126; // [sp+128h] [bp-10h]@5
  int v127; // [sp+12Ch] [bp-Ch]@5
  int v128; // [sp+130h] [bp-8h]@5
  int v129; // [sp+134h] [bp-4h]@7
	  v119 = a3;
  v3 = 0;
  do
  {
    *(&v111 + v3++) = _byteswap_ulong(*a2);
    ++a2;
  }
  while ( v3 < 16 );
  v122 = v3;
  v4 = &v110[4 * v3];
  do
  {
    v5 = *((_DWORD *)v4 - 13);
    v6 = __ROR__(*(_DWORD *)v4, 19);
    v7 = __ROR__(*(_DWORD *)v4, 17);
    v8 = (*(_DWORD *)v4 >> 10) ^ v7 ^ v6;
    v9 = __ROR__(v5, 18);
    v10 = __ROR__(*((_DWORD *)v4 - 13), 7);
    v11 = (v5 >> 3) ^ v10 ^ v9;
    v12 = v122 + 1;
    v13 = *((_DWORD *)v4 - 5) + *((_DWORD *)v4 - 14) + v11 + v8;
    v4 += 4;
    v15 = __OFSUB__(v122 + 1, 64);
    v14 = v122 - 63 < 0;
    *((_DWORD *)v4 + 1) = v13;
    v122 = v12;
  }
  while ( v14 ^ v15 );
  v16 = *(_DWORD *)(a3 + 20);
  v17 = *(_DWORD *)a3;
  v18 = *(_DWORD *)(a3 + 16);
  v19 = *(_DWORD *)(a3 + 8);
  v124 = *(_DWORD *)(a3 + 4);
  v20 = *(_DWORD *)(a3 + 12);
  v122 = v16;
  v21 = *(_DWORD *)(a3 + 24);
  v22 = *(_DWORD *)(a3 + 28);
  v121 = v17;
  v127 = v18;
  v128 = v21;
  v126 = v22;
  v125 = 0;
  while ( 1 )
  {
    v23 = __ROR__(v18, 25);
    v24 = __ROR__(v18, 11);
    v25 = v24 ^ v23;
    v26 = __ROR__(v18, 6);
    v120 = v26 ^ v25;
    v27 = v126
        + *(int *)((char *)&v111 + v125)
        + *(_DWORD *)(v125 + 65900816)
        + (v18 & v122 ^ v128 & ~v18)
        + (v26 ^ v25);
    v28 = v27 + v20;
    v129 = v27;
    v120 = v17 & v124;
    v123 = v17 ^ v124;
    v29 = __ROR__(v17, 22);
    v30 = __ROR__(v17, 13);
    v31 = v30 ^ v29;
    v32 = __ROR__(v17, 2);
    v126 = v27 + (v32 ^ v31) + (v17 & v124 ^ v19 & (v17 ^ v124));
    v33 = __ROR__(v28, 25);
    v34 = __ROR__(v28, 11);
    v35 = v34 ^ v33;
    v36 = __ROR__(v28, 6);
    v37 = v128
        + *(_DWORD *)(v125 + 65900820)
        + *(int *)((char *)&v112 + v125)
        + (v28 & v127 ^ v122 & ~v28)
        + (v36 ^ v35);
    v38 = v37 + v19;
    v129 = v37;
    v39 = __ROR__(v126, 22);
    v40 = __ROR__(v126, 13);
    v41 = v40 ^ v39;
    v42 = __ROR__(v126, 2);
    v128 = v129 + (v42 ^ v41) + (v17 & v124 ^ v126 & (v17 ^ v124));
    v43 = __ROR__(v38, 25);
    v44 = __ROR__(v38, 11);
    v45 = v44 ^ v43;
    v46 = __ROR__(v38, 6);
    v47 = v122 + *(_DWORD *)(v125 + 65900824) + *(int *)((char *)&v113 + v125) + (v38 & v28 ^ v127 & ~v38) + (v46 ^ v45);
    v124 += v47;
    v129 = v47;
    v48 = __ROR__(v128, 22);
    v49 = __ROR__(v128, 13);
    v50 = v49 ^ v48;
    v51 = __ROR__(v128, 2);
    v52 = v47 + (v51 ^ v50) + (v17 & v128 ^ v126 & (v17 ^ v128));
    v53 = __ROR__(v124, 25);
    v54 = __ROR__(v124, 11);
    v55 = v54 ^ v53;
    v56 = __ROR__(v124, 6);
    v123 = v56 ^ v55;
    v57 = v127
        + *(_DWORD *)(v125 + 65900828)
        + *(int *)((char *)&v114 + v125)
        + (v124 & v38 ^ v28 & ~v124)
        + (v56 ^ v55);
    v121 += v57;
    v129 = v57;
    v58 = __ROR__(v52, 22);
    v59 = __ROR__(v52, 13);
    v60 = v59 ^ v58;
    v61 = __ROR__(v52, 2);
    v127 = v129 + (v61 ^ v60) + (v52 & v128 ^ v126 & (v52 ^ v128));
    v62 = __ROR__(v121, 25);
    v63 = __ROR__(v121, 11);
    v64 = v63 ^ v62;
    v65 = __ROR__(v121, 6);
    v123 = v65 ^ v64;
    v66 = v28
        + *(_DWORD *)(v125 + 65900832)
        + *(int *)((char *)&v115 + v125)
        + (v121 & v124 ^ v38 & ~v121)
        + (v65 ^ v64);
    v126 += v66;
    v129 = v66;
    v67 = __ROR__(v127, 22);
    v68 = __ROR__(v127, 13);
    v69 = v68 ^ v67;
    v70 = __ROR__(v127, 2);
    v20 = v129 + (v70 ^ v69) + (v127 & v52 ^ v128 & (v127 ^ v52));
    v71 = __ROR__(v126, 25);
    v72 = __ROR__(v126, 11);
    v73 = v72 ^ v71;
    v74 = __ROR__(v126, 6);
    v123 = v74 ^ v73;
    v75 = v38
        + *(_DWORD *)(v125 + 65900836)
        + *(int *)((char *)&v116 + v125)
        + (v121 & v126 ^ v124 & ~v126)
        + (v74 ^ v73);
    v128 += v75;
    v76 = __ROR__(v20, 22);
    v77 = __ROR__(v20, 13);
    v78 = v77 ^ v76;
    v79 = __ROR__(v20, 2);
    v19 = v75 + (v79 ^ v78) + (v20 & v127 ^ v52 & (v20 ^ v127));
    v80 = __ROR__(v128, 25);
    v81 = __ROR__(v128, 11);
    v82 = v81 ^ v80;
    v83 = __ROR__(v128, 6);
    v123 = v83 ^ v82;
    v84 = v124
        + *(_DWORD *)(v125 + 65900840)
        + *(int *)((char *)&v117 + v125)
        + (v128 & v126 ^ v121 & ~v128)
        + (v83 ^ v82)
        + v52;
    v129 = v124
         + *(_DWORD *)(v125 + 65900840)
         + *(int *)((char *)&v117 + v125)
         + (v128 & v126 ^ v121 & ~v128)
         + (v83 ^ v82);
    v85 = __ROR__(v19, 22);
    v86 = __ROR__(v19, 13);
    v87 = v86 ^ v85;
    v88 = __ROR__(v19, 2);
    v122 = v84;
    v124 = v129 + (v88 ^ v87) + (v19 & v20 ^ v127 & (v19 ^ v20));
    v89 = __ROR__(v84, 25);
    v90 = __ROR__(v84, 11);
    v91 = v90 ^ v89;
    v92 = __ROR__(v84, 6);
    v93 = v121 + *(_DWORD *)(v125 + 65900844) + v118[v125 / 4] + (v84 & v128 ^ v126 & ~v84) + (v92 ^ v91);
    v127 += v93;
    v129 = v93;
    v94 = __ROR__(v124, 22);
    v95 = __ROR__(v124, 13);
    v96 = v95 ^ v94;
    v97 = __ROR__(v124, 2);
    v17 = (v124 & v19 ^ v20 & (v124 ^ v19)) + v129 + (v97 ^ v96);
    v98 = v125 + 32 < 0x100;
    v121 = v17;
    v125 += 32;
    if ( !v98 )
      break;
    v18 = v127;
  }
  v99 = v119;
  v100 = v17 + *(_DWORD *)v119;
  v101 = v124 + *(_DWORD *)(v119 + 4);
  v102 = v19 + *(_DWORD *)(v119 + 8);
  v103 = v122;
  *(_DWORD *)(v119 + 8) = v102;
  v104 = v20 + *(_DWORD *)(v99 + 12);
  v105 = *(_DWORD *)(v99 + 16);
  *(_DWORD *)(v99 + 12) = v104;
  v106 = v128;
  *(_DWORD *)(v99 + 16) = v127 + v105;
  v107 = v103 + *(_DWORD *)(v99 + 20);
  v108 = v126;
  *(_DWORD *)(v99 + 20) = v107;
  *(_DWORD *)(v99 + 24) += v106;
  result = v108 + *(_DWORD *)(v99 + 28);
  *(_DWORD *)v99 = v100;
  *(_DWORD *)(v99 + 4) = v101;
  *(_DWORD *)(v99 + 28) = result;
  return result;
}
// 74A0: using guessed type char var_134[8];
// 74A0: using guessed type int var_110[57];
	//----- (00007AA0) --------------------------------------------------------
unsigned int __fastcall sub_7AA0(int a1, int a2, int a3)
{
  int v3; // esi@1
  int v4; // eax@1
  int v5; // ecx@1
  unsigned __int16 v6; // dx@1
  unsigned __int16 v7; // bx@1
  int v8; // ecx@1
  unsigned int v9; // edx@1
  unsigned int v10; // edi@1
  int v11; // esi@5
  unsigned int result; // eax@5
  unsigned int v13; // edx@5
  int v14; // [sp+Ch] [bp-Ch]@1
  unsigned int v15; // [sp+10h] [bp-8h]@1
  int v16; // [sp+14h] [bp-4h]@1
	  v3 = a3;
  v4 = *(_DWORD *)(a3 + 12);
  v5 = *(_DWORD *)(a3 + 24);
  v6 = *(_WORD *)(v5 + 8) - *(_WORD *)(v3 + 28);
  v14 = v4;
  v15 = *(_DWORD *)(v4 + 8);
  *(_DWORD *)(v5 + 8) = *(_DWORD *)(v3 + 28);
  v7 = v6;
  v16 = sub_3CA0(*(_DWORD *)(v3 + 12), v6, **(_DWORD **)(v3 + 12) + *(_DWORD *)(*(_DWORD *)(v3 + 12) + 8));
  *(_DWORD *)(*(_DWORD *)(v3 + 16) + 8) = *(_DWORD *)(v3 + 20);
  v8 = *(_DWORD *)(v3 + 12);
  v9 = *(_DWORD *)(v8 + 8);
  v10 = *(_DWORD *)(v8 + 4);
  if ( v9 <= v10 && v10 - v9 >= 2 )
  {
    *(_WORD *)(v9 + *(_DWORD *)v8) = v7;
    *(_DWORD *)(v8 + 8) += 2;
  }
  else
  {
    *(_DWORD *)(v8 + 8) = v10 + 1;
  }
  v11 = *(_DWORD *)(v3 + 12);
  result = *(_DWORD *)(v11 + 8);
  v13 = *(_DWORD *)(v11 + 4);
  if ( result <= v13 && v13 - result >= 4 )
  {
    *(_DWORD *)(result + *(_DWORD *)v11) = v16;
    *(_DWORD *)(v11 + 8) += 4;
    result = v15;
    *(_DWORD *)(v14 + 8) = v15;
  }
  else
  {
    *(_DWORD *)(v11 + 8) = v13 + 1;
    *(_DWORD *)(v14 + 8) = v15;
  }
  return result;
}
	//----- (00007B60) --------------------------------------------------------
int __fastcall sub_7B60(int a1, int a2, int a3, int a4)
{
  int v4; // esi@1
  int v5; // eax@1
  int v6; // edx@1
  int v7; // eax@1
  int v8; // edx@1
  int v9; // eax@1
  int v10; // edx@1
  int v11; // eax@1
  int v12; // edx@1
  char v14; // [sp+8h] [bp-78h]@1
  char v15; // [sp+68h] [bp-18h]@1
  unsigned int v16; // [sp+7Ch] [bp-4h]@1
  int v17; // [sp+80h] [bp+0h]@1
	  v16 = (unsigned int)&v17 ^ v3EDA03C;
  v4 = a3;
  v5 = sub_109F((int)&v15, a2, a3, (int)&v15);
  sub_1EF0(v5, v6, (int)&v14);
  LOBYTE(v9) = sub_1346(v7, v8, (int)&v14, v4 + 160, 0x40u);
  LOBYTE(v11) = sub_1346(v9, v10, (int)&v14, (int)&v15, 0x14u);
  return sub_109F(v11, v12, (int)&v14, a4);
}
	//----- (00007BC2) --------------------------------------------------------
char __fastcall sub_7BC2(int a1, int a2, int a3)
{
  return sub_583F(a1, a2, a3, a2, 0x10u);
}
	//----- (00007C0D) --------------------------------------------------------
char __fastcall sub_7C0D(int a1, int a2, int a3, int a4, int a5, int a6)
{
  int v6; // edi@1
  int v7; // eax@1
  int v8; // ebx@1
  signed int v9; // esi@1
  int v10; // edx@1
  int v12; // edx@5
  int v13; // eax@6
  int v14; // edx@6
  int v15; // ebx@8
  char v16; // bl@15
  int v17; // eax@17
  int v18; // edx@17
  unsigned __int64 v19; // [sp+Ch] [bp-10h]@5
  int v20; // [sp+14h] [bp-8h]@1
  int v21; // [sp+18h] [bp-4h]@1
	  v6 = a6;
  v7 = *(_DWORD *)a6;
  v8 = a3;
  v9 = 16384;
  v20 = a3;
  a6 = (*(int (__fastcall **)(int, int, int, signed int))v7)(v7, a2, a6, 16384);
  if ( !(unsigned __int8)v8249(&v21, v10, v8, a4, &v21) )
  {
    (*(void (__fastcall **)(_DWORD, int, int, int))(*(_DWORD *)v6 + 4))(*(_DWORD *)v6, v10, v6, a6);
    return 0;
  }
  if ( !sub_6ECA((int)&v19, v10, v8, v21, (int)&v19) )
  {
    v13 = (*(int (__fastcall **)(_DWORD, int, int, int))(*(_DWORD *)v6 + 4))(*(_DWORD *)v6, v12, v6, a6);
    v82D3(v13, v14, v8, v21);
    return 0;
  }
  if ( v19 )
  {
    v15 = a5;
    while ( 1 )
    {
      if ( v19 <= (unsigned int)v9 )
        v9 = v19;
      if ( !(unsigned __int8)v8280(&a4, v12, v20, v21, a6, v9, &a4) || v9 != a4 )
        break;
      (**(void (__fastcall ***)(void (__fastcall **)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD), int, int, int, signed int))v15)(
        *(void (__fastcall ***)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD))v15,
        v12,
        v15,
        a6,
        v9);
      v19 -= (unsigned int)v9;
      if ( !v19 )
        goto LABEL_15;
      v9 = 16384;
    }
    v16 = 0;
  }
  else
  {
LABEL_15:
    v16 = 1;
  }
  v17 = (*(int (__fastcall **)(_DWORD, int, int, int))(*(_DWORD *)v6 + 4))(*(_DWORD *)v6, v12, v6, a6);
  v82D3(v17, v18, v20, v21);
  return v16;
}
	//----- (00007E52) --------------------------------------------------------
void __usercall sub_7E52(int a1<eax>, int a2<esi>)
{
  signed int v2; // ecx@1
  int v3; // ebx@2
  char *v4; // eax@3
  int v5; // edi@4
  int v6; // edi@5
  int v7; // eax@5
  int v8; // ebx@5
  int v9; // ebx@7
  char v10[56]; // [sp+0h] [bp-194h]@3
  int *v11; // [sp+28h] [bp-16Ch]@9
  char *v12; // [sp+2Ch] [bp-168h]@9
  int v13; // [sp+38h] [bp-15Ch]@2
  char v14[80]; // [sp+3Ch] [bp-158h]@5
  char v15; // [sp+8Ch] [bp-108h]@7
  int v16; // [sp+178h] [bp-1Ch]@5
  int v17; // [sp+17Ch] [bp-18h]@5
  int v18; // [sp+180h] [bp-14h]@5
  int v19; // [sp+184h] [bp-10h]@5
  int v20; // [sp+188h] [bp-Ch]@5
  int v21; // [sp+18Ch] [bp-8h]@5
  int v22; // [sp+190h] [bp-4h]@5
	  v2 = 0;
  do
  {
    BYTE3(v3) = 0;
    *(_WORD *)((char *)&v3 + 1) = *(_BYTE *)a1;
    LOBYTE(v3) = *(_BYTE *)(a1 + 1);
    *(&v13 + v2++) = *(_BYTE *)(a1 + 3) | ((*(_BYTE *)(a1 + 2) | (v3 << 8)) << 8);
    a1 += 4;
  }
  while ( v2 < 16 );
  v4 = &v10[4 * v2];
  do
  {
    ++v2;
    v5 = __ROL__(*(_DWORD *)v4 ^ *((_DWORD *)v4 - 2) ^ *((_DWORD *)v4 + 6) ^ *((_DWORD *)v4 + 11), 1);
    *((_DWORD *)v4 + 14) = v5;
    v4 += 4;
  }
  while ( v2 < 80 );
  v6 = *(_DWORD *)(a2 + 12);
  v21 = *(_DWORD *)a2;
  v19 = *(_DWORD *)(a2 + 4);
  v22 = *(_DWORD *)(a2 + 8);
  v7 = *(_DWORD *)(a2 + 16);
  v18 = v6;
  v20 = v7;
  v8 = (int)v14;
  v16 = 4;
  v17 = 20;
  do
  {
    sub_5210((int)&v20, (int)&v19, v21, v22, v6, (int)&v20, v8 - 4);
    sub_5210((int)&v18, (int)&v21, v20, v19, v22, (int)&v18, v8);
    sub_5210((int)&v22, (int)&v20, v18, v21, v19, (int)&v22, v8 + 4);
    sub_5210((int)&v19, (int)&v18, v22, v20, v21, (int)&v19, v8 + 8);
    v6 = v18;
    sub_5210((int)&v21, (int)&v22, v19, v18, v20, (int)&v21, v8 + 12);
    v8 += 20;
    --v16;
  }
  while ( v16 );
  v9 = (int)&v15;
  do
  {
    sub_51C5((int)&v20, (int)&v19, v21, v22, v6, (int)&v20, v9 - 4);
    sub_51C5((int)&v18, (int)&v21, v20, v19, v22, (int)&v18, v9);
    sub_51C5((int)&v22, (int)&v20, v18, v21, v19, (int)&v22, v9 + 4);
    sub_51C5((int)&v19, (int)&v18, v22, v20, v21, (int)&v19, v9 + 8);
    v6 = v18;
    sub_51C5((int)&v21, (int)&v22, v19, v18, v20, (int)&v21, v9 + 12);
    v17 += 5;
    v9 += 20;
  }
  while ( v17 < 40 );
  v12 = &v14[4 * v17 - 4];
  v11 = &v20;
  JUMPOUT(v8000);
}
// 7E52: using guessed type char var_194[56];
// 7E52: using guessed type char var_158[80];
	// ALL OK, 75 function(s) have been successfully decompiled

That pseudocode wasn't overkill at all.

Share this post


Link to post
Share on other sites

Yep, it wasn't, however, quotting the whole post was.

1 person likes this

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0