// File: kobanium[P]Ray/src/feature/UctFeature.cpp
// Function: CheckFeaturesLib3ForTree(game_info_t const*, int, int, unsigned int*)
static void
CheckFeaturesLib3ForTree( const game_info_t *game, const int color, const int id, unsigned int *tactical_features )
{
  const string_t *string = game->string;
  int lib1, lib2, lib3, neighbor, lib1_state, lib2_state, lib3_state;

  // 呼吸点が3つになった連の呼吸点を取り出す
  lib1 = string[id].lib[0];
  lib2 = string[id].lib[lib1];
  lib3 = string[id].lib[lib2];

  // 呼吸点に打つ特徴
  lib1_state = CheckLibertyState(game, lib1, color, id);
  lib2_state = CheckLibertyState(game, lib2, color, id);
  lib3_state = CheckLibertyState(game, lib3, color, id);
  switch (lib1_state) {
  case L_DECREASE :
    CompareSwapFeature(tactical_features, lib1, UCT_EXTENSION_INDEX, UCT_3POINT_EXTENSION_DECREASE);
    break;
  case L_EVEN :
    CompareSwapFeature(tactical_features, lib1, UCT_EXTENSION_INDEX, UCT_3POINT_EXTENSION_EVEN);
    break;
  case L_INCREASE:
    CompareSwapFeature(tactical_features, lib1, UCT_EXTENSION_INDEX, UCT_3POINT_EXTENSION_INCREASE);
    break;
  default :
    break;
  }
  switch (lib2_state) {
  case L_DECREASE :
    CompareSwapFeature(tactical_features, lib2, UCT_EXTENSION_INDEX, UCT_3POINT_EXTENSION_DECREASE);
    break;
  case L_EVEN :
    CompareSwapFeature(tactical_features, lib2, UCT_EXTENSION_INDEX, UCT_3POINT_EXTENSION_EVEN);
    break;
  case L_INCREASE:
    CompareSwapFeature(tactical_features, lib2, UCT_EXTENSION_INDEX, UCT_3POINT_EXTENSION_INCREASE);
    break;
  default :
    break;
  }
  switch (lib3_state) {
  case L_DECREASE :
    CompareSwapFeature(tactical_features, lib3, UCT_EXTENSION_INDEX, UCT_3POINT_EXTENSION_DECREASE);
    break;
  case L_EVEN :
    CompareSwapFeature(tactical_features, lib3, UCT_EXTENSION_INDEX, UCT_3POINT_EXTENSION_EVEN);
    break;
  case L_INCREASE:
    CompareSwapFeature(tactical_features, lib3, UCT_EXTENSION_INDEX, UCT_3POINT_EXTENSION_INCREASE);
    break;
  default :
    break;
  }


  // 呼吸点が3つになった連の周囲の敵連を調べる
  // 1. 呼吸点が1つの敵連
  // 2. 呼吸点が2つの敵連
  // 3. 呼吸点が3つの敵連
  // それぞれに対して, 特徴を判定する
  // さらに2に関しては1手で取れるかを考慮する

  neighbor = string[id].neighbor[0];
  if (string[id].size <= 2) {
    while (neighbor != NEIGHBOR_END) {
      if (string[neighbor].libs == 1) {
        lib1 = string[neighbor].lib[0];
        if (string[neighbor].size <= 2) {
          CompareSwapFeature(tactical_features, lib1, UCT_CAPTURE_INDEX, UCT_3POINT_CAPTURE_S_S);
        } else {
          CompareSwapFeature(tactical_features, lib1, UCT_CAPTURE_INDEX, UCT_3POINT_CAPTURE_S_L);
        }
      } else if (string[neighbor].libs == 2) {
        lib1 = string[neighbor].lib[0];
        lib2 = string[neighbor].lib[lib1];
        if (string[neighbor].size <= 2) {
          if (IsCapturableAtari(game, lib1, color, string[neighbor].origin)) {
            CompareSwapFeature(tactical_features, lib1, UCT_ATARI_INDEX, UCT_3POINT_C_ATARI_S_S);
          } else {
            CompareSwapFeature(tactical_features, lib1, UCT_ATARI_INDEX, UCT_3POINT_ATARI_S_S);
          }
          if (IsCapturableAtari(game, lib2, color, string[neighbor].origin)) {
            CompareSwapFeature(tactical_features, lib2, UCT_ATARI_INDEX, UCT_3POINT_C_ATARI_S_S);
          } else {
            CompareSwapFeature(tactical_features, lib2, UCT_ATARI_INDEX, UCT_3POINT_ATARI_S_S);
          }
        } else {
          if (IsCapturableAtari(game, lib1, color, string[neighbor].origin)) {
            CompareSwapFeature(tactical_features, lib1, UCT_ATARI_INDEX, UCT_3POINT_C_ATARI_S_L);
          } else {
            CompareSwapFeature(tactical_features, lib1, UCT_ATARI_INDEX, UCT_3POINT_ATARI_S_L);
          }
          if (IsCapturableAtari(game, lib2, color, string[neighbor].origin)) {
            CompareSwapFeature(tactical_features, lib2, UCT_ATARI_INDEX, UCT_3POINT_C_ATARI_S_L);
          } else {
            CompareSwapFeature(tactical_features, lib2, UCT_ATARI_INDEX, UCT_3POINT_ATARI_S_L);
          }
        }
      } else if (string[neighbor].libs == 3) {
        lib1 = string[neighbor].lib[0];
        lib2 = string[neighbor].lib[lib1];
        lib3 = string[neighbor].lib[lib2];
        if (string[neighbor].size <= 2) {
          CompareSwapFeature(tactical_features, lib1, UCT_DAME_INDEX, UCT_3POINT_DAME_S_S);
          CompareSwapFeature(tactical_features, lib2, UCT_DAME_INDEX, UCT_3POINT_DAME_S_S);
          CompareSwapFeature(tactical_features, lib3, UCT_DAME_INDEX, UCT_3POINT_DAME_S_S);
        } else {
          CompareSwapFeature(tactical_features, lib1, UCT_DAME_INDEX, UCT_3POINT_DAME_S_L);
          CompareSwapFeature(tactical_features, lib2, UCT_DAME_INDEX, UCT_3POINT_DAME_S_L);
          CompareSwapFeature(tactical_features, lib3, UCT_DAME_INDEX, UCT_3POINT_DAME_S_L);
        }
      }
      neighbor = string[id].neighbor[neighbor];
    }
  } else {
    while (neighbor != NEIGHBOR_END) {
      if (string[neighbor].libs == 1) {
        lib1 = string[neighbor].lib[0];
        if (string[neighbor].size <= 2) {
          CompareSwapFeature(tactical_features, lib1, UCT_CAPTURE_INDEX, UCT_3POINT_CAPTURE_L_S);
        } else {
          CompareSwapFeature(tactical_features, lib1, UCT_CAPTURE_INDEX, UCT_3POINT_CAPTURE_L_L);
        }
      } else if (string[neighbor].libs == 2) {
        lib1 = string[neighbor].lib[0];
        lib2 = string[neighbor].lib[lib1];
        if (string[neighbor].size <= 2) {
          if (IsCapturableAtari(game, lib1, color, string[neighbor].origin)) {
            CompareSwapFeature(tactical_features, lib1, UCT_ATARI_INDEX, UCT_3POINT_C_ATARI_L_S);
          } else {
            CompareSwapFeature(tactical_features, lib1, UCT_ATARI_INDEX, UCT_3POINT_ATARI_L_S);
          }
          if (IsCapturableAtari(game, lib2, color, string[neighbor].origin)) {
            CompareSwapFeature(tactical_features, lib2, UCT_ATARI_INDEX, UCT_3POINT_C_ATARI_L_S);
          } else {
            CompareSwapFeature(tactical_features, lib2, UCT_ATARI_INDEX, UCT_3POINT_ATARI_L_S);
          }
        } else {
          if (IsCapturableAtari(game, lib1, color, string[neighbor].origin)) {
            CompareSwapFeature(tactical_features, lib1, UCT_ATARI_INDEX, UCT_3POINT_C_ATARI_L_L);
          } else {
            CompareSwapFeature(tactical_features, lib1, UCT_ATARI_INDEX, UCT_3POINT_ATARI_L_L);
          }
          if (IsCapturableAtari(game, lib2, color, string[neighbor].origin)) {
            CompareSwapFeature(tactical_features, lib2, UCT_ATARI_INDEX, UCT_3POINT_C_ATARI_L_L);
          } else {
            CompareSwapFeature(tactical_features, lib2, UCT_ATARI_INDEX, UCT_3POINT_ATARI_L_L);
          }
        }
      } else if (string[neighbor].libs == 3) {
        lib1 = string[neighbor].lib[0];
        lib2 = string[neighbor].lib[lib1];
        lib3 = string[neighbor].lib[lib2];
        if (string[neighbor].size <= 2) {
          CompareSwapFeature(tactical_features, lib1, UCT_DAME_INDEX, UCT_3POINT_DAME_L_S);
          CompareSwapFeature(tactical_features, lib2, UCT_DAME_INDEX, UCT_3POINT_DAME_L_S);
          CompareSwapFeature(tactical_features, lib3, UCT_DAME_INDEX, UCT_3POINT_DAME_L_S);
        } else {
          CompareSwapFeature(tactical_features, lib1, UCT_DAME_INDEX, UCT_3POINT_DAME_L_L);
          CompareSwapFeature(tactical_features, lib2, UCT_DAME_INDEX, UCT_3POINT_DAME_L_L);
          CompareSwapFeature(tactical_features, lib3, UCT_DAME_INDEX, UCT_3POINT_DAME_L_L);
        }
      }
      neighbor = string[id].neighbor[neighbor];
    }
  }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x8(%rbp)
movl %esi, -0xc(%rbp)
movl %edx, -0x10(%rbp)
movq %rcx, -0x18(%rbp)
movq -0x8(%rbp), %rax
addq $0x9620, %rax           # imm = 0x9620
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
movslq -0x10(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
movswl 0x8(%rax,%rcx), %eax
movl %eax, -0x24(%rbp)
movq -0x20(%rbp), %rax
movslq -0x10(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movslq -0x24(%rbp), %rcx
movswl 0x8(%rax,%rcx,2), %eax
movl %eax, -0x28(%rbp)
movq -0x20(%rbp), %rax
movslq -0x10(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movslq -0x28(%rbp), %rcx
movswl 0x8(%rax,%rcx,2), %eax
movl %eax, -0x2c(%rbp)
movq -0x8(%rbp), %rdi
movl -0x24(%rbp), %esi
movl -0xc(%rbp), %edx
movl -0x10(%rbp), %ecx
callq 0xa8600
movl %eax, -0x34(%rbp)
movq -0x8(%rbp), %rdi
movl -0x28(%rbp), %esi
movl -0xc(%rbp), %edx
movl -0x10(%rbp), %ecx
callq 0xa8600
movl %eax, -0x38(%rbp)
movq -0x8(%rbp), %rdi
movl -0x2c(%rbp), %esi
movl -0xc(%rbp), %edx
movl -0x10(%rbp), %ecx
callq 0xa8600
movl %eax, -0x3c(%rbp)
movl -0x34(%rbp), %eax
movl %eax, -0x40(%rbp)
testl %eax, %eax
je 0xa6a66
jmp 0xa6a52
movl -0x40(%rbp), %eax
subl $0x1, %eax
je 0xa6a7e
jmp 0xa6a5c
movl -0x40(%rbp), %eax
subl $0x2, %eax
je 0xa6a93
jmp 0xa6aab
movq -0x18(%rbp), %rdi
movl -0x24(%rbp), %esi
movl $0x3, %edx
movl $0x1, %ecx
callq 0xa7430
jmp 0xa6aad
movq -0x18(%rbp), %rdi
movl -0x24(%rbp), %esi
movl $0x3, %ecx
movl %ecx, %edx
callq 0xa7430
jmp 0xa6aad
movq -0x18(%rbp), %rdi
movl -0x24(%rbp), %esi
movl $0x3, %edx
movl $0x5, %ecx
callq 0xa7430
jmp 0xa6aad
jmp 0xa6aad
movl -0x38(%rbp), %eax
movl %eax, -0x44(%rbp)
testl %eax, %eax
je 0xa6acd
jmp 0xa6ab9
movl -0x44(%rbp), %eax
subl $0x1, %eax
je 0xa6ae5
jmp 0xa6ac3
movl -0x44(%rbp), %eax
subl $0x2, %eax
je 0xa6afa
jmp 0xa6b12
movq -0x18(%rbp), %rdi
movl -0x28(%rbp), %esi
movl $0x3, %edx
movl $0x1, %ecx
callq 0xa7430
jmp 0xa6b14
movq -0x18(%rbp), %rdi
movl -0x28(%rbp), %esi
movl $0x3, %ecx
movl %ecx, %edx
callq 0xa7430
jmp 0xa6b14
movq -0x18(%rbp), %rdi
movl -0x28(%rbp), %esi
movl $0x3, %edx
movl $0x5, %ecx
callq 0xa7430
jmp 0xa6b14
jmp 0xa6b14
movl -0x3c(%rbp), %eax
movl %eax, -0x48(%rbp)
testl %eax, %eax
je 0xa6b34
jmp 0xa6b20
movl -0x48(%rbp), %eax
subl $0x1, %eax
je 0xa6b4c
jmp 0xa6b2a
movl -0x48(%rbp), %eax
subl $0x2, %eax
je 0xa6b61
jmp 0xa6b79
movq -0x18(%rbp), %rdi
movl -0x2c(%rbp), %esi
movl $0x3, %edx
movl $0x1, %ecx
callq 0xa7430
jmp 0xa6b7b
movq -0x18(%rbp), %rdi
movl -0x2c(%rbp), %esi
movl $0x3, %ecx
movl %ecx, %edx
callq 0xa7430
jmp 0xa6b7b
movq -0x18(%rbp), %rdi
movl -0x2c(%rbp), %esi
movl $0x3, %edx
movl $0x5, %ecx
callq 0xa7430
jmp 0xa6b7b
jmp 0xa6b7b
movq -0x20(%rbp), %rax
movslq -0x10(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movswl 0x57c(%rax), %eax
movl %eax, -0x30(%rbp)
movq -0x20(%rbp), %rax
movslq -0x10(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
cmpl $0x2, 0x7c0(%rax)
jg 0xa6f65
jmp 0xa6bb8
cmpl $0x11f, -0x30(%rbp)     # imm = 0x11F
je 0xa6f60
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
cmpl $0x1, 0x4(%rax)
jne 0xa6c3e
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movswl 0x8(%rax), %eax
movl %eax, -0x24(%rbp)
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
cmpl $0x2, 0x7c0(%rax)
jg 0xa6c26
movq -0x18(%rbp), %rdi
movl -0x24(%rbp), %esi
xorl %edx, %edx
movl $0x8, %ecx
callq 0xa7430
jmp 0xa6c39
movq -0x18(%rbp), %rdi
movl -0x24(%rbp), %esi
xorl %edx, %edx
movl $0xa, %ecx
callq 0xa7430
jmp 0xa6f3a
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
cmpl $0x2, 0x4(%rax)
jne 0xa6e22
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movswl 0x8(%rax), %eax
movl %eax, -0x24(%rbp)
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movslq -0x24(%rbp), %rcx
movswl 0x8(%rax,%rcx,2), %eax
movl %eax, -0x28(%rbp)
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
cmpl $0x2, 0x7c0(%rax)
jg 0xa6d65
movq -0x8(%rbp), %rdi
movl -0x24(%rbp), %esi
movl -0xc(%rbp), %edx
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movl 0x7bc(%rax), %ecx
callq 0xa7dc0
testb $0x1, %al
jne 0xa6cdd
jmp 0xa6cf5
movq -0x18(%rbp), %rdi
movl -0x24(%rbp), %esi
movl $0x2, %edx
movl $0xa, %ecx
callq 0xa7430
jmp 0xa6d08
movq -0x18(%rbp), %rdi
movl -0x24(%rbp), %esi
movl $0x2, %ecx
movl %ecx, %edx
callq 0xa7430
movq -0x8(%rbp), %rdi
movl -0x28(%rbp), %esi
movl -0xc(%rbp), %edx
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movl 0x7bc(%rax), %ecx
callq 0xa7dc0
testb $0x1, %al
jne 0xa6d35
jmp 0xa6d4d
movq -0x18(%rbp), %rdi
movl -0x28(%rbp), %esi
movl $0x2, %edx
movl $0xa, %ecx
callq 0xa7430
jmp 0xa6d60
movq -0x18(%rbp), %rdi
movl -0x28(%rbp), %esi
movl $0x2, %ecx
movl %ecx, %edx
callq 0xa7430
jmp 0xa6e1d
movq -0x8(%rbp), %rdi
movl -0x24(%rbp), %esi
movl -0xc(%rbp), %edx
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movl 0x7bc(%rax), %ecx
callq 0xa7dc0
testb $0x1, %al
jne 0xa6d92
jmp 0xa6daa
movq -0x18(%rbp), %rdi
movl -0x24(%rbp), %esi
movl $0x2, %edx
movl $0xc, %ecx
callq 0xa7430
jmp 0xa6dc0
movq -0x18(%rbp), %rdi
movl -0x24(%rbp), %esi
movl $0x2, %edx
movl $0x4, %ecx
callq 0xa7430
movq -0x8(%rbp), %rdi
movl -0x28(%rbp), %esi
movl -0xc(%rbp), %edx
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movl 0x7bc(%rax), %ecx
callq 0xa7dc0
testb $0x1, %al
jne 0xa6ded
jmp 0xa6e05
movq -0x18(%rbp), %rdi
movl -0x28(%rbp), %esi
movl $0x2, %edx
movl $0xc, %ecx
callq 0xa7430
jmp 0xa6e1b
movq -0x18(%rbp), %rdi
movl -0x28(%rbp), %esi
movl $0x2, %edx
movl $0x4, %ecx
callq 0xa7430
jmp 0xa6e1d
jmp 0xa6f38
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
cmpl $0x3, 0x4(%rax)
jne 0xa6f36
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movswl 0x8(%rax), %eax
movl %eax, -0x24(%rbp)
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movslq -0x24(%rbp), %rcx
movswl 0x8(%rax,%rcx,2), %eax
movl %eax, -0x28(%rbp)
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movslq -0x28(%rbp), %rcx
movswl 0x8(%rax,%rcx,2), %eax
movl %eax, -0x2c(%rbp)
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
cmpl $0x2, 0x7c0(%rax)
jg 0xa6ef2
movq -0x18(%rbp), %rdi
movl -0x24(%rbp), %esi
movl $0x4, %edx
movl $0x1, %ecx
callq 0xa7430
movq -0x18(%rbp), %rdi
movl -0x28(%rbp), %esi
movl $0x4, %edx
movl $0x1, %ecx
callq 0xa7430
movq -0x18(%rbp), %rdi
movl -0x2c(%rbp), %esi
movl $0x4, %edx
movl $0x1, %ecx
callq 0xa7430
jmp 0xa6f34
movq -0x18(%rbp), %rdi
movl -0x24(%rbp), %esi
movl $0x4, %edx
movl $0x2, %ecx
callq 0xa7430
movq -0x18(%rbp), %rdi
movl -0x28(%rbp), %esi
movl $0x4, %edx
movl $0x2, %ecx
callq 0xa7430
movq -0x18(%rbp), %rdi
movl -0x2c(%rbp), %esi
movl $0x4, %edx
movl $0x2, %ecx
callq 0xa7430
jmp 0xa6f36
jmp 0xa6f38
jmp 0xa6f3a
movq -0x20(%rbp), %rax
movslq -0x10(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movslq -0x30(%rbp), %rcx
movswl 0x57c(%rax,%rcx,2), %eax
movl %eax, -0x30(%rbp)
jmp 0xa6bb8
jmp 0xa730e
jmp 0xa6f67
cmpl $0x11f, -0x30(%rbp)     # imm = 0x11F
je 0xa730c
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
cmpl $0x1, 0x4(%rax)
jne 0xa6fed
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movswl 0x8(%rax), %eax
movl %eax, -0x24(%rbp)
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
cmpl $0x2, 0x7c0(%rax)
jg 0xa6fd5
movq -0x18(%rbp), %rdi
movl -0x24(%rbp), %esi
xorl %edx, %edx
movl $0xc, %ecx
callq 0xa7430
jmp 0xa6fe8
movq -0x18(%rbp), %rdi
movl -0x24(%rbp), %esi
xorl %edx, %edx
movl $0xf, %ecx
callq 0xa7430
jmp 0xa72e6
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
cmpl $0x2, 0x4(%rax)
jne 0xa71d7
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movswl 0x8(%rax), %eax
movl %eax, -0x24(%rbp)
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movslq -0x24(%rbp), %rcx
movswl 0x8(%rax,%rcx,2), %eax
movl %eax, -0x28(%rbp)
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
cmpl $0x2, 0x7c0(%rax)
jg 0xa711a
movq -0x8(%rbp), %rdi
movl -0x24(%rbp), %esi
movl -0xc(%rbp), %edx
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movl 0x7bc(%rax), %ecx
callq 0xa7dc0
testb $0x1, %al
jne 0xa708c
jmp 0xa70a4
movq -0x18(%rbp), %rdi
movl -0x24(%rbp), %esi
movl $0x2, %edx
movl $0xe, %ecx
callq 0xa7430
jmp 0xa70ba
movq -0x18(%rbp), %rdi
movl -0x24(%rbp), %esi
movl $0x2, %edx
movl $0x6, %ecx
callq 0xa7430
movq -0x8(%rbp), %rdi
movl -0x28(%rbp), %esi
movl -0xc(%rbp), %edx
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movl 0x7bc(%rax), %ecx
callq 0xa7dc0
testb $0x1, %al
jne 0xa70e7
jmp 0xa70ff
movq -0x18(%rbp), %rdi
movl -0x28(%rbp), %esi
movl $0x2, %edx
movl $0xe, %ecx
callq 0xa7430
jmp 0xa7115
movq -0x18(%rbp), %rdi
movl -0x28(%rbp), %esi
movl $0x2, %edx
movl $0x6, %ecx
callq 0xa7430
jmp 0xa71d2
movq -0x8(%rbp), %rdi
movl -0x24(%rbp), %esi
movl -0xc(%rbp), %edx
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movl 0x7bc(%rax), %ecx
callq 0xa7dc0
testb $0x1, %al
jne 0xa7147
jmp 0xa715f
movq -0x18(%rbp), %rdi
movl -0x24(%rbp), %esi
movl $0x2, %edx
movl $0x10, %ecx
callq 0xa7430
jmp 0xa7175
movq -0x18(%rbp), %rdi
movl -0x24(%rbp), %esi
movl $0x2, %edx
movl $0x8, %ecx
callq 0xa7430
movq -0x8(%rbp), %rdi
movl -0x28(%rbp), %esi
movl -0xc(%rbp), %edx
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movl 0x7bc(%rax), %ecx
callq 0xa7dc0
testb $0x1, %al
jne 0xa71a2
jmp 0xa71ba
movq -0x18(%rbp), %rdi
movl -0x28(%rbp), %esi
movl $0x2, %edx
movl $0x10, %ecx
callq 0xa7430
jmp 0xa71d0
movq -0x18(%rbp), %rdi
movl -0x28(%rbp), %esi
movl $0x2, %edx
movl $0x8, %ecx
callq 0xa7430
jmp 0xa71d2
jmp 0xa72e4
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
cmpl $0x3, 0x4(%rax)
jne 0xa72e2
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movswl 0x8(%rax), %eax
movl %eax, -0x24(%rbp)
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movslq -0x24(%rbp), %rcx
movswl 0x8(%rax,%rcx,2), %eax
movl %eax, -0x28(%rbp)
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movslq -0x28(%rbp), %rcx
movswl 0x8(%rax,%rcx,2), %eax
movl %eax, -0x2c(%rbp)
movq -0x20(%rbp), %rax
movslq -0x30(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
cmpl $0x2, 0x7c0(%rax)
jg 0xa72a7
movq -0x18(%rbp), %rdi
movl -0x24(%rbp), %esi
movl $0x4, %edx
movl $0x3, %ecx
callq 0xa7430
movq -0x18(%rbp), %rdi
movl -0x28(%rbp), %esi
movl $0x4, %edx
movl $0x3, %ecx
callq 0xa7430
movq -0x18(%rbp), %rdi
movl -0x2c(%rbp), %esi
movl $0x4, %edx
movl $0x3, %ecx
callq 0xa7430
jmp 0xa72e0
movq -0x18(%rbp), %rdi
movl -0x24(%rbp), %esi
movl $0x4, %ecx
movl %ecx, %edx
callq 0xa7430
movq -0x18(%rbp), %rdi
movl -0x28(%rbp), %esi
movl $0x4, %ecx
movl %ecx, %edx
callq 0xa7430
movq -0x18(%rbp), %rdi
movl -0x2c(%rbp), %esi
movl $0x4, %ecx
movl %ecx, %edx
callq 0xa7430
jmp 0xa72e2
jmp 0xa72e4
jmp 0xa72e6
movq -0x20(%rbp), %rax
movslq -0x10(%rbp), %rcx
imulq $0x7c8, %rcx, %rcx      # imm = 0x7C8
addq %rcx, %rax
movslq -0x30(%rbp), %rcx
movswl 0x57c(%rax,%rcx,2), %eax
movl %eax, -0x30(%rbp)
jmp 0xa6f67
jmp 0xa730e
addq $0x50, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)