// File: /workspace/github_c_makefile_star2_O0/sharmaeklavya2[P]cerplag/codegen.c
// Function: codegen
void codegen(pAstNode p) {
    if(error_count == 0 && allow_codegen) {
        switch(p->base.node_type) {
            case ASTN_Module: {
                ModuleNode* q = (ModuleNode*)p;
                codegen_chain(q->body, &(q->base.ircode));
                break;
            }

            case ASTN_Var:
            case ASTN_Num:
            case ASTN_RNum:
            case ASTN_Bool:
                break;
            case ASTN_Decl:
            case ASTN_Deref:
                break;

            case ASTN_Assn: {
                AssnNode* q = (AssnNode*)p;
                ircode_copy(&(q->base.ircode), &(q->expr->base.ircode));
                ircode_append(&(q->base.ircode), irinstr_new2(OP_MOV, q->target->base.addr,
                    q->expr->base.addr, NULL));
                break;
            }
            case ASTN_BOp: {
                BOpNode* q = (BOpNode*)p;
                ircode_combine(&(q->base.ircode), &(q->arg1->base.ircode), &(q->arg2->base.ircode));
                ircode_append(&(q->base.ircode), irinstr_new2(q->op, q->base.addr,
                    q->arg1->base.addr, q->arg2->base.addr));
                break;
            }

            case ASTN_UOp: {
                UOpNode* q = (UOpNode*)p;
                ircode_copy(&(q->base.ircode), &(q->arg->base.ircode));
                ircode_append(&(q->base.ircode), irinstr_new2(OP_UMINUS, q->base.addr,
                    q->arg->base.addr, NULL));
                break;
            }
            case ASTN_Output: {
                OutputNode* q = (OutputNode*)p;
                ircode_append(&(q->base.ircode), irinstr_new2(OP_OUTPUT, NULL, q->var->base.addr, NULL));
                break;
            }
            case ASTN_Input: {
                InputNode* q = (InputNode*)p;
                ircode_append(&(q->base.ircode), irinstr_new2(OP_INPUT, q->base.addr, NULL, NULL));
                break;
            }
            case ASTN_For: {
                ForNode* q = (ForNode*)p;
                ircode_append(&(q->base.ircode), irinstr_new2(OP_MOV, q->base.addr, q->beg_addr, NULL));
                IRInstr* beg_instr = irinstr_new3(OP_LABEL, label_counter++);
                IRInstr* end_instr = irinstr_new3(OP_LABEL, label_counter++);
                IRInstr* break_instr = irinstr_new4(OP_JG, NULL, q->base.addr,
                    q->end_addr, end_instr->label);
                IRInstr* loop_instr = irinstr_new3(OP_JUMP, beg_instr->label);

                ircode_append(&(q->base.ircode), beg_instr);
                ircode_append(&(q->base.ircode), break_instr);
                codegen_chain(q->body, &(q->base.ircode));
                ircode_append(&(q->base.ircode), irinstr_new2(OP_INC, q->base.addr, NULL, NULL));
                ircode_append(&(q->base.ircode), loop_instr);
                ircode_append(&(q->base.ircode), end_instr);
                break;
            }
            case ASTN_While: {
                WhileNode* q = (WhileNode*)p;
                IRInstr* beg_instr = irinstr_new3(OP_LABEL, label_counter++);
                IRInstr* end_instr = irinstr_new3(OP_LABEL, label_counter++);
                IRInstr* break_instr = irinstr_new4(OP_JUMP0, NULL, q->cond->base.addr, NULL, end_instr->label);
                IRInstr* loop_instr = irinstr_new3(OP_JUMP, beg_instr->label);

                ircode_append(&(q->base.ircode), beg_instr);
                ircode_combine(&(q->base.ircode), &(q->base.ircode), &(q->cond->base.ircode));
                ircode_append(&(q->base.ircode), break_instr);
                codegen_chain(q->body, &(q->base.ircode));
                ircode_append(&(q->base.ircode), loop_instr);
                ircode_append(&(q->base.ircode), end_instr);
                break;
            }
            case ASTN_Switch: {
                SwitchNode* q = (SwitchNode*)p;
                CaseNode* node;
                if(q->base.addr->type == TYPE_BOOLEAN) {
                    pAstNode true_stmts=NULL, false_stmts=NULL;
                    for(node = q->cases; node != NULL; node = node->next) {
                        bool val = ((BoolNode*)(node->val))->val;
                        if(val) true_stmts = node->stmts;
                        else false_stmts = node->stmts;
                    }
                    IRInstr* label1 = irinstr_new3(OP_LABEL, label_counter++);
                    IRInstr* label2 = irinstr_new3(OP_LABEL, label_counter++);
                    ircode_append(&(q->base.ircode), irinstr_new4(OP_JUMP0,
                        NULL, q->base.addr, NULL, label1->label));
                    codegen_chain(true_stmts, &(q->base.ircode));
                    ircode_append(&(q->base.ircode), irinstr_new3(OP_JUMP, label2->label));
                    ircode_append(&(q->base.ircode), label1);
                    codegen_chain(false_stmts, &(q->base.ircode));
                    ircode_append(&(q->base.ircode), label2);
                }
                else {
                    IRInstr* exit_label = irinstr_new3(OP_LABEL, label_counter++);
                    for(node = q->cases; node != NULL; node = node->next) {
                        IRInstr* label = irinstr_new3(OP_LABEL, label_counter++);
                        ircode_append(&(q->base.ircode), irinstr_new4(OP_JNE,
                            NULL, q->base.addr, node->val->base.addr, label->label));
                        codegen_chain(node->stmts, &(q->base.ircode));
                        ircode_append(&(q->base.ircode), irinstr_new3(OP_JUMP, exit_label->label));
                        ircode_append(&(q->base.ircode), irinstr_new3(OP_LABEL, label->label));
                    }
                    if(q->defaultcase != NULL) {
                        codegen_chain(q->defaultcase->stmts, &(q->base.ircode));
                    }
                    ircode_append(&(q->base.ircode), irinstr_new3(OP_LABEL, exit_label->label));
                }
                break;
            }
            default:
                complain_ast_node_type(__func__, p->base.node_type);
        }
    }
    if(error_count > 0) {
        switch(p->base.node_type) {
            case ASTN_BOp:
                ircode_clear(&(((BOpNode*)p)->arg1->base.ircode));
                ircode_clear(&(((BOpNode*)p)->arg2->base.ircode));
                break;
            case ASTN_UOp:
                ircode_clear(&(((UOpNode*)p)->arg->base.ircode));
                break;
            case ASTN_Deref:
                ircode_clear(&(((DerefNode*)p)->index->base.ircode));
                break;
            case ASTN_Module:
                destroy_code_chain(((ModuleNode*)p)->body);
                break;
            case ASTN_Assn:
                ircode_clear(&(((AssnNode*)p)->target->base.ircode));
                ircode_clear(&(((AssnNode*)p)->expr->base.ircode));
                break;
            case ASTN_While:
                ircode_clear(&(((WhileNode*)p)->cond->base.ircode));
                ircode_clear(&(((WhileNode*)p)->body->base.ircode));
                break;
            case ASTN_For:
                ircode_clear(&(((ForNode*)p)->body->base.ircode));
                break;
            case ASTN_Decl:
                destroy_code_chain((pAstNode)(((DeclNode*)p)->idList));
                break;
            case ASTN_Output:
                ircode_clear(&(((OutputNode*)p)->var->base.ircode));
                break;
            case ASTN_FCall:
                destroy_code_chain((pAstNode)(((FCallNode*)p)->iParamList));
                destroy_code_chain((pAstNode)(((FCallNode*)p)->oParamList));
                break;
            case ASTN_Switch: {
                SwitchNode* q = (SwitchNode*)p;
                if(q->defaultcase != NULL) {
                    ircode_clear(&(q->defaultcase->val->base.ircode));
                    destroy_code_chain(q->defaultcase->stmts);
                }
                CaseNode* node = q->cases;
                while(node != NULL) {
                    destroy_code_chain(node->stmts);
                    ircode_clear(&(node->val->base.ircode));
                    node = node->next;
                }
                break;
            }
            default:
                break;
        }
    }
    /*
    fprintf(stderr, "codegen on node(%s, %d:%d):\n", ASTN_STRS[p->base.node_type], p->base.line, p->base.col);
    ircode_print(&(p->base.ircode), stderr);
    */
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x160, %rsp            # imm = 0x160
movq %rdi, -0x8(%rbp)
leaq 0xda22(%rip), %rax      # 0x1fdd8
cmpl $0x0, (%rax)
jne 0x12bf8
testb $0x1, 0x897a(%rip)      # 0x1ad40
je 0x12bf8
movq -0x8(%rbp), %rax
movl (%rax), %eax
movq %rax, -0xe8(%rbp)
subq $0x12, %rax
ja 0x12be4
movq -0xe8(%rbp), %rax
leaq 0x3b3b(%rip), %rcx      # 0x15f2c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x8(%rbp), %rax
movq %rax, -0x10(%rbp)
movq -0x10(%rbp), %rax
movq 0x58(%rax), %rdi
movq -0x10(%rbp), %rsi
addq $0x20, %rsi
callq 0x12310
jmp 0x12bf6
jmp 0x12bf6
jmp 0x12bf6
movq -0x8(%rbp), %rax
movq %rax, -0x18(%rbp)
movq -0x18(%rbp), %rdi
addq $0x20, %rdi
movq -0x18(%rbp), %rax
movq 0x48(%rax), %rsi
addq $0x20, %rsi
callq 0x10560
movq -0x18(%rbp), %rax
addq $0x20, %rax
movq %rax, -0xf0(%rbp)
movq -0x18(%rbp), %rax
movq 0x40(%rax), %rax
movq 0x18(%rax), %rsi
movq -0x18(%rbp), %rax
movq 0x48(%rax), %rax
movq 0x18(%rax), %rdx
movl $0xc, %edi
xorl %eax, %eax
movl %eax, %ecx
callq 0x101d0
movq -0xf0(%rbp), %rdi
movq %rax, %rsi
callq 0x106d0
jmp 0x12bf6
movq -0x8(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rdi
addq $0x20, %rdi
movq -0x20(%rbp), %rax
movq 0x38(%rax), %rsi
addq $0x20, %rsi
movq -0x20(%rbp), %rax
movq 0x40(%rax), %rdx
addq $0x20, %rdx
callq 0x105a0
movq -0x20(%rbp), %rax
addq $0x20, %rax
movq %rax, -0xf8(%rbp)
movq -0x20(%rbp), %rax
movl 0x48(%rax), %edi
movq -0x20(%rbp), %rax
movq 0x18(%rax), %rsi
movq -0x20(%rbp), %rax
movq 0x38(%rax), %rax
movq 0x18(%rax), %rdx
movq -0x20(%rbp), %rax
movq 0x40(%rax), %rax
movq 0x18(%rax), %rcx
callq 0x101d0
movq -0xf8(%rbp), %rdi
movq %rax, %rsi
callq 0x106d0
jmp 0x12bf6
movq -0x8(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rdi
addq $0x20, %rdi
movq -0x28(%rbp), %rax
movq 0x38(%rax), %rsi
addq $0x20, %rsi
callq 0x10560
movq -0x28(%rbp), %rax
addq $0x20, %rax
movq %rax, -0x100(%rbp)
movq -0x28(%rbp), %rax
movq 0x18(%rax), %rsi
movq -0x28(%rbp), %rax
movq 0x38(%rax), %rax
movq 0x18(%rax), %rdx
movl $0xd, %edi
xorl %eax, %eax
movl %eax, %ecx
callq 0x101d0
movq -0x100(%rbp), %rdi
movq %rax, %rsi
callq 0x106d0
jmp 0x12bf6
movq -0x8(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rax
addq $0x20, %rax
movq %rax, -0x108(%rbp)
movq -0x30(%rbp), %rax
movq 0x40(%rax), %rax
movq 0x18(%rax), %rdx
movl $0xe, %edi
xorl %eax, %eax
movl %eax, %ecx
movq %rcx, %rsi
callq 0x101d0
movq -0x108(%rbp), %rdi
movq %rax, %rsi
callq 0x106d0
jmp 0x12bf6
movq -0x8(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x38(%rbp), %rax
addq $0x20, %rax
movq %rax, -0x110(%rbp)
movq -0x38(%rbp), %rax
movq 0x18(%rax), %rsi
movl $0xf, %edi
xorl %eax, %eax
movl %eax, %ecx
movq %rcx, %rdx
callq 0x101d0
movq -0x110(%rbp), %rdi
movq %rax, %rsi
callq 0x106d0
jmp 0x12bf6
movq -0x8(%rbp), %rax
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rax
addq $0x20, %rax
movq %rax, -0x120(%rbp)
movq -0x40(%rbp), %rax
movq 0x18(%rax), %rsi
movq -0x40(%rbp), %rax
movq 0x50(%rax), %rdx
movl $0xc, %edi
xorl %eax, %eax
movl %eax, %ecx
callq 0x101d0
movq -0x120(%rbp), %rdi
movq %rax, %rsi
callq 0x106d0
movl 0x86fc(%rip), %esi      # 0x1ad44
movl %esi, %eax
addl $0x1, %eax
movl %eax, 0x86f1(%rip)      # 0x1ad44
movl $0x15, %edi
callq 0x10220
movq %rax, -0x48(%rbp)
movl 0x86dd(%rip), %esi      # 0x1ad44
movl %esi, %eax
addl $0x1, %eax
movl %eax, 0x86d2(%rip)      # 0x1ad44
movl $0x15, %edi
callq 0x10220
movq %rax, -0x50(%rbp)
movq -0x40(%rbp), %rax
movq 0x18(%rax), %rdx
movq -0x40(%rbp), %rax
movq 0x58(%rax), %rcx
movq -0x50(%rbp), %rax
movl 0x30(%rax), %r8d
movl $0x11, %edi
xorl %eax, %eax
movl %eax, %esi
callq 0x10260
movq %rax, -0x58(%rbp)
movq -0x48(%rbp), %rax
movl 0x30(%rax), %esi
movl $0x10, %edi
callq 0x10220
movq %rax, -0x60(%rbp)
movq -0x40(%rbp), %rdi
addq $0x20, %rdi
movq -0x48(%rbp), %rsi
callq 0x106d0
movq -0x40(%rbp), %rdi
addq $0x20, %rdi
movq -0x58(%rbp), %rsi
callq 0x106d0
movq -0x40(%rbp), %rax
movq 0x60(%rax), %rdi
movq -0x40(%rbp), %rsi
addq $0x20, %rsi
callq 0x12310
movq -0x40(%rbp), %rax
addq $0x20, %rax
movq %rax, -0x118(%rbp)
movq -0x40(%rbp), %rax
movq 0x18(%rax), %rsi
movl $0x16, %edi
xorl %eax, %eax
movl %eax, %ecx
movq %rcx, %rdx
callq 0x101d0
movq -0x118(%rbp), %rdi
movq %rax, %rsi
callq 0x106d0
movq -0x40(%rbp), %rdi
addq $0x20, %rdi
movq -0x60(%rbp), %rsi
callq 0x106d0
movq -0x40(%rbp), %rdi
addq $0x20, %rdi
movq -0x50(%rbp), %rsi
callq 0x106d0
jmp 0x12bf6
movq -0x8(%rbp), %rax
movq %rax, -0x68(%rbp)
movl 0x85e2(%rip), %esi      # 0x1ad44
movl %esi, %eax
addl $0x1, %eax
movl %eax, 0x85d7(%rip)      # 0x1ad44
movl $0x15, %edi
callq 0x10220
movq %rax, -0x70(%rbp)
movl 0x85c3(%rip), %esi      # 0x1ad44
movl %esi, %eax
addl $0x1, %eax
movl %eax, 0x85b8(%rip)      # 0x1ad44
movl $0x15, %edi
callq 0x10220
movq %rax, -0x78(%rbp)
movq -0x68(%rbp), %rax
movq 0x40(%rax), %rax
movq 0x18(%rax), %rdx
movq -0x78(%rbp), %rax
movl 0x30(%rax), %r8d
movl $0x13, %edi
xorl %eax, %eax
movl %eax, %ecx
movq %rcx, %rsi
callq 0x10260
movq %rax, -0x80(%rbp)
movq -0x70(%rbp), %rax
movl 0x30(%rax), %esi
movl $0x10, %edi
callq 0x10220
movq %rax, -0x88(%rbp)
movq -0x68(%rbp), %rdi
addq $0x20, %rdi
movq -0x70(%rbp), %rsi
callq 0x106d0
movq -0x68(%rbp), %rdi
addq $0x20, %rdi
movq -0x68(%rbp), %rsi
addq $0x20, %rsi
movq -0x68(%rbp), %rax
movq 0x40(%rax), %rdx
addq $0x20, %rdx
callq 0x105a0
movq -0x68(%rbp), %rdi
addq $0x20, %rdi
movq -0x80(%rbp), %rsi
callq 0x106d0
movq -0x68(%rbp), %rax
movq 0x48(%rax), %rdi
movq -0x68(%rbp), %rsi
addq $0x20, %rsi
callq 0x12310
movq -0x68(%rbp), %rdi
addq $0x20, %rdi
movq -0x88(%rbp), %rsi
callq 0x106d0
movq -0x68(%rbp), %rdi
addq $0x20, %rdi
movq -0x78(%rbp), %rsi
callq 0x106d0
jmp 0x12bf6
movq -0x8(%rbp), %rax
movq %rax, -0x90(%rbp)
movq -0x90(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x3, 0x18(%rax)
jne 0x12a2c
movq $0x0, -0xa0(%rbp)
movq $0x0, -0xa8(%rbp)
movq -0x90(%rbp), %rax
movq 0x50(%rax), %rax
movq %rax, -0x98(%rbp)
cmpq $0x0, -0x98(%rbp)
je 0x1290a
movq -0x98(%rbp), %rax
movq 0x40(%rax), %rax
movb 0x38(%rax), %al
andb $0x1, %al
movb %al, -0xa9(%rbp)
testb $0x1, -0xa9(%rbp)
je 0x128e2
movq -0x98(%rbp), %rax
movq 0x48(%rax), %rax
movq %rax, -0xa0(%rbp)
jmp 0x128f4
movq -0x98(%rbp), %rax
movq 0x48(%rax), %rax
movq %rax, -0xa8(%rbp)
jmp 0x128f6
movq -0x98(%rbp), %rax
movq 0x38(%rax), %rax
movq %rax, -0x98(%rbp)
jmp 0x128a5
movl 0x8434(%rip), %esi      # 0x1ad44
movl %esi, %eax
addl $0x1, %eax
movl %eax, 0x8429(%rip)      # 0x1ad44
movl $0x15, %edi
callq 0x10220
movq %rax, -0xb8(%rbp)
movl 0x8412(%rip), %esi      # 0x1ad44
movl %esi, %eax
addl $0x1, %eax
movl %eax, 0x8407(%rip)      # 0x1ad44
movl $0x15, %edi
callq 0x10220
movq %rax, -0xc0(%rbp)
movq -0x90(%rbp), %rax
addq $0x20, %rax
movq %rax, -0x130(%rbp)
movq -0x90(%rbp), %rax
movq 0x18(%rax), %rdx
movq -0xb8(%rbp), %rax
movl 0x30(%rax), %r8d
movl $0x13, %edi
xorl %eax, %eax
movl %eax, %ecx
movq %rcx, %rsi
callq 0x10260
movq -0x130(%rbp), %rdi
movq %rax, %rsi
callq 0x106d0
movq -0xa0(%rbp), %rdi
movq -0x90(%rbp), %rsi
addq $0x20, %rsi
callq 0x12310
movq -0x90(%rbp), %rax
addq $0x20, %rax
movq %rax, -0x128(%rbp)
movq -0xc0(%rbp), %rax
movl 0x30(%rax), %esi
movl $0x10, %edi
callq 0x10220
movq -0x128(%rbp), %rdi
movq %rax, %rsi
callq 0x106d0
movq -0x90(%rbp), %rdi
addq $0x20, %rdi
movq -0xb8(%rbp), %rsi
callq 0x106d0
movq -0xa8(%rbp), %rdi
movq -0x90(%rbp), %rsi
addq $0x20, %rsi
callq 0x12310
movq -0x90(%rbp), %rdi
addq $0x20, %rdi
movq -0xc0(%rbp), %rsi
callq 0x106d0
jmp 0x12be2
movl 0x8312(%rip), %esi      # 0x1ad44
movl %esi, %eax
addl $0x1, %eax
movl %eax, 0x8307(%rip)      # 0x1ad44
movl $0x15, %edi
callq 0x10220
movq %rax, -0xc8(%rbp)
movq -0x90(%rbp), %rax
movq 0x50(%rax), %rax
movq %rax, -0x98(%rbp)
cmpq $0x0, -0x98(%rbp)
je 0x12b80
movl 0x82d0(%rip), %esi      # 0x1ad44
movl %esi, %eax
addl $0x1, %eax
movl %eax, 0x82c5(%rip)      # 0x1ad44
movl $0x15, %edi
callq 0x10220
movq %rax, -0xd0(%rbp)
movq -0x90(%rbp), %rax
addq $0x20, %rax
movq %rax, -0x148(%rbp)
movq -0x90(%rbp), %rax
movq 0x18(%rax), %rdx
movq -0x98(%rbp), %rax
movq 0x40(%rax), %rax
movq 0x18(%rax), %rcx
movq -0xd0(%rbp), %rax
movl 0x30(%rax), %r8d
movl $0x12, %edi
xorl %eax, %eax
movl %eax, %esi
callq 0x10260
movq -0x148(%rbp), %rdi
movq %rax, %rsi
callq 0x106d0
movq -0x98(%rbp), %rax
movq 0x48(%rax), %rdi
movq -0x90(%rbp), %rsi
addq $0x20, %rsi
callq 0x12310
movq -0x90(%rbp), %rax
addq $0x20, %rax
movq %rax, -0x140(%rbp)
movq -0xc8(%rbp), %rax
movl 0x30(%rax), %esi
movl $0x10, %edi
callq 0x10220
movq -0x140(%rbp), %rdi
movq %rax, %rsi
callq 0x106d0
movq -0x90(%rbp), %rax
addq $0x20, %rax
movq %rax, -0x138(%rbp)
movq -0xd0(%rbp), %rax
movl 0x30(%rax), %esi
movl $0x15, %edi
callq 0x10220
movq -0x138(%rbp), %rdi
movq %rax, %rsi
callq 0x106d0
movq -0x98(%rbp), %rax
movq 0x38(%rax), %rax
movq %rax, -0x98(%rbp)
jmp 0x12a60
movq -0x90(%rbp), %rax
cmpq $0x0, 0x48(%rax)
je 0x12bad
movq -0x90(%rbp), %rax
movq 0x48(%rax), %rax
movq 0x48(%rax), %rdi
movq -0x90(%rbp), %rsi
addq $0x20, %rsi
callq 0x12310
movq -0x90(%rbp), %rax
addq $0x20, %rax
movq %rax, -0x150(%rbp)
movq -0xc8(%rbp), %rax
movl 0x30(%rax), %esi
movl $0x15, %edi
callq 0x10220
movq -0x150(%rbp), %rdi
movq %rax, %rsi
callq 0x106d0
jmp 0x12bf6
movq -0x8(%rbp), %rax
movl (%rax), %esi
leaq 0x32b5(%rip), %rdi      # 0x15ea6
callq 0x8de0
jmp 0x12bf8
leaq 0xd1d9(%rip), %rax      # 0x1fdd8
cmpl $0x0, (%rax)
jle 0x12de5
movq -0x8(%rbp), %rax
movl (%rax), %eax
movq %rax, -0x158(%rbp)
subq $0x12, %rax
ja 0x12de1
movq -0x158(%rbp), %rax
leaq 0x334b(%rip), %rcx      # 0x15f78
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x8(%rbp), %rax
movq 0x38(%rax), %rdi
addq $0x20, %rdi
callq 0x10880
movq -0x8(%rbp), %rax
movq 0x40(%rax), %rdi
addq $0x20, %rdi
callq 0x10880
jmp 0x12de3
movq -0x8(%rbp), %rax
movq 0x38(%rax), %rdi
addq $0x20, %rdi
callq 0x10880
jmp 0x12de3
movq -0x8(%rbp), %rax
movq 0x40(%rax), %rdi
addq $0x20, %rdi
callq 0x10880
jmp 0x12de3
movq -0x8(%rbp), %rax
movq 0x58(%rax), %rdi
callq 0x12360
jmp 0x12de3
movq -0x8(%rbp), %rax
movq 0x40(%rax), %rdi
addq $0x20, %rdi
callq 0x10880
movq -0x8(%rbp), %rax
movq 0x48(%rax), %rdi
addq $0x20, %rdi
callq 0x10880
jmp 0x12de3
movq -0x8(%rbp), %rax
movq 0x40(%rax), %rdi
addq $0x20, %rdi
callq 0x10880
movq -0x8(%rbp), %rax
movq 0x48(%rax), %rdi
addq $0x20, %rdi
callq 0x10880
jmp 0x12de3
movq -0x8(%rbp), %rax
movq 0x60(%rax), %rdi
addq $0x20, %rdi
callq 0x10880
jmp 0x12de3
movq -0x8(%rbp), %rax
movq 0x40(%rax), %rdi
callq 0x12360
jmp 0x12de3
movq -0x8(%rbp), %rax
movq 0x40(%rax), %rdi
addq $0x20, %rdi
callq 0x10880
jmp 0x12de3
movq -0x8(%rbp), %rax
movq 0x48(%rax), %rdi
callq 0x12360
movq -0x8(%rbp), %rax
movq 0x50(%rax), %rdi
callq 0x12360
jmp 0x12de3
movq -0x8(%rbp), %rax
movq %rax, -0xd8(%rbp)
movq -0xd8(%rbp), %rax
cmpq $0x0, 0x48(%rax)
je 0x12d8b
movq -0xd8(%rbp), %rax
movq 0x48(%rax), %rax
movq 0x40(%rax), %rdi
addq $0x20, %rdi
callq 0x10880
movq -0xd8(%rbp), %rax
movq 0x48(%rax), %rax
movq 0x48(%rax), %rdi
callq 0x12360
movq -0xd8(%rbp), %rax
movq 0x50(%rax), %rax
movq %rax, -0xe0(%rbp)
cmpq $0x0, -0xe0(%rbp)
je 0x12ddf
movq -0xe0(%rbp), %rax
movq 0x48(%rax), %rdi
callq 0x12360
movq -0xe0(%rbp), %rax
movq 0x40(%rax), %rdi
addq $0x20, %rdi
callq 0x10880
movq -0xe0(%rbp), %rax
movq 0x38(%rax), %rax
movq %rax, -0xe0(%rbp)
jmp 0x12d9d
jmp 0x12de3
jmp 0x12de3
jmp 0x12de5
addq $0x160, %rsp            # imm = 0x160
popq %rbp
retq
nop