// File: /workspace/github_c_makefile_star2_O0/Mithreindeir[P]ewcc/src/frontend/checker.c
// Function: node_check
void node_check(struct node *n, struct symbol_table *scope)
{
	if (!n)
		return;
	switch (n->type) {
	case node_ident:
		TYPE(n) = type_copy(get_type(scope, IDENT(n)));
		if (!TYPE(n)) {
			printf("Use of undeclared or out of scope variables %s\n", IDENT(n));
		}
		break;
	case node_cnum:
		TYPE(n) = type_init(type_datatype);
		TYPE(n)->info.data_type = type_int;
		break;
	case node_unop:
		node_check(UNOP(n)->term, scope);
		if (UNOP(n)->op == o_ref) {
			TYPE(n) = type_init(type_ptr);
			TYPE(n)->next = type_copy(UNOP(n)->term->inf->type);
		} else if (UNOP(n)->op == o_deref) {
			/**/
			int term_t = TYPE(UNOP(n)->term)->type;
			if (term_t != type_ptr && term_t != type_array) {
				printf("Dereferencing variable not of pointer type: ");
				print_type(TYPE(UNOP(n)->term));
				printf("\n");
			}
			TYPE(n) = type_copy(TYPE(UNOP(n)->term)->next);
		} else {
			TYPE(n) = type_copy(TYPE(UNOP(n)->term));
		}
		break;
	case node_binop:
		node_check(BINOP(n)->lhs, scope);
		node_check(BINOP(n)->rhs, scope);
		int favor = NEUTRAL;
		struct type *lt = TYPE(BINOP(n)->lhs), *rt = TYPE(BINOP(n)->rhs);
		/*Cast in binary operations goes to larger size unless it is an assignment, then favor lhs*/
		if (BINOP(n)->op == o_asn) favor = LHS;
		if (!cmp_types(lt, rt)) {
			struct binop *b = BINOP(n);
			if (!implicit_cast(&b->lhs, &b->rhs, favor)) {
				type_error(n, TYPE(BINOP(n)->lhs), TYPE(BINOP(n)->rhs));
			}
		}
		/*Pointer arithmetic check*/
		struct node *v1=NULL, *v2=NULL;
		if (BINOP(n)->lhs && lt && (lt->type == type_ptr || lt->type == type_array)) {
			v1 = BINOP(n)->lhs;
		} if (BINOP(n)->rhs && rt && (rt->type == type_ptr || rt->type == type_array)) {
			v2 = BINOP(n)->rhs;
		}
		/*The only valid operation with two pointers is subtraction*/
		if (v1 && v2 && BINOP(n)->op != o_sub) {
			printf("Invalid pointer arithmetic\n");
			node_debug(n);
			exit(-1);
		}
		if (v1 || v2) {
			if (!v1) {
				v1 = v2;
				v2 = BINOP(n)->lhs;
			} else if (!v2) {
				v2 = BINOP(n)->rhs;
			}
			/*v1 is a pointer*/
			if (BINOP(n)->op != o_add && BINOP(n)->op != o_sub) {
				printf("Invalid pointer arithmetic\n");
				node_debug(n);
				exit(-1);
			}
			/*Syntactic sugar for scaling pointer by their size*/
			//if its a constant, just multiply it
			int psize = resolve_size(TYPE(v1)->next);
			//if its a constant, just multiply it
			if (v2 && v2->type == node_cnum) {
				CNUM(v2) *= psize;
			} else if (psize != 1) {//otherwise add multiplication operation in AST
				union value *s = malloc(sizeof(union value));
				s->cnum = psize;
				struct expr *scale = binop_init(o_mul, node_init(node_cnum, s), v2);
				TYPE(scale) = type_copy(TYPE(v2));
				if (v2 == BINOP(n)->lhs) BINOP(n)->lhs = scale;
				else BINOP(n)->rhs = scale;
			}
		}
		TYPE(n) = type_copy(TYPE(BINOP(n)->lhs));
		break;
	case node_unit:
		for (int i = 0; i < UNIT(n)->num_decls; i++)
			node_check(UNIT(n)->edecls[i], scope);
		break;
	case node_block:
		for (int i = 0; i < BLOCK(n)->num_stmt; i++) {
			node_check(BLOCK(n)->stmt_list[i],
				   BLOCK(n)->scope);
		}
		break;
	case node_func:
		node_check(FUNC(n)->body, scope);
		break;
	case node_return:
		node_check(RET(n), scope);
		break;
	case node_call:
		node_check(CALL(n)->func, scope);
		struct type *ct = TYPE(CALL(n)->func);
		while (ct && ct->type == type_ptr) ct = ct->next;
		if (ct->type != type_fcn) {
			printf("Error: called object ");
			node_debug(n);
			printf(" is not of function or function pointer type\n");
			exit(-1);
		}
		if (ct->info.fcn.paramc != CALL(n)->argc) {
			printf("Number of parameter mismatch\n");
			node_debug(n);
			exit(-1);
		}
		/*Type check parameters*/
		for (int i = 0; i < CALL(n)->argc; i++) {
			node_check(CALL(n)->argv[i], scope);
			struct type *pt = ct->info.fcn.paramt[i];
			if (!cmp_types(pt, TYPE(CALL(n)->argv[i]))) {
				if (!explicit_cast(pt, &CALL(n)->argv[i])) {
					printf("In argument %d:\n", i+1);
					type_error(n, pt, TYPE(CALL(n)->argv[i]));
				}
			}
		}
		TYPE(n) = type_copy(ct->next);
		break;
	case node_cond:
		node_check(COND(n)->condition, scope);
		node_check(COND(n)->body, scope);
		if (COND(n)->otherwise) {
			node_check(COND(n)->otherwise, scope);
		}
		break;
	case node_loop:
		node_check(LOOP(n)->init, scope);
		node_check(LOOP(n)->condition, scope);
		node_check(LOOP(n)->body, scope);
		node_check(LOOP(n)->iter, scope);
		break;
	case node_decl:
		node_check(DECL(n)->initializer, scope);
		if (!DECL(n)->initializer)
			break;
		struct type *dtype = get_type(scope, DECL(n)->ident);
		if (!cmp_types(dtype, TYPE(DECL(n)->initializer))) {
			if (!explicit_cast(dtype, &DECL(n)->initializer)) {
				type_error(n, dtype, TYPE(DECL(n)->initializer));
			}
		}
		break;
	default:
		break;
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x90, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
cmpq $0x0, -0x8(%rbp)
jne 0x8abf
jmp 0x939f
movq -0x8(%rbp), %rax
movl (%rax), %eax
addl $-0x2, %eax
movl %eax, %ecx
movq %rcx, -0x88(%rbp)
subl $0xd, %eax
ja 0x939d
movq -0x88(%rbp), %rax
leaq 0x3bc8(%rip), %rcx      # 0xc6b0
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x10(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rsi
callq 0xae30
movq %rax, %rdi
callq 0xb1f0
movq %rax, %rcx
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, (%rax)
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
cmpq $0x0, (%rax)
jne 0x8b42
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rsi
leaq 0x3c33(%rip), %rdi      # 0xc76e
movb $0x0, %al
callq 0x2060
jmp 0x939f
xorl %edi, %edi
callq 0xb0a0
movq %rax, %rcx
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, (%rax)
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq (%rax), %rax
movl $0x1, (%rax)
jmp 0x939f
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rdi
movq -0x10(%rbp), %rsi
callq 0x8aa0
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
cmpl $0x12, 0x8(%rax)
jne 0x8bda
movl $0x1, %edi
callq 0xb0a0
movq %rax, %rcx
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, (%rax)
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rax
movq 0x10(%rax), %rax
movq (%rax), %rdi
callq 0xb1f0
movq %rax, %rcx
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq (%rax), %rax
movq %rcx, 0x20(%rax)
jmp 0x8c95
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
cmpl $0x13, 0x8(%rax)
jne 0x8c6e
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rax
movq 0x10(%rax), %rax
movq (%rax), %rax
movl 0x18(%rax), %eax
movl %eax, -0x14(%rbp)
cmpl $0x1, -0x14(%rbp)
je 0x8c43
cmpl $0x2, -0x14(%rbp)
je 0x8c43
leaq 0x3b87(%rip), %rdi      # 0xc79e
movb $0x0, %al
callq 0x2060
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rax
movq 0x10(%rax), %rax
movq (%rax), %rdi
callq 0xb460
leaq 0x37b3(%rip), %rdi      # 0xc3ef
movb $0x0, %al
callq 0x2060
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rax
movq 0x10(%rax), %rax
movq (%rax), %rax
movq 0x20(%rax), %rdi
callq 0xb1f0
movq %rax, %rcx
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, (%rax)
jmp 0x8c93
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rax
movq 0x10(%rax), %rax
movq (%rax), %rdi
callq 0xb1f0
movq %rax, %rcx
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, (%rax)
jmp 0x8c95
jmp 0x939f
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rdi
movq -0x10(%rbp), %rsi
callq 0x8aa0
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rdi
movq -0x10(%rbp), %rsi
callq 0x8aa0
movl $0x3, -0x18(%rbp)
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rax
movq 0x10(%rax), %rax
movq (%rax), %rax
movq %rax, -0x20(%rbp)
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rax
movq (%rax), %rax
movq %rax, -0x28(%rbp)
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
cmpl $0x18, 0x10(%rax)
jne 0x8d0c
movl $0x0, -0x18(%rbp)
movq -0x20(%rbp), %rdi
movq -0x28(%rbp), %rsi
callq 0xb5e0
cmpl $0x0, %eax
jne 0x8d73
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rdi
movq -0x30(%rbp), %rsi
addq $0x8, %rsi
movl -0x18(%rbp), %edx
callq 0x88e0
cmpl $0x0, %eax
jne 0x8d71
movq -0x8(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rax
movq 0x10(%rax), %rax
movq (%rax), %rsi
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rax
movq (%rax), %rdx
callq 0x87d0
jmp 0x8d73
movq $0x0, -0x38(%rbp)
movq $0x0, -0x40(%rbp)
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
cmpq $0x0, (%rax)
je 0x8dbb
cmpq $0x0, -0x20(%rbp)
je 0x8dbb
movq -0x20(%rbp), %rax
cmpl $0x1, 0x18(%rax)
je 0x8dac
movq -0x20(%rbp), %rax
cmpl $0x2, 0x18(%rax)
jne 0x8dbb
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rax
movq %rax, -0x38(%rbp)
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
cmpq $0x0, 0x8(%rax)
je 0x8df5
cmpq $0x0, -0x28(%rbp)
je 0x8df5
movq -0x28(%rbp), %rax
cmpl $0x1, 0x18(%rax)
je 0x8de5
movq -0x28(%rbp), %rax
cmpl $0x2, 0x18(%rax)
jne 0x8df5
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x40(%rbp)
cmpq $0x0, -0x38(%rbp)
je 0x8e32
cmpq $0x0, -0x40(%rbp)
je 0x8e32
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
cmpl $0x1, 0x10(%rax)
je 0x8e32
leaq 0x39b3(%rip), %rdi      # 0xc7cb
movb $0x0, %al
callq 0x2060
movq -0x8(%rbp), %rdi
callq 0x29f0
movl $0xffffffff, %edi       # imm = 0xFFFFFFFF
callq 0x2100
cmpq $0x0, -0x38(%rbp)
jne 0x8e44
cmpq $0x0, -0x40(%rbp)
je 0x8f95
cmpq $0x0, -0x38(%rbp)
jne 0x8e64
movq -0x40(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rax
movq %rax, -0x40(%rbp)
jmp 0x8e7d
cmpq $0x0, -0x40(%rbp)
jne 0x8e7b
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x40(%rbp)
jmp 0x8e7d
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
cmpl $0x0, 0x10(%rax)
je 0x8eba
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
cmpl $0x1, 0x10(%rax)
je 0x8eba
leaq 0x392b(%rip), %rdi      # 0xc7cb
movb $0x0, %al
callq 0x2060
movq -0x8(%rbp), %rdi
callq 0x29f0
movl $0xffffffff, %edi       # imm = 0xFFFFFFFF
callq 0x2100
movq -0x38(%rbp), %rax
movq 0x10(%rax), %rax
movq (%rax), %rax
movq 0x20(%rax), %rdi
callq 0xb380
movl %eax, -0x44(%rbp)
cmpq $0x0, -0x40(%rbp)
je 0x8ef9
movq -0x40(%rbp), %rax
cmpl $0x4, (%rax)
jne 0x8ef9
movslq -0x44(%rbp), %rcx
movq -0x40(%rbp), %rax
movq 0x8(%rax), %rax
imulq (%rax), %rcx
movq %rcx, (%rax)
jmp 0x8f93
cmpl $0x1, -0x44(%rbp)
je 0x8f91
movl $0x8, %edi
callq 0x20e0
movq %rax, -0x50(%rbp)
movslq -0x44(%rbp), %rcx
movq -0x50(%rbp), %rax
movq %rcx, (%rax)
movq -0x50(%rbp), %rsi
movl $0x4, %edi
callq 0x75d0
movq %rax, %rsi
movq -0x40(%rbp), %rdx
movl $0x2, %edi
callq 0x7d50
movq %rax, -0x58(%rbp)
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rax
movq (%rax), %rdi
callq 0xb1f0
movq %rax, %rcx
movq -0x58(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, (%rax)
movq -0x40(%rbp), %rax
movq -0x8(%rbp), %rcx
movq 0x8(%rcx), %rcx
cmpq (%rcx), %rax
jne 0x8f7f
movq -0x58(%rbp), %rcx
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rcx, (%rax)
jmp 0x8f8f
movq -0x58(%rbp), %rcx
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rcx, 0x8(%rax)
jmp 0x8f91
jmp 0x8f93
jmp 0x8f95
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rax
movq 0x10(%rax), %rax
movq (%rax), %rdi
callq 0xb1f0
movq %rax, %rcx
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, (%rax)
jmp 0x939f
movl $0x0, -0x5c(%rbp)
movl -0x5c(%rbp), %eax
movq -0x8(%rbp), %rcx
movq 0x8(%rcx), %rcx
cmpl 0x8(%rcx), %eax
jge 0x8ffd
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rax
movslq -0x5c(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
movq -0x10(%rbp), %rsi
callq 0x8aa0
movl -0x5c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x5c(%rbp)
jmp 0x8fc6
jmp 0x939f
movl $0x0, -0x60(%rbp)
movl -0x60(%rbp), %eax
movq -0x8(%rbp), %rcx
movq 0x8(%rcx), %rcx
cmpl 0x8(%rcx), %eax
jge 0x9048
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rax
movslq -0x60(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rsi
callq 0x8aa0
movl -0x60(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x60(%rbp)
jmp 0x9009
jmp 0x939f
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rdi
movq -0x10(%rbp), %rsi
callq 0x8aa0
jmp 0x939f
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
movq -0x10(%rbp), %rsi
callq 0x8aa0
jmp 0x939f
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rdi
movq -0x10(%rbp), %rsi
callq 0x8aa0
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rax
movq (%rax), %rax
movq %rax, -0x68(%rbp)
xorl %eax, %eax
cmpq $0x0, -0x68(%rbp)
movb %al, -0x89(%rbp)
je 0x90c9
movq -0x68(%rbp), %rax
cmpl $0x1, 0x18(%rax)
sete %al
movb %al, -0x89(%rbp)
movb -0x89(%rbp), %al
testb $0x1, %al
jne 0x90d5
jmp 0x90e3
movq -0x68(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x68(%rbp)
jmp 0x90a9
movq -0x68(%rbp), %rax
cmpl $0x3, 0x18(%rax)
je 0x911c
leaq 0x36f3(%rip), %rdi      # 0xc7e7
movb $0x0, %al
callq 0x2060
movq -0x8(%rbp), %rdi
callq 0x29f0
leaq 0x36f2(%rip), %rdi      # 0xc7fd
movb $0x0, %al
callq 0x2060
movl $0xffffffff, %edi       # imm = 0xFFFFFFFF
callq 0x2100
movq -0x68(%rbp), %rax
movl (%rax), %eax
movq -0x8(%rbp), %rcx
movq 0x8(%rcx), %rcx
cmpl (%rcx), %eax
je 0x914f
leaq 0x36f6(%rip), %rdi      # 0xc82b
movb $0x0, %al
callq 0x2060
movq -0x8(%rbp), %rdi
callq 0x29f0
movl $0xffffffff, %edi       # imm = 0xFFFFFFFF
callq 0x2100
movl $0x0, -0x6c(%rbp)
movl -0x6c(%rbp), %eax
movq -0x8(%rbp), %rcx
movq 0x8(%rcx), %rcx
cmpl (%rcx), %eax
jge 0x9236
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rax
movslq -0x6c(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
movq -0x10(%rbp), %rsi
callq 0x8aa0
movq -0x68(%rbp), %rax
movq 0x10(%rax), %rax
movslq -0x6c(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq %rax, -0x78(%rbp)
movq -0x78(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rax
movslq -0x6c(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq 0x10(%rax), %rax
movq (%rax), %rsi
callq 0xb5e0
cmpl $0x0, %eax
jne 0x9226
movq -0x78(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rsi
movslq -0x6c(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rsi
callq 0x8a00
cmpl $0x0, %eax
jne 0x9224
movl -0x6c(%rbp), %esi
addl $0x1, %esi
leaq 0x3654(%rip), %rdi      # 0xc849
movb $0x0, %al
callq 0x2060
movq -0x8(%rbp), %rdi
movq -0x78(%rbp), %rsi
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rax
movslq -0x6c(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq 0x10(%rax), %rax
movq (%rax), %rdx
callq 0x87d0
jmp 0x9226
jmp 0x9228
movl -0x6c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x6c(%rbp)
jmp 0x9156
movq -0x68(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0xb1f0
movq %rax, %rcx
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq %rcx, (%rax)
jmp 0x939f
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rdi
movq -0x10(%rbp), %rsi
callq 0x8aa0
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rdi
movq -0x10(%rbp), %rsi
callq 0x8aa0
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
cmpq $0x0, 0x10(%rax)
je 0x92a3
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rdi
movq -0x10(%rbp), %rsi
callq 0x8aa0
jmp 0x939f
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rdi
movq -0x10(%rbp), %rsi
callq 0x8aa0
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rdi
movq -0x10(%rbp), %rsi
callq 0x8aa0
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x18(%rax), %rdi
movq -0x10(%rbp), %rsi
callq 0x8aa0
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rdi
movq -0x10(%rbp), %rsi
callq 0x8aa0
jmp 0x939f
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rdi
movq -0x10(%rbp), %rsi
callq 0x8aa0
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
cmpq $0x0, 0x10(%rax)
jne 0x9326
jmp 0x939f
movq -0x10(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq (%rax), %rsi
callq 0xae30
movq %rax, -0x80(%rbp)
movq -0x80(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rax
movq 0x10(%rax), %rax
movq (%rax), %rsi
callq 0xb5e0
cmpl $0x0, %eax
jne 0x939b
movq -0x80(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rsi
addq $0x10, %rsi
callq 0x8a00
cmpl $0x0, %eax
jne 0x9399
movq -0x8(%rbp), %rdi
movq -0x80(%rbp), %rsi
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rax
movq 0x10(%rax), %rax
movq (%rax), %rdx
callq 0x87d0
jmp 0x939b
jmp 0x939f
jmp 0x939f
addq $0x90, %rsp
popq %rbp
retq
nopl (%rax,%rax)