// File: FreeSlave[P]def2fgd/src/main.cpp
// Function: writefgd(std::ostream&, std::vector<Entity, std::allocator<Entity>> const&, FGDWriteOptions const&)
void writefgd(std::ostream& stream, const std::vector<Entity>& entities, const FGDWriteOptions& options)
{
    stream << "//generated by def2fgd " << DEF2FGD_VERSION << "\n\n";

    for (size_t i=0; i<entities.size(); ++i)
    {
        Entity entity = entities[i];
        if (entity.solid) {
            stream << "@SolidClass ";
        }
        else {
            stream << "@PointClass size(";
            stream << entity.box[0] << ' ';
            stream << entity.box[1] << ' ';
            stream << entity.box[2] << ", ";
            stream << entity.box[3] << ' ';
            stream << entity.box[4] << ' ';
            stream << entity.box[5] << ')';

            bool addOffset = options.useDefaultOffsetPatterns && needsOffset(entity.name);

            if (!addOffset) {
                for (size_t j=0; j<options.offsetPatterns.size() && !addOffset; ++j) {
                    addOffset = globMatch(entity.name.c_str(), options.offsetPatterns[j]);
                }
            }

            if (addOffset) {
                stream << " offset(0 0 " << abs(entity.box[2]) << ")";
            }

            if (entity.name == "light" || entity.name == "lightJunior") {
                stream << " iconsprite(\"sprites/light.spr\") flags(Light) ";

                if (!entity.hasKey("_color")) {
                    entity.keys.push_back(Key("_color", "weighted RGB value of light color"));
                }

            } else {
                stream << " color(" << entity.color[0] << ' ' << entity.color[1] << ' ' << entity.color[2] << ") ";

                if (options.bob) {
                    bool addBob = options.useDefaultBobPatterns && needsBob(entity.name);

                    if (!addBob) {
                        for (size_t k=0; k<options.bobPatterns.size() && !addBob; ++k) {
                            addBob = globMatch(entity.name.c_str(), options.bobPatterns[k]);
                        }
                    }

                    if (addBob) {
                        stream << "bobparms( " << options.bobparms[0] << " " << options.bobparms[1] << " " << options.bobparms[2] << " ) ";
                    }
                }

                for (std::vector<Key>::const_iterator it = entity.keys.begin(); it != entity.keys.end(); ++it)
                {
                    if (it->name == "angle" || it->name == "angles") {
                        stream << "flags(Angle) ";
                        break;
                    }
                }

                if (!entity.model.empty()) {
                    stream << "studio(\"" << entity.model << "\") ";
                } else {
                    for (size_t j=0; j<entity.keys.size(); ++j) {
                        if (entity.keys[j].name == "model" || entity.keys[j].name == "model2") {
                            stream << "studio() ";
                            break;
                        }
                    }
                }
            }
        }

        stream << "= " << entity.name;
        if (!entity.description.empty()) {
            const size_t tokenLimit = 2047;

            if (entity.description.size() > tokenLimit) {
                stream << " : \"" << entity.description.substr(0, tokenLimit) << "\"";

                size_t current = tokenLimit;
                while(current <= entity.description.size()) {
                    stream << " + \"" << entity.description.substr(current, tokenLimit) << "\"";
                    current += tokenLimit;
                }

            } else {
                stream << " : \"" << entity.description << "\"";
            }
        }
        stream << "\n";
        stream << "[\n";
        for (size_t j=0; j<entity.keys.size(); ++j)
        {
            const Key& key = entity.keys[j];
            stream << "\t" << key.name;
            if (key.name == "target") {
                stream << "(target_destination) : Target : : ";
            }
            else if (key.name == "targetname") {
                stream << "(target_source) : Name : : ";
            }
            else if (key.name == "_color") {
                stream << "(color1) : \"RGB color\" : \"1 1 0.5\" : ";
            } else if (key.name == "model" || key.name == "model2") {
                stream << "(studio) : Model : : ";
            } else {
                std::string name = key.name;
                if (!name.empty())
                    name[0] = toupper(name[0]);
                if (key.type.empty())
                    stream << "(string)";
                else
                    stream << "(" << key.type << ")";
                stream << " : " << name << " : : ";
            }

            stream << "\"" << key.description << "\"";
            stream << "\n";
        }

        bool hasspawnflags = false;
        for (size_t j=0; j<Entity::SpawnFlagNum && !hasspawnflags; ++j)
        {
            if (!entity.spawnflags[j].empty()) {
                hasspawnflags = true;
            }
        }

        if (hasspawnflags)
        {
            stream << "\tspawnflags(flags) = \n";
            stream << "\t[\n";
            for (size_t j=0; j<Entity::SpawnFlagNum; ++j)
            {
                std::string flagname = entity.spawnflags[j];
                for (size_t k=0; k<flagname.size(); ++k)
                {
                    flagname[k] = tolower(flagname[k]);
                }

                if (!flagname.empty()) {
                    stream << "\t\t" << (1 << j) << " : \"" << flagname << "\" : 0";
                    if (!entity.flagsdescriptions[j].empty()) {
                        stream << " : \"" << entity.flagsdescriptions[j] << "\"";
                    }
                    stream << '\n';
                }
            }
            stream << "\t]\n";
        }

        stream << "]\n";
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xcd0, %rsp            # imm = 0xCD0
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq -0x8(%rbp), %rdi
leaq 0x107d2(%rip), %rsi     # 0x15004
callq 0x4310
movq %rax, %rdi
leaq 0x107db(%rip), %rsi     # 0x1501c
callq 0x4310
movq %rax, %rdi
leaq 0x107d0(%rip), %rsi     # 0x15020
callq 0x4310
movq $0x0, -0x20(%rbp)
movq -0x20(%rbp), %rax
movq %rax, -0xaa0(%rbp)
movq -0x10(%rbp), %rdi
callq 0x7140
movq %rax, %rcx
movq -0xaa0(%rbp), %rax
cmpq %rcx, %rax
jae 0x5bcd
movq -0x10(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x7170
movq %rax, %rsi
leaq -0x8c0(%rbp), %rdi
callq 0x7190
testb $0x1, -0x44(%rbp)
je 0x48d4
movq -0x8(%rbp), %rdi
leaq 0x10772(%rip), %rsi     # 0x15023
callq 0x4310
jmp 0x48b8
jmp 0x527f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x8c8(%rbp)
movl %eax, -0x8cc(%rbp)
jmp 0x5bbf
movq -0x8(%rbp), %rdi
leaq 0x10751(%rip), %rsi     # 0x15030
callq 0x4310
jmp 0x48e6
movq -0x8(%rbp), %rdi
movl -0x5c(%rbp), %esi
callq 0x45e0
movq %rax, -0xaa8(%rbp)
jmp 0x48fb
movq -0xaa8(%rbp), %rdi
movl $0x20, %esi
callq 0x4410
jmp 0x490e
movq -0x8(%rbp), %rdi
movl -0x58(%rbp), %esi
callq 0x45e0
movq %rax, -0xab0(%rbp)
jmp 0x4923
movq -0xab0(%rbp), %rdi
movl $0x20, %esi
callq 0x4410
jmp 0x4936
movq -0x8(%rbp), %rdi
movl -0x54(%rbp), %esi
callq 0x45e0
movq %rax, -0xab8(%rbp)
jmp 0x494b
movq -0xab8(%rbp), %rdi
leaq 0x106e9(%rip), %rsi     # 0x15042
callq 0x4310
jmp 0x4960
movq -0x8(%rbp), %rdi
movl -0x50(%rbp), %esi
callq 0x45e0
movq %rax, -0xac0(%rbp)
jmp 0x4975
movq -0xac0(%rbp), %rdi
movl $0x20, %esi
callq 0x4410
jmp 0x4988
movq -0x8(%rbp), %rdi
movl -0x4c(%rbp), %esi
callq 0x45e0
movq %rax, -0xac8(%rbp)
jmp 0x499d
movq -0xac8(%rbp), %rdi
movl $0x20, %esi
callq 0x4410
jmp 0x49b0
movq -0x8(%rbp), %rdi
movl -0x48(%rbp), %esi
callq 0x45e0
movq %rax, -0xad0(%rbp)
jmp 0x49c5
movq -0xad0(%rbp), %rdi
movl $0x29, %esi
callq 0x4410
jmp 0x49d8
movq -0x18(%rbp), %rcx
xorl %eax, %eax
testb $0x1, 0xe(%rcx)
movb %al, -0xad1(%rbp)
je 0x4a0c
leaq -0x8c0(%rbp), %rdi
callq 0x5bf0
movb %al, -0xad2(%rbp)
jmp 0x49fe
movb -0xad2(%rbp), %al
movb %al, -0xad1(%rbp)
jmp 0x4a0c
movb -0xad1(%rbp), %al
andb $0x1, %al
movb %al, -0x8cd(%rbp)
testb $0x1, -0x8cd(%rbp)
jne 0x4ae3
movq $0x0, -0x8d8(%rbp)
movq -0x8d8(%rbp), %rax
movq %rax, -0xae0(%rbp)
movq -0x18(%rbp), %rdi
addq $0x10, %rdi
callq 0x7480
movq -0xae0(%rbp), %rcx
movq %rax, %rdx
xorl %eax, %eax
cmpq %rdx, %rcx
movb %al, -0xad3(%rbp)
jae 0x4a72
movb -0x8cd(%rbp), %al
xorb $-0x1, %al
movb %al, -0xad3(%rbp)
movb -0xad3(%rbp), %al
testb $0x1, %al
jne 0x4a7e
jmp 0x4ae1
leaq -0x8c0(%rbp), %rdi
callq 0x4120
movq %rax, -0xaf0(%rbp)
movq -0x18(%rbp), %rdi
addq $0x10, %rdi
movq -0x8d8(%rbp), %rsi
callq 0x74a0
movq -0xaf0(%rbp), %rdi
movq (%rax), %rsi
callq 0x5c90
movb %al, -0xae1(%rbp)
jmp 0x4abc
movb -0xae1(%rbp), %al
andb $0x1, %al
movb %al, -0x8cd(%rbp)
movq -0x8d8(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x8d8(%rbp)
jmp 0x4a32
jmp 0x4ae3
testb $0x1, -0x8cd(%rbp)
je 0x4b3b
movq -0x8(%rbp), %rdi
leaq 0x1054e(%rip), %rsi     # 0x15045
callq 0x4310
movq %rax, -0xaf8(%rbp)
jmp 0x4b05
movq -0xaf8(%rbp), %rdi
movl -0x54(%rbp), %esi
movl %esi, %eax
negl %eax
cmovnsl %eax, %esi
callq 0x45e0
movq %rax, -0xb00(%rbp)
jmp 0x4b24
movq -0xb00(%rbp), %rdi
leaq 0x10f85(%rip), %rsi     # 0x15ab7
callq 0x4310
jmp 0x4b39
jmp 0x4b3b
leaq 0x10510(%rip), %rsi     # 0x15052
leaq -0x8c0(%rbp), %rdi
callq 0x74c0
movb %al, -0xb01(%rbp)
jmp 0x4b56
movb -0xb01(%rbp), %al
testb $0x1, %al
jne 0x4b8c
jmp 0x4b62
leaq 0x104ef(%rip), %rsi     # 0x15058
leaq -0x8c0(%rbp), %rdi
callq 0x74c0
movb %al, -0xb02(%rbp)
jmp 0x4b7d
movb -0xb02(%rbp), %al
testb $0x1, %al
jne 0x4b8c
jmp 0x4dd2
movq -0x8(%rbp), %rdi
leaq 0x104cd(%rip), %rsi     # 0x15064
callq 0x4310
jmp 0x4b9e
leaq -0x8f9(%rbp), %rdi
movq %rdi, -0xb10(%rbp)
callq 0x4600
movq -0xb10(%rbp), %rdx
leaq 0x104d4(%rip), %rsi     # 0x15093
leaq -0x8f8(%rbp), %rdi
callq 0x74f0
jmp 0x4bcd
leaq -0x8c0(%rbp), %rdi
leaq -0x8f8(%rbp), %rsi
callq 0xe130
movb %al, -0xb11(%rbp)
jmp 0x4be8
movb -0xb11(%rbp), %al
xorb $-0x1, %al
movb %al, -0xb12(%rbp)
leaq -0x8f8(%rbp), %rdi
callq 0x41f0
leaq -0x8f9(%rbp), %rdi
callq 0x4390
movb -0xb12(%rbp), %al
testb $0x1, %al
jne 0x4c1d
jmp 0x4dcd
leaq -0x880(%rbp), %rax
movq %rax, -0xb28(%rbp)
leaq -0x981(%rbp), %rdi
movq %rdi, -0xb20(%rbp)
callq 0x4600
movq -0xb20(%rbp), %rdx
leaq 0x10447(%rip), %rsi     # 0x15093
leaq -0x980(%rbp), %rdi
callq 0x74f0
jmp 0x4c5a
leaq -0x9a9(%rbp), %rdi
movq %rdi, -0xb30(%rbp)
callq 0x4600
movq -0xb30(%rbp), %rdx
leaq 0x1041f(%rip), %rsi     # 0x1509a
leaq -0x9a8(%rbp), %rdi
callq 0x74f0
jmp 0x4c89
leaq -0x960(%rbp), %rdi
leaq -0x980(%rbp), %rsi
leaq -0x9a8(%rbp), %rdx
callq 0xdf00
jmp 0x4ca5
movq -0xb28(%rbp), %rdi
leaq -0x960(%rbp), %rsi
callq 0x75a0
jmp 0x4cba
leaq -0x960(%rbp), %rdi
callq 0x75d0
leaq -0x9a8(%rbp), %rdi
callq 0x41f0
leaq -0x9a9(%rbp), %rdi
callq 0x4390
leaq -0x980(%rbp), %rdi
callq 0x41f0
leaq -0x981(%rbp), %rdi
callq 0x4390
jmp 0x4dcd
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x8c8(%rbp)
movl %eax, -0x8cc(%rbp)
jmp 0x4d2d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x8c8(%rbp)
movl %eax, -0x8cc(%rbp)
leaq -0x8f8(%rbp), %rdi
callq 0x41f0
leaq -0x8f9(%rbp), %rdi
callq 0x4390
jmp 0x5bbf
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x8c8(%rbp)
movl %eax, -0x8cc(%rbp)
jmp 0x4dbc
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x8c8(%rbp)
movl %eax, -0x8cc(%rbp)
jmp 0x4da4
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x8c8(%rbp)
movl %eax, -0x8cc(%rbp)
jmp 0x4d98
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x8c8(%rbp)
movl %eax, -0x8cc(%rbp)
leaq -0x960(%rbp), %rdi
callq 0x75d0
leaq -0x9a8(%rbp), %rdi
callq 0x41f0
leaq -0x9a9(%rbp), %rdi
callq 0x4390
leaq -0x980(%rbp), %rdi
callq 0x41f0
leaq -0x981(%rbp), %rdi
callq 0x4390
jmp 0x5bbf
jmp 0x527d
movq -0x8(%rbp), %rdi
leaq 0x102df(%rip), %rsi     # 0x150bc
callq 0x4310
movq %rax, -0xb38(%rbp)
jmp 0x4deb
movq -0xb38(%rbp), %rdi
movl -0x68(%rbp), %esi
callq 0x44a0
movq %rax, -0xb40(%rbp)
jmp 0x4e03
movq -0xb40(%rbp), %rdi
movl $0x20, %esi
callq 0x4410
movq %rax, -0xb48(%rbp)
jmp 0x4e1d
movq -0xb48(%rbp), %rdi
movl -0x64(%rbp), %esi
callq 0x44a0
movq %rax, -0xb50(%rbp)
jmp 0x4e35
movq -0xb50(%rbp), %rdi
movl $0x20, %esi
callq 0x4410
movq %rax, -0xb58(%rbp)
jmp 0x4e4f
movq -0xb58(%rbp), %rdi
movl -0x60(%rbp), %esi
callq 0x44a0
movq %rax, -0xb60(%rbp)
jmp 0x4e67
movq -0xb60(%rbp), %rdi
leaq 0x1025b(%rip), %rsi     # 0x150d0
callq 0x4310
jmp 0x4e7c
movq -0x18(%rbp), %rax
testb $0x1, 0xc(%rax)
je 0x505f
movq -0x18(%rbp), %rcx
xorl %eax, %eax
testb $0x1, 0xd(%rcx)
movb %al, -0xb61(%rbp)
je 0x4ebe
leaq -0x8c0(%rbp), %rdi
callq 0x5e00
movb %al, -0xb62(%rbp)
jmp 0x4eb0
movb -0xb62(%rbp), %al
movb %al, -0xb61(%rbp)
jmp 0x4ebe
movb -0xb61(%rbp), %al
andb $0x1, %al
movb %al, -0x9aa(%rbp)
testb $0x1, -0x9aa(%rbp)
jne 0x4f95
movq $0x0, -0x9b8(%rbp)
movq -0x9b8(%rbp), %rax
movq %rax, -0xb70(%rbp)
movq -0x18(%rbp), %rdi
addq $0x28, %rdi
callq 0x7480
movq -0xb70(%rbp), %rcx
movq %rax, %rdx
xorl %eax, %eax
cmpq %rdx, %rcx
movb %al, -0xb63(%rbp)
jae 0x4f24
movb -0x9aa(%rbp), %al
xorb $-0x1, %al
movb %al, -0xb63(%rbp)
movb -0xb63(%rbp), %al
testb $0x1, %al
jne 0x4f30
jmp 0x4f93
leaq -0x8c0(%rbp), %rdi
callq 0x4120
movq %rax, -0xb80(%rbp)
movq -0x18(%rbp), %rdi
addq $0x28, %rdi
movq -0x9b8(%rbp), %rsi
callq 0x74a0
movq -0xb80(%rbp), %rdi
movq (%rax), %rsi
callq 0x5c90
movb %al, -0xb71(%rbp)
jmp 0x4f6e
movb -0xb71(%rbp), %al
andb $0x1, %al
movb %al, -0x9aa(%rbp)
movq -0x9b8(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x9b8(%rbp)
jmp 0x4ee4
jmp 0x4f95
testb $0x1, -0x9aa(%rbp)
je 0x505d
movq -0x8(%rbp), %rdi
leaq 0x10117(%rip), %rsi     # 0x150c4
callq 0x4310
movq %rax, -0xb88(%rbp)
jmp 0x4fbb
movq -0xb88(%rbp), %rdi
movq -0x18(%rbp), %rax
movl (%rax), %esi
callq 0x45e0
movq %rax, -0xb90(%rbp)
jmp 0x4fd6
movq -0xb90(%rbp), %rdi
leaq 0x100e9(%rip), %rsi     # 0x150cd
callq 0x4310
movq %rax, -0xb98(%rbp)
jmp 0x4ff2
movq -0xb98(%rbp), %rdi
movq -0x18(%rbp), %rax
movl 0x4(%rax), %esi
callq 0x45e0
movq %rax, -0xba0(%rbp)
jmp 0x500e
movq -0xba0(%rbp), %rdi
leaq 0x100b1(%rip), %rsi     # 0x150cd
callq 0x4310
movq %rax, -0xba8(%rbp)
jmp 0x502a
movq -0xba8(%rbp), %rdi
movq -0x18(%rbp), %rax
movl 0x8(%rax), %esi
callq 0x45e0
movq %rax, -0xbb0(%rbp)
jmp 0x5046
movq -0xbb0(%rbp), %rdi
leaq 0x1007b(%rip), %rsi     # 0x150cf
callq 0x4310
jmp 0x505b
jmp 0x505d
jmp 0x505f
leaq -0x8c0(%rbp), %rdi
addq $0x40, %rdi
callq 0x7610
movq %rax, -0x9c8(%rbp)
leaq -0x9c0(%rbp), %rdi
leaq -0x9c8(%rbp), %rsi
callq 0x7640
leaq -0x8c0(%rbp), %rdi
addq $0x40, %rdi
callq 0x76c0
movq %rax, -0x9d0(%rbp)
leaq -0x9c0(%rbp), %rdi
leaq -0x9d0(%rbp), %rsi
callq 0x7680
testb $0x1, %al
jne 0x50bc
jmp 0x5141
leaq -0x9c0(%rbp), %rdi
callq 0x76f0
movq %rax, %rdi
leaq 0x10001(%rip), %rsi     # 0x150d3
callq 0x74c0
movb %al, -0xbb1(%rbp)
jmp 0x50df
movb -0xbb1(%rbp), %al
testb $0x1, %al
jne 0x511a
jmp 0x50eb
leaq -0x9c0(%rbp), %rdi
callq 0x76f0
movq %rax, %rdi
leaq 0xffd8(%rip), %rsi      # 0x150d9
callq 0x74c0
movb %al, -0xbb2(%rbp)
jmp 0x510e
movb -0xbb2(%rbp), %al
testb $0x1, %al
jne 0x511a
jmp 0x512e
movq -0x8(%rbp), %rdi
leaq 0xffbb(%rip), %rsi      # 0x150e0
callq 0x4310
jmp 0x512c
jmp 0x5141
jmp 0x5130
leaq -0x9c0(%rbp), %rdi
callq 0x7710
jmp 0x5089
leaq -0x8c0(%rbp), %rdi
addq $0x880, %rdi            # imm = 0x880
callq 0x45a0
testb $0x1, %al
jne 0x51a4
movq -0x8(%rbp), %rdi
leaq 0xff8b(%rip), %rsi      # 0x150ee
callq 0x4310
movq %rax, -0xbc0(%rbp)
jmp 0x5171
movq -0xbc0(%rbp), %rdi
leaq -0x40(%rbp), %rsi
callq 0x42e0
movq %rax, -0xbc8(%rbp)
jmp 0x518a
movq -0xbc8(%rbp), %rdi
leaq 0xff5f(%rip), %rsi      # 0x150f7
callq 0x4310
jmp 0x519f
jmp 0x527b
movq $0x0, -0x9d8(%rbp)
movq -0x9d8(%rbp), %rax
movq %rax, -0xbd0(%rbp)
leaq -0x8c0(%rbp), %rdi
addq $0x40, %rdi
callq 0x7730
movq %rax, %rcx
movq -0xbd0(%rbp), %rax
cmpq %rcx, %rax
jae 0x5279
leaq -0x880(%rbp), %rdi
movq -0x9d8(%rbp), %rsi
callq 0x7760
movq %rax, %rdi
leaq 0xfefe(%rip), %rsi      # 0x150fb
callq 0x74c0
movb %al, -0xbd1(%rbp)
jmp 0x520a
movb -0xbd1(%rbp), %al
testb $0x1, %al
jne 0x524c
jmp 0x5216
leaq -0x880(%rbp), %rdi
movq -0x9d8(%rbp), %rsi
callq 0x7760
movq %rax, %rdi
leaq 0xfece(%rip), %rsi      # 0x15101
callq 0x74c0
movb %al, -0xbd2(%rbp)
jmp 0x5240
movb -0xbd2(%rbp), %al
testb $0x1, %al
jne 0x524c
jmp 0x5260
movq -0x8(%rbp), %rdi
leaq 0xfeb1(%rip), %rsi      # 0x15108
callq 0x4310
jmp 0x525e
jmp 0x5279
jmp 0x5262
movq -0x9d8(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x9d8(%rbp)
jmp 0x51af
jmp 0x527b
jmp 0x527d
jmp 0x527f
movq -0x8(%rbp), %rdi
leaq 0xfe88(%rip), %rsi      # 0x15112
callq 0x4310
movq %rax, -0xbe0(%rbp)
jmp 0x5298
movq -0xbe0(%rbp), %rdi
leaq -0x8c0(%rbp), %rsi
callq 0x42e0
jmp 0x52ad
leaq -0x8c0(%rbp), %rdi
addq $0x20, %rdi
callq 0x45a0
testb $0x1, %al
jne 0x54c2
movq $0x7ff, -0x9e0(%rbp) # imm = 0x7FF
leaq -0x8c0(%rbp), %rdi
addq $0x20, %rdi
callq 0x4240
cmpq $0x7ff, %rax            # imm = 0x7FF
jbe 0x5474
movq -0x8(%rbp), %rdi
leaq 0xfe1e(%rip), %rsi      # 0x15115
callq 0x4310
movq %rax, -0xbe8(%rbp)
jmp 0x5305
leaq -0x8a0(%rbp), %rsi
xorl %eax, %eax
movl %eax, %edx
leaq -0xa00(%rbp), %rdi
movl $0x7ff, %ecx            # imm = 0x7FF
callq 0x4360
jmp 0x5323
movq -0xbe8(%rbp), %rdi
leaq -0xa00(%rbp), %rsi
callq 0x42e0
movq %rax, -0xbf0(%rbp)
jmp 0x533f
movq -0xbf0(%rbp), %rdi
leaq 0xfdd0(%rip), %rsi      # 0x1511d
callq 0x4310
jmp 0x5354
leaq -0xa00(%rbp), %rdi
callq 0x41f0
movq $0x7ff, -0xa08(%rbp) # imm = 0x7FF
movq -0xa08(%rbp), %rax
movq %rax, -0xbf8(%rbp)
leaq -0x8c0(%rbp), %rdi
addq $0x20, %rdi
callq 0x4240
movq %rax, %rcx
movq -0xbf8(%rbp), %rax
cmpq %rcx, %rax
ja 0x5472
movq -0x8(%rbp), %rdi
leaq 0xfd73(%rip), %rsi      # 0x1511a
callq 0x4310
movq %rax, -0xc00(%rbp)
jmp 0x53b5
leaq -0x8a0(%rbp), %rsi
movq -0xa08(%rbp), %rdx
leaq -0xa28(%rbp), %rdi
movl $0x7ff, %ecx            # imm = 0x7FF
callq 0x4360
jmp 0x53d6
movq -0xc00(%rbp), %rdi
leaq -0xa28(%rbp), %rsi
callq 0x42e0
movq %rax, -0xc08(%rbp)
jmp 0x53f2
movq -0xc08(%rbp), %rdi
leaq 0xfd1d(%rip), %rsi      # 0x1511d
callq 0x4310
jmp 0x5407
leaq -0xa28(%rbp), %rdi
callq 0x41f0
movq -0xa08(%rbp), %rax
addq $0x7ff, %rax            # imm = 0x7FF
movq %rax, -0xa08(%rbp)
jmp 0x536b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x8c8(%rbp)
movl %eax, -0x8cc(%rbp)
leaq -0xa00(%rbp), %rdi
callq 0x41f0
jmp 0x5bbf
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x8c8(%rbp)
movl %eax, -0x8cc(%rbp)
leaq -0xa28(%rbp), %rdi
callq 0x41f0
jmp 0x5bbf
jmp 0x54c0
movq -0x8(%rbp), %rdi
leaq 0xfc96(%rip), %rsi      # 0x15115
callq 0x4310
movq %rax, -0xc10(%rbp)
jmp 0x548d
movq -0xc10(%rbp), %rdi
leaq -0x8a0(%rbp), %rsi
callq 0x42e0
movq %rax, -0xc18(%rbp)
jmp 0x54a9
movq -0xc18(%rbp), %rdi
leaq 0xfc66(%rip), %rsi      # 0x1511d
callq 0x4310
jmp 0x54be
jmp 0x54c0
jmp 0x54c2
movq -0x8(%rbp), %rdi
leaq 0xfb54(%rip), %rsi      # 0x15021
callq 0x4310
jmp 0x54d4
movq -0x8(%rbp), %rdi
leaq 0xfcee(%rip), %rsi      # 0x151cd
callq 0x4310
jmp 0x54e6
movq $0x0, -0xa30(%rbp)
movq -0xa30(%rbp), %rax
movq %rax, -0xc20(%rbp)
leaq -0x8c0(%rbp), %rdi
addq $0x40, %rdi
callq 0x7730
movq %rax, %rcx
movq -0xc20(%rbp), %rax
cmpq %rcx, %rax
jae 0x5878
leaq -0x880(%rbp), %rdi
movq -0xa30(%rbp), %rsi
callq 0x7760
movq %rax, -0xa38(%rbp)
movq -0x8(%rbp), %rdi
leaq 0xfc8a(%rip), %rsi      # 0x151d1
callq 0x4310
movq %rax, -0xc28(%rbp)
jmp 0x5555
movq -0xc28(%rbp), %rdi
movq -0xa38(%rbp), %rsi
callq 0x42e0
jmp 0x556a
movq -0xa38(%rbp), %rdi
leaq 0xfba7(%rip), %rsi      # 0x1511f
callq 0x74c0
movb %al, -0xc29(%rbp)
jmp 0x5585
movb -0xc29(%rbp), %al
testb $0x1, %al
jne 0x5591
jmp 0x55a8
movq -0x8(%rbp), %rdi
leaq 0xfb8a(%rip), %rsi      # 0x15126
callq 0x4310
jmp 0x55a3
jmp 0x57ff
movq -0xa38(%rbp), %rdi
leaq 0xfb93(%rip), %rsi      # 0x15149
callq 0x74c0
movb %al, -0xc2a(%rbp)
jmp 0x55c3
movb -0xc2a(%rbp), %al
testb $0x1, %al
jne 0x55cf
jmp 0x55e6
movq -0x8(%rbp), %rdi
leaq 0xfb7a(%rip), %rsi      # 0x15154
callq 0x4310
jmp 0x55e1
jmp 0x57fd
movq -0xa38(%rbp), %rdi
leaq 0xfa9f(%rip), %rsi      # 0x15093
callq 0x74c0
movb %al, -0xc2b(%rbp)
jmp 0x5601
movb -0xc2b(%rbp), %al
testb $0x1, %al
jne 0x560d
jmp 0x5624
movq -0x8(%rbp), %rdi
leaq 0xfb58(%rip), %rsi      # 0x15170
callq 0x4310
jmp 0x561f
jmp 0x57fb
movq -0xa38(%rbp), %rdi
leaq 0xfac9(%rip), %rsi      # 0x150fb
callq 0x74c0
movb %al, -0xc2c(%rbp)
jmp 0x563f
movb -0xc2c(%rbp), %al
testb $0x1, %al
jne 0x5672
jmp 0x564b
movq -0xa38(%rbp), %rdi
leaq 0xfaa8(%rip), %rsi      # 0x15101
callq 0x74c0
movb %al, -0xc2d(%rbp)
jmp 0x5666
movb -0xc2d(%rbp), %al
testb $0x1, %al
jne 0x5672
jmp 0x5689
movq -0x8(%rbp), %rdi
leaq 0xfb19(%rip), %rsi      # 0x15196
callq 0x4310
jmp 0x5684
jmp 0x57f9
movq -0xa38(%rbp), %rsi
leaq -0xa58(%rbp), %rdi
callq 0x4130
jmp 0x569e
leaq -0xa58(%rbp), %rdi
callq 0x45a0
testb $0x1, %al
jne 0x5729
xorl %eax, %eax
movl %eax, %esi
leaq -0xa58(%rbp), %rdi
callq 0x4660
movq %rax, -0xc38(%rbp)
jmp 0x56c7
movq -0xc38(%rbp), %rax
movsbl (%rax), %edi
callq 0x4630
movb %al, -0xc41(%rbp)
xorl %eax, %eax
movl %eax, %esi
leaq -0xa58(%rbp), %rdi
callq 0x4660
movq %rax, -0xc40(%rbp)
jmp 0x56f5
movq -0xc40(%rbp), %rax
movb -0xc41(%rbp), %cl
movb %cl, (%rax)
jmp 0x5729
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x8c8(%rbp)
movl %eax, -0x8cc(%rbp)
leaq -0xa58(%rbp), %rdi
callq 0x41f0
jmp 0x5bbf
movq -0xa38(%rbp), %rdi
addq $0x40, %rdi
callq 0x45a0
testb $0x1, %al
jne 0x573f
jmp 0x5753
movq -0x8(%rbp), %rdi
leaq 0xfa62(%rip), %rsi      # 0x151ac
callq 0x4310
jmp 0x5751
jmp 0x57a3
movq -0x8(%rbp), %rdi
leaq 0xf8e2(%rip), %rsi      # 0x15040
callq 0x4310
movq %rax, -0xc50(%rbp)
jmp 0x576c
movq -0xc50(%rbp), %rdi
movq -0xa38(%rbp), %rsi
addq $0x40, %rsi
callq 0x42e0
movq %rax, -0xc58(%rbp)
jmp 0x578c
movq -0xc58(%rbp), %rdi
leaq 0x1031d(%rip), %rsi     # 0x15ab7
callq 0x4310
jmp 0x57a1
jmp 0x57a3
movq -0x8(%rbp), %rdi
leaq 0xf9e4(%rip), %rsi      # 0x15192
callq 0x4310
movq %rax, -0xc60(%rbp)
jmp 0x57bc
movq -0xc60(%rbp), %rdi
leaq -0xa58(%rbp), %rsi
callq 0x42e0
movq %rax, -0xc68(%rbp)
jmp 0x57d8
movq -0xc68(%rbp), %rdi
leaq 0xf984(%rip), %rsi      # 0x1516a
callq 0x4310
jmp 0x57ed
leaq -0xa58(%rbp), %rdi
callq 0x41f0
jmp 0x57fb
jmp 0x57fd
jmp 0x57ff
movq -0x8(%rbp), %rdi
leaq 0xf913(%rip), %rsi      # 0x1511d
callq 0x4310
movq %rax, -0xc70(%rbp)
jmp 0x5818
movq -0xc70(%rbp), %rdi
movq -0xa38(%rbp), %rsi
addq $0x20, %rsi
callq 0x42e0
movq %rax, -0xc78(%rbp)
jmp 0x5838
movq -0xc78(%rbp), %rdi
leaq 0xf8d7(%rip), %rsi      # 0x1511d
callq 0x4310
jmp 0x584d
movq -0x8(%rbp), %rdi
leaq 0xf7c9(%rip), %rsi      # 0x15021
callq 0x4310
jmp 0x585f
jmp 0x5861
movq -0xa30(%rbp), %rax
addq $0x1, %rax
movq %rax, -0xa30(%rbp)
jmp 0x54f1
movb $0x0, -0xa59(%rbp)
movq $0x0, -0xa68(%rbp)
xorl %eax, %eax
cmpq $0x20, -0xa68(%rbp)
movb %al, -0xc79(%rbp)
jae 0x58aa
movb -0xa59(%rbp), %al
xorb $-0x1, %al
movb %al, -0xc79(%rbp)
movb -0xc79(%rbp), %al
testb $0x1, %al
jne 0x58b6
jmp 0x58f5
leaq -0x8c0(%rbp), %rdi
addq $0x58, %rdi
movq -0xa68(%rbp), %rax
shlq $0x5, %rax
addq %rax, %rdi
callq 0x45a0
testb $0x1, %al
jne 0x58df
movb $0x1, -0xa59(%rbp)
jmp 0x58e1
movq -0xa68(%rbp), %rax
addq $0x1, %rax
movq %rax, -0xa68(%rbp)
jmp 0x588a
testb $0x1, -0xa59(%rbp)
je 0x5b90
movq -0x8(%rbp), %rdi
leaq 0xf8a8(%rip), %rsi      # 0x151b5
callq 0x4310
jmp 0x5914
movq -0x8(%rbp), %rdi
leaq 0xf8ad(%rip), %rsi      # 0x151cc
callq 0x4310
jmp 0x5926
movq $0x0, -0xa70(%rbp)
cmpq $0x20, -0xa70(%rbp)
jae 0x5b7c
movq -0xa70(%rbp), %rax
shlq $0x5, %rax
leaq -0x868(%rbp,%rax), %rsi
leaq -0xa90(%rbp), %rdi
callq 0x4130
jmp 0x5960
movq $0x0, -0xa98(%rbp)
movq -0xa98(%rbp), %rax
movq %rax, -0xc88(%rbp)
leaq -0xa90(%rbp), %rdi
callq 0x4240
movq %rax, %rcx
movq -0xc88(%rbp), %rax
cmpq %rcx, %rax
jae 0x5a2e
movq -0xa98(%rbp), %rsi
leaq -0xa90(%rbp), %rdi
callq 0x4660
movq %rax, -0xc90(%rbp)
jmp 0x59b4
movq -0xc90(%rbp), %rax
movsbl (%rax), %edi
callq 0x4510
movb %al, -0xc99(%rbp)
movq -0xa98(%rbp), %rsi
leaq -0xa90(%rbp), %rdi
callq 0x4660
movq %rax, -0xc98(%rbp)
jmp 0x59e5
movq -0xc98(%rbp), %rax
movb -0xc99(%rbp), %cl
movb %cl, (%rax)
movq -0xa98(%rbp), %rax
addq $0x1, %rax
movq %rax, -0xa98(%rbp)
jmp 0x596b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x8c8(%rbp)
movl %eax, -0x8cc(%rbp)
leaq -0xa90(%rbp), %rdi
callq 0x41f0
jmp 0x5bbf
leaq -0xa90(%rbp), %rdi
callq 0x45a0
testb $0x1, %al
jne 0x5b59
movq -0x8(%rbp), %rdi
leaq 0xf783(%rip), %rsi      # 0x151d0
callq 0x4310
movq %rax, -0xca8(%rbp)
jmp 0x5a5b
movq -0xca8(%rbp), %rdi
movb -0xa70(%rbp), %cl
movl $0x1, %esi
shll %cl, %esi
callq 0x45e0
movq %rax, -0xcb0(%rbp)
jmp 0x5a7d
movq -0xcb0(%rbp), %rdi
leaq 0xf68a(%rip), %rsi      # 0x15115
callq 0x4310
movq %rax, -0xcb8(%rbp)
jmp 0x5a99
movq -0xcb8(%rbp), %rdi
leaq -0xa90(%rbp), %rsi
callq 0x42e0
movq %rax, -0xcc0(%rbp)
jmp 0x5ab5
movq -0xcc0(%rbp), %rdi
leaq 0xf710(%rip), %rsi      # 0x151d3
callq 0x4310
jmp 0x5aca
leaq -0x8c0(%rbp), %rdi
addq $0x458, %rdi            # imm = 0x458
movq -0xa70(%rbp), %rax
shlq $0x5, %rax
addq %rax, %rdi
callq 0x45a0
testb $0x1, %al
jne 0x5b47
movq -0x8(%rbp), %rdi
leaq 0xf61b(%rip), %rsi      # 0x15115
callq 0x4310
movq %rax, -0xcc8(%rbp)
jmp 0x5b08
movq -0xcc8(%rbp), %rdi
movq -0xa70(%rbp), %rax
shlq $0x5, %rax
leaq -0x468(%rbp,%rax), %rsi
callq 0x42e0
movq %rax, -0xcd0(%rbp)
jmp 0x5b30
movq -0xcd0(%rbp), %rdi
leaq 0xf5df(%rip), %rsi      # 0x1511d
callq 0x4310
jmp 0x5b45
jmp 0x5b47
movq -0x8(%rbp), %rdi
movl $0xa, %esi
callq 0x4410
jmp 0x5b57
jmp 0x5b59
leaq -0xa90(%rbp), %rdi
callq 0x41f0
movq -0xa70(%rbp), %rax
addq $0x1, %rax
movq %rax, -0xa70(%rbp)
jmp 0x5931
movq -0x8(%rbp), %rdi
leaq 0xf652(%rip), %rsi      # 0x151d9
callq 0x4310
jmp 0x5b8e
jmp 0x5b90
movq -0x8(%rbp), %rdi
leaq 0xf63f(%rip), %rsi      # 0x151da
callq 0x4310
jmp 0x5ba2
leaq -0x8c0(%rbp), %rdi
callq 0x7780
movq -0x20(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x20(%rbp)
jmp 0x485d
leaq -0x8c0(%rbp), %rdi
callq 0x7780
jmp 0x5bd6
addq $0xcd0, %rsp            # imm = 0xCD0
popq %rbp
retq
movq -0x8c8(%rbp), %rdi
callq 0x45f0
nopw %cs:(%rax,%rax)