// File: occivink[P]pyct/pyct.cpp
// Function: parse_args(int, char**)
Args parse_args(int argc, char** argv) {
    argc--;
    argv++;
    Args args;
    if (argc == 0)
        throw invalid_argument{"Missing operation"};
    string op(argv[0]);
    if (op == "-h" or op == "--help") {
        args.help = true;
        return args;
    }
    const auto is_prefix = [](const string& pre, const string& s) {
        return pre.size() <= s.size() and equal(pre.begin(), pre.end(), s.begin());
    };
    if (is_prefix(op, "encrypt"))
        args.operation = Args::Operation::Encrypt;
    else if (is_prefix(op, "decrypt"))
        args.operation = Args::Operation::Decrypt;
    else if (is_prefix(op, "hash"))
        args.operation = Args::Operation::Hash;
    else
        throw invalid_argument{"Invalid operation"};

    auto option_value = [argc, argv](int i) {
        if (i >= argc)
            throw invalid_argument{"Missing option value"};
        return string(argv[i]);
    };
    for (int i = 1; i < argc; ++i) {
        string arg(argv[i]);
        if (arg == "-h" or arg == "--help") {
            args.help = true;
        } else if (arg == "-b" or arg == "--base-64") {
            args.base64 = true;
        } else if (arg == "--non-interactive") {
            args.interactive = false;
        } else if (arg == "--no-confirm") {
            args.confirm = false;
        } else if (arg == "--iterations") {
            args.iterations = stoi(option_value(++i));
        } else if (arg == "--work-area-size") {
            args.work_area_size = size_to_number(option_value(++i));
        } else if (arg == "--hash-fd") {
            auto fd = stoi(option_value(++i));
            vector<u8> hash;
            try {
                hash = from_base_64(read_from_fd<string>(fd));
            } catch(...) {
                throw invalid_argument{"Invalid hash"};
            }
            if (hash.size() != 32)
                throw invalid_argument{"Hash is not the correct size"};
            args.hash.emplace();
            copy(hash.begin(), hash.end(), args.hash->begin());
        } else if (arg == "--pass-fd") {
            auto fd = stoi(option_value(++i));
            args.password = read_from_fd<string>(fd);
        } else if (arg == "--input-data-fd") {
            auto fd = stoi(option_value(++i));
            args.input_data_fd = fd;
        } else if (arg == "-s" or arg == "--salt") {
            args.salt = option_value(++i);
            if (args.salt->size() < 8)
                throw invalid_argument{"Salt is too small"};
        } else if (arg == "-l" or arg == "--padded-length") {
            args.padded_length = size_to_number(option_value(++i));
        } else {
            throw invalid_argument{"Unrecognized argument: " + arg};
        }
    }
    if (args.hash and args.password)
        throw invalid_argument{"Can only provide one of hash and password at once"};
    else if (args.operation != Args::Operation::Encrypt and args.padded_length)
        throw invalid_argument{"Can only pad when encrypting"};
    return args;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x3f0, %rsp            # imm = 0x3F0
movq %rdi, -0x2f8(%rbp)
movq %rdi, %rax
movq %rax, -0x2f0(%rbp)
movq %rdi, -0x8(%rbp)
movl %esi, -0xc(%rbp)
movq %rdx, -0x18(%rbp)
movl -0xc(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0xc(%rbp)
movq -0x18(%rbp), %rax
addq $0x8, %rax
movq %rax, -0x18(%rbp)
movb $0x0, -0x19(%rbp)
callq 0x17640
cmpl $0x0, -0xc(%rbp)
jne 0x1506d
movl $0x10, %edi
callq 0x3140
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x300(%rbp)
leaq 0x81fc(%rip), %rsi      # 0x1d215
callq 0x3530
jmp 0x15020
movq -0x300(%rbp), %rdi
movq 0xefa2(%rip), %rsi      # 0x23fd0
movq 0xef8b(%rip), %rdx      # 0x23fc0
callq 0x34c0
jmp 0x15fe7
movq -0x300(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
callq 0x3200
jmp 0x15fca
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x15fca
movq -0x18(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x310(%rbp)
leaq -0x51(%rbp), %rdi
movq %rdi, -0x308(%rbp)
callq 0x3500
movq -0x310(%rbp), %rsi
movq -0x308(%rbp), %rdx
leaq -0x50(%rbp), %rdi
callq 0x176d0
jmp 0x150a4
leaq -0x51(%rbp), %rdi
callq 0x3340
leaq 0x8173(%rip), %rsi      # 0x1d227
leaq -0x50(%rbp), %rdi
callq 0x17780
movb %al, -0x311(%rbp)
jmp 0x150c5
movb -0x311(%rbp), %al
testb $0x1, %al
jne 0x150f5
jmp 0x150d1
leaq 0x8152(%rip), %rsi      # 0x1d22a
leaq -0x50(%rbp), %rdi
callq 0x17780
movb %al, -0x312(%rbp)
jmp 0x150e9
movb -0x312(%rbp), %al
testb $0x1, %al
jne 0x150f5
jmp 0x1513b
movq -0x2f8(%rbp), %rax
movb $0x1, 0x4(%rax)
movb $0x1, -0x19(%rbp)
movl $0x1, -0x58(%rbp)
jmp 0x15f92
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0x51(%rbp), %rdi
callq 0x3340
jmp 0x15fca
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x15fa3
leaq -0x81(%rbp), %rdi
movq %rdi, -0x320(%rbp)
callq 0x3500
movq -0x320(%rbp), %rdx
leaq 0x80d5(%rip), %rsi      # 0x1d231
leaq -0x80(%rbp), %rdi
callq 0x176d0
jmp 0x15167
leaq -0x59(%rbp), %rdi
leaq -0x50(%rbp), %rsi
leaq -0x80(%rbp), %rdx
callq 0x15ff0
movb %al, -0x321(%rbp)
jmp 0x15180
leaq -0x80(%rbp), %rdi
callq 0x31b0
leaq -0x81(%rbp), %rdi
callq 0x3340
movb -0x321(%rbp), %al
testb $0x1, %al
jne 0x151a1
jmp 0x151e7
movq -0x2f8(%rbp), %rax
movl $0x0, (%rax)
jmp 0x153bc
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x151d6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0x80(%rbp), %rdi
callq 0x31b0
leaq -0x81(%rbp), %rdi
callq 0x3340
jmp 0x15fa3
leaq -0xa9(%rbp), %rdi
movq %rdi, -0x330(%rbp)
callq 0x3500
movq -0x330(%rbp), %rdx
leaq 0x8031(%rip), %rsi      # 0x1d239
leaq -0xa8(%rbp), %rdi
callq 0x176d0
jmp 0x15216
leaq -0x59(%rbp), %rdi
leaq -0x50(%rbp), %rsi
leaq -0xa8(%rbp), %rdx
callq 0x15ff0
movb %al, -0x331(%rbp)
jmp 0x15232
leaq -0xa8(%rbp), %rdi
callq 0x31b0
leaq -0xa9(%rbp), %rdi
callq 0x3340
movb -0x331(%rbp), %al
testb $0x1, %al
jne 0x15256
jmp 0x1529f
movq -0x2f8(%rbp), %rax
movl $0x1, (%rax)
jmp 0x153ba
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x1528e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0xa8(%rbp), %rdi
callq 0x31b0
leaq -0xa9(%rbp), %rdi
callq 0x3340
jmp 0x15fa3
leaq -0xd1(%rbp), %rdi
movq %rdi, -0x340(%rbp)
callq 0x3500
movq -0x340(%rbp), %rdx
leaq 0x7fef(%rip), %rsi      # 0x1d2af
leaq -0xd0(%rbp), %rdi
callq 0x176d0
jmp 0x152ce
leaq -0x59(%rbp), %rdi
leaq -0x50(%rbp), %rsi
leaq -0xd0(%rbp), %rdx
callq 0x15ff0
movb %al, -0x341(%rbp)
jmp 0x152ea
leaq -0xd0(%rbp), %rdi
callq 0x31b0
leaq -0xd1(%rbp), %rdi
callq 0x3340
movb -0x341(%rbp), %al
testb $0x1, %al
jne 0x1530e
jmp 0x15357
movq -0x2f8(%rbp), %rax
movl $0x2, (%rax)
jmp 0x153b8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x15346
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0xd0(%rbp), %rdi
callq 0x31b0
leaq -0xd1(%rbp), %rdi
callq 0x3340
jmp 0x15fa3
movl $0x10, %edi
callq 0x3140
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x350(%rbp)
leaq 0x7ecc(%rip), %rsi      # 0x1d241
callq 0x3530
jmp 0x1537c
movq -0x350(%rbp), %rdi
movq 0xec46(%rip), %rsi      # 0x23fd0
movq 0xec2f(%rip), %rdx      # 0x23fc0
callq 0x34c0
jmp 0x15fe7
movq -0x350(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
callq 0x3200
jmp 0x15fa3
jmp 0x153ba
jmp 0x153bc
movl -0xc(%rbp), %eax
movl %eax, -0xe8(%rbp)
movq -0x18(%rbp), %rax
movq %rax, -0xe0(%rbp)
movl $0x1, -0xec(%rbp)
movl -0xec(%rbp), %eax
cmpl -0xc(%rbp), %eax
jge 0x15e78
movq -0x18(%rbp), %rax
movslq -0xec(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq %rax, -0x360(%rbp)
leaq -0x111(%rbp), %rdi
movq %rdi, -0x358(%rbp)
callq 0x3500
movq -0x360(%rbp), %rsi
movq -0x358(%rbp), %rdx
leaq -0x110(%rbp), %rdi
callq 0x176d0
jmp 0x1542e
leaq -0x111(%rbp), %rdi
callq 0x3340
leaq 0x7de6(%rip), %rsi      # 0x1d227
leaq -0x110(%rbp), %rdi
callq 0x17780
movb %al, -0x361(%rbp)
jmp 0x15455
movb -0x361(%rbp), %al
testb $0x1, %al
jne 0x15488
jmp 0x15461
leaq 0x7dc2(%rip), %rsi      # 0x1d22a
leaq -0x110(%rbp), %rdi
callq 0x17780
movb %al, -0x362(%rbp)
jmp 0x1547c
movb -0x362(%rbp), %al
testb $0x1, %al
jne 0x15488
jmp 0x154c6
movq -0x2f8(%rbp), %rax
movb $0x1, 0x4(%rax)
jmp 0x15e47
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0x111(%rbp), %rdi
callq 0x3340
jmp 0x15fa3
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x15e67
leaq 0x7d86(%rip), %rsi      # 0x1d253
leaq -0x110(%rbp), %rdi
callq 0x17780
movb %al, -0x363(%rbp)
jmp 0x154e1
movb -0x363(%rbp), %al
testb $0x1, %al
jne 0x15514
jmp 0x154ed
leaq 0x7d62(%rip), %rsi      # 0x1d256
leaq -0x110(%rbp), %rdi
callq 0x17780
movb %al, -0x364(%rbp)
jmp 0x15508
movb -0x364(%rbp), %al
testb $0x1, %al
jne 0x15514
jmp 0x15524
movq -0x2f8(%rbp), %rax
movb $0x1, 0x5(%rax)
jmp 0x15e45
leaq 0x7d35(%rip), %rsi      # 0x1d260
leaq -0x110(%rbp), %rdi
callq 0x17780
movb %al, -0x365(%rbp)
jmp 0x1553f
movb -0x365(%rbp), %al
testb $0x1, %al
jne 0x1554b
jmp 0x1555b
movq -0x2f8(%rbp), %rax
movb $0x0, 0x6(%rax)
jmp 0x15e43
leaq 0x7d10(%rip), %rsi      # 0x1d272
leaq -0x110(%rbp), %rdi
callq 0x17780
movb %al, -0x366(%rbp)
jmp 0x15576
movb -0x366(%rbp), %al
testb $0x1, %al
jne 0x15582
jmp 0x15592
movq -0x2f8(%rbp), %rax
movb $0x0, 0x7(%rax)
jmp 0x15e41
leaq 0x7ce6(%rip), %rsi      # 0x1d27f
leaq -0x110(%rbp), %rdi
callq 0x17780
movb %al, -0x367(%rbp)
jmp 0x155ad
movb -0x367(%rbp), %al
testb $0x1, %al
jne 0x155bc
jmp 0x1564d
movl -0xec(%rbp), %edx
incl %edx
movl %edx, -0xec(%rbp)
leaq -0x138(%rbp), %rdi
leaq -0xe8(%rbp), %rsi
callq 0x16080
jmp 0x155df
xorl %eax, %eax
movl %eax, %esi
leaq -0x138(%rbp), %rdi
movl $0xa, %edx
callq 0x177b0
movl %eax, -0x36c(%rbp)
jmp 0x155fc
movq -0x2f8(%rbp), %rdi
movl -0x36c(%rbp), %eax
movl %eax, -0x118(%rbp)
addq $0x10, %rdi
leaq -0x118(%rbp), %rsi
callq 0x177f0
leaq -0x138(%rbp), %rdi
callq 0x31b0
jmp 0x15e3f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0x138(%rbp), %rdi
callq 0x31b0
jmp 0x15e67
leaq 0x7c38(%rip), %rsi      # 0x1d28c
leaq -0x110(%rbp), %rdi
callq 0x17780
movb %al, -0x36d(%rbp)
jmp 0x15668
movb -0x36d(%rbp), %al
testb $0x1, %al
jne 0x15677
jmp 0x1571b
movl -0xec(%rbp), %edx
incl %edx
movl %edx, -0xec(%rbp)
leaq -0x170(%rbp), %rdi
leaq -0xe8(%rbp), %rsi
callq 0x16080
jmp 0x1569a
leaq -0x170(%rbp), %rdi
callq 0x133e0
movq %rax, -0x378(%rbp)
jmp 0x156af
movq -0x378(%rbp), %rax
movq %rax, -0x150(%rbp)
leaq -0x148(%rbp), %rdi
leaq -0x150(%rbp), %rsi
callq 0x17850
movq -0x2f8(%rbp), %rax
movq -0x148(%rbp), %rcx
movq %rcx, 0x20(%rax)
movq -0x140(%rbp), %rcx
movq %rcx, 0x28(%rax)
leaq -0x170(%rbp), %rdi
callq 0x31b0
jmp 0x15e3d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0x170(%rbp), %rdi
callq 0x31b0
jmp 0x15e67
leaq 0x7b7b(%rip), %rsi      # 0x1d29d
leaq -0x110(%rbp), %rdi
callq 0x17780
movb %al, -0x379(%rbp)
jmp 0x15736
movb -0x379(%rbp), %al
testb $0x1, %al
jne 0x15745
jmp 0x159da
movl -0xec(%rbp), %edx
incl %edx
movl %edx, -0xec(%rbp)
leaq -0x198(%rbp), %rdi
leaq -0xe8(%rbp), %rsi
callq 0x16080
jmp 0x15768
xorl %eax, %eax
movl %eax, %esi
leaq -0x198(%rbp), %rdi
movl $0xa, %edx
callq 0x177b0
movl %eax, -0x380(%rbp)
jmp 0x15785
leaq -0x198(%rbp), %rdi
callq 0x31b0
movl -0x380(%rbp), %eax
movl %eax, -0x174(%rbp)
leaq -0x1b0(%rbp), %rdi
callq 0x170e0
movl -0x174(%rbp), %esi
leaq -0x1e8(%rbp), %rdi
callq 0x17880
jmp 0x157bd
leaq -0x1c8(%rbp), %rdi
leaq -0x1e8(%rbp), %rsi
callq 0x13820
jmp 0x157d2
leaq -0x1b0(%rbp), %rdi
leaq -0x1c8(%rbp), %rsi
callq 0x17a30
leaq -0x1c8(%rbp), %rdi
callq 0x17210
leaq -0x1e8(%rbp), %rdi
callq 0x31b0
jmp 0x158c4
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0x198(%rbp), %rdi
callq 0x31b0
jmp 0x15e67
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x15845
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0x1e8(%rbp), %rdi
callq 0x31b0
movq -0x28(%rbp), %rdi
callq 0x30d0
movl $0x10, %edi
callq 0x3140
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x388(%rbp)
leaq 0x7a3b(%rip), %rsi      # 0x1d2a7
callq 0x3530
jmp 0x15873
movq -0x388(%rbp), %rdi
movq 0xe74f(%rip), %rsi      # 0x23fd0
movq 0xe738(%rip), %rdx      # 0x23fc0
callq 0x34c0
jmp 0x15fe7
movq -0x388(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
callq 0x3200
jmp 0x158b8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
callq 0x3490
jmp 0x158bf
jmp 0x159c9
leaq -0x1b0(%rbp), %rdi
callq 0x17400
cmpq $0x20, %rax
je 0x15948
movl $0x10, %edi
callq 0x3140
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x390(%rbp)
leaq 0x79c0(%rip), %rsi      # 0x1d2b4
callq 0x3530
jmp 0x158fb
movq -0x390(%rbp), %rdi
movq 0xe6c7(%rip), %rsi      # 0x23fd0
movq 0xe6b0(%rip), %rdx      # 0x23fc0
callq 0x34c0
jmp 0x15fe7
movq -0x390(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
callq 0x3200
jmp 0x159c9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x159c9
movq -0x2f8(%rbp), %rdi
addq $0x58, %rdi
movq %rdi, -0x398(%rbp)
callq 0x17a70
leaq -0x1b0(%rbp), %rdi
movq %rdi, -0x3a0(%rbp)
callq 0x17b10
movq -0x3a0(%rbp), %rdi
movq %rax, -0x1f0(%rbp)
callq 0x17b40
movq -0x398(%rbp), %rdi
movq %rax, -0x1f8(%rbp)
callq 0x17b70
movq %rax, %rdi
callq 0x17b90
movq %rax, %rdx
movq -0x1f0(%rbp), %rdi
movq -0x1f8(%rbp), %rsi
callq 0x17ab0
jmp 0x159b8
leaq -0x1b0(%rbp), %rdi
callq 0x17210
jmp 0x15e3b
leaq -0x1b0(%rbp), %rdi
callq 0x17210
jmp 0x15e67
leaq 0x78f0(%rip), %rsi      # 0x1d2d1
leaq -0x110(%rbp), %rdi
callq 0x17780
movb %al, -0x3a1(%rbp)
jmp 0x159f5
movb -0x3a1(%rbp), %al
testb $0x1, %al
jne 0x15a04
jmp 0x15ab5
movl -0xec(%rbp), %edx
incl %edx
movl %edx, -0xec(%rbp)
leaq -0x220(%rbp), %rdi
leaq -0xe8(%rbp), %rsi
callq 0x16080
jmp 0x15a27
xorl %eax, %eax
movl %eax, %esi
leaq -0x220(%rbp), %rdi
movl $0xa, %edx
callq 0x177b0
movl %eax, -0x3a8(%rbp)
jmp 0x15a44
leaq -0x220(%rbp), %rdi
callq 0x31b0
movl -0x3a8(%rbp), %eax
movl %eax, -0x1fc(%rbp)
movl -0x1fc(%rbp), %esi
leaq -0x240(%rbp), %rdi
callq 0x17880
jmp 0x15a70
movq -0x2f8(%rbp), %rdi
addq $0x30, %rdi
leaq -0x240(%rbp), %rsi
callq 0x17bb0
leaq -0x240(%rbp), %rdi
callq 0x31b0
jmp 0x15e39
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0x220(%rbp), %rdi
callq 0x31b0
jmp 0x15e67
leaq 0x781f(%rip), %rsi      # 0x1d2db
leaq -0x110(%rbp), %rdi
callq 0x17780
movb %al, -0x3a9(%rbp)
jmp 0x15ad0
movb -0x3a9(%rbp), %al
testb $0x1, %al
jne 0x15adf
jmp 0x15b69
movl -0xec(%rbp), %edx
incl %edx
movl %edx, -0xec(%rbp)
leaq -0x268(%rbp), %rdi
leaq -0xe8(%rbp), %rsi
callq 0x16080
jmp 0x15b02
xorl %eax, %eax
movl %eax, %esi
leaq -0x268(%rbp), %rdi
movl $0xa, %edx
callq 0x177b0
movl %eax, -0x3b0(%rbp)
jmp 0x15b1f
leaq -0x268(%rbp), %rdi
callq 0x31b0
movl -0x3b0(%rbp), %ecx
movq -0x2f8(%rbp), %rax
movl %ecx, -0x244(%rbp)
movl -0x244(%rbp), %ecx
movl %ecx, 0x8(%rax)
jmp 0x15e37
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0x268(%rbp), %rdi
callq 0x31b0
jmp 0x15e67
leaq 0x777b(%rip), %rsi      # 0x1d2eb
leaq -0x110(%rbp), %rdi
callq 0x17780
movb %al, -0x3b1(%rbp)
jmp 0x15b84
movb -0x3b1(%rbp), %al
testb $0x1, %al
jne 0x15bba
jmp 0x15b90
leaq 0x7757(%rip), %rsi      # 0x1d2ee
leaq -0x110(%rbp), %rdi
callq 0x17780
movb %al, -0x3b2(%rbp)
jmp 0x15bab
movb -0x3b2(%rbp), %al
testb $0x1, %al
jne 0x15bba
jmp 0x15c8a
movl -0xec(%rbp), %edx
incl %edx
movl %edx, -0xec(%rbp)
leaq -0x288(%rbp), %rdi
leaq -0xe8(%rbp), %rsi
callq 0x16080
jmp 0x15bdd
movq -0x2f8(%rbp), %rdi
addq $0x80, %rdi
leaq -0x288(%rbp), %rsi
callq 0x17bb0
leaq -0x288(%rbp), %rdi
callq 0x31b0
movq -0x2f8(%rbp), %rdi
addq $0x80, %rdi
callq 0x17c10
movq %rax, %rdi
callq 0x31e0
cmpq $0x8, %rax
jae 0x15c85
movl $0x10, %edi
callq 0x3140
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x3c0(%rbp)
leaq 0x76b3(%rip), %rsi      # 0x1d2f5
callq 0x3530
jmp 0x15c49
movq -0x3c0(%rbp), %rdi
movq 0xe379(%rip), %rsi      # 0x23fd0
movq 0xe362(%rip), %rdx      # 0x23fc0
callq 0x34c0
jmp 0x15fe7
movq -0x3c0(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
callq 0x3200
jmp 0x15e67
jmp 0x15e35
leaq 0x7676(%rip), %rsi      # 0x1d307
leaq -0x110(%rbp), %rdi
callq 0x17780
movb %al, -0x3c1(%rbp)
jmp 0x15ca5
movb -0x3c1(%rbp), %al
testb $0x1, %al
jne 0x15cdb
jmp 0x15cb1
leaq 0x7652(%rip), %rsi      # 0x1d30a
leaq -0x110(%rbp), %rdi
callq 0x17780
movb %al, -0x3c2(%rbp)
jmp 0x15ccc
movb -0x3c2(%rbp), %al
testb $0x1, %al
jne 0x15cdb
jmp 0x15d85
movl -0xec(%rbp), %edx
incl %edx
movl %edx, -0xec(%rbp)
leaq -0x2c0(%rbp), %rdi
leaq -0xe8(%rbp), %rsi
callq 0x16080
jmp 0x15cfe
leaq -0x2c0(%rbp), %rdi
callq 0x133e0
movq %rax, -0x3d0(%rbp)
jmp 0x15d13
movq -0x3d0(%rbp), %rax
movq %rax, -0x2a0(%rbp)
leaq -0x298(%rbp), %rdi
leaq -0x2a0(%rbp), %rsi
callq 0x17850
movq -0x2f8(%rbp), %rax
movq -0x298(%rbp), %rcx
movq %rcx, 0xa8(%rax)
movq -0x290(%rbp), %rcx
movq %rcx, 0xb0(%rax)
leaq -0x2c0(%rbp), %rdi
callq 0x31b0
jmp 0x15e33
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0x2c0(%rbp), %rdi
callq 0x31b0
jmp 0x15e67
movb $0x1, -0x2e1(%rbp)
movl $0x10, %edi
callq 0x3140
movq %rax, -0x3d8(%rbp)
leaq 0x7576(%rip), %rsi      # 0x1d31a
leaq -0x2e0(%rbp), %rdi
leaq -0x110(%rbp), %rdx
callq 0x17c30
jmp 0x15db9
movq -0x3d8(%rbp), %rdi
leaq -0x2e0(%rbp), %rsi
callq 0x34e0
jmp 0x15dce
movq -0x3d8(%rbp), %rdi
movb $0x0, -0x2e1(%rbp)
movq 0xe1ed(%rip), %rsi      # 0x23fd0
movq 0xe1d6(%rip), %rdx      # 0x23fc0
callq 0x34c0
jmp 0x15fe7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x15e1a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0x2e0(%rbp), %rdi
callq 0x31b0
testb $0x1, -0x2e1(%rbp)
jne 0x15e25
jmp 0x15e31
movq -0x3d8(%rbp), %rdi
callq 0x3200
jmp 0x15e67
jmp 0x15e35
jmp 0x15e37
jmp 0x15e39
jmp 0x15e3b
jmp 0x15e3d
jmp 0x15e3f
jmp 0x15e41
jmp 0x15e43
jmp 0x15e45
jmp 0x15e47
leaq -0x110(%rbp), %rdi
callq 0x31b0
movl -0xec(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xec(%rbp)
jmp 0x153da
leaq -0x110(%rbp), %rdi
callq 0x31b0
jmp 0x15fa3
movq -0x2f8(%rbp), %rdi
addq $0x58, %rdi
callq 0x17d40
testb $0x1, %al
jne 0x15e8e
jmp 0x15f05
movq -0x2f8(%rbp), %rdi
addq $0x30, %rdi
callq 0x17d60
testb $0x1, %al
jne 0x15ea4
jmp 0x15f05
movl $0x10, %edi
callq 0x3140
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x3e0(%rbp)
leaq 0x7470(%rip), %rsi      # 0x1d332
callq 0x3530
jmp 0x15ec9
movq -0x3e0(%rbp), %rdi
movq 0xe0f9(%rip), %rsi      # 0x23fd0
movq 0xe0e2(%rip), %rdx      # 0x23fc0
callq 0x34c0
jmp 0x15fe7
movq -0x3e0(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
callq 0x3200
jmp 0x15fa3
movq -0x2f8(%rbp), %rax
cmpl $0x0, (%rax)
je 0x15f85
movq -0x2f8(%rbp), %rdi
addq $0xa8, %rdi
callq 0x173c0
testb $0x1, %al
jne 0x15f2a
jmp 0x15f85
movl $0x10, %edi
callq 0x3140
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x3e8(%rbp)
leaq 0x741c(%rip), %rsi      # 0x1d364
callq 0x3530
jmp 0x15f4f
movq -0x3e8(%rbp), %rdi
movq 0xe073(%rip), %rsi      # 0x23fd0
movq 0xe05c(%rip), %rdx      # 0x23fc0
callq 0x34c0
jmp 0x15fe7
movq -0x3e8(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
callq 0x3200
jmp 0x15fa3
jmp 0x15f87
movb $0x1, -0x19(%rbp)
movl $0x1, -0x58(%rbp)
leaq -0x50(%rbp), %rdi
callq 0x31b0
testb $0x1, -0x19(%rbp)
jne 0x15fba
jmp 0x15fae
leaq -0x50(%rbp), %rdi
callq 0x31b0
jmp 0x15fca
movq -0x2f8(%rbp), %rdi
callq 0x17d80
movq -0x2f0(%rbp), %rax
addq $0x3f0, %rsp            # imm = 0x3F0
popq %rbp
retq
movq -0x2f8(%rbp), %rdi
callq 0x17d80
movq -0x28(%rbp), %rdi
callq 0x34f0
movq %rax, %rdi
callq 0x17a60
nopw (%rax,%rax)