// File: /workspace/github_cpp_makefile_star2_O2/iamlouk[P]asbi/src/vm.cc
// Function: asbi::execute(std::vector<asbi::OpCode, std::allocator<asbi::OpCode>>, std::shared_ptr<asbi::Env>, asbi::Context*)
Value asbi::execute(std::vector<OpCode> opcodes, std::shared_ptr<Env> env, Context* ctx) {
#ifndef NDEBUG
	auto oldstacksize = ctx->stack.size();
#endif
	unsigned int pc = 0;
	while (pc < opcodes.size()) {
		switch (opcodes[pc++]) {
		case PUSH_NUMBER:{
			auto flt = opcodes[pc++];
			auto fltptr = reinterpret_cast<double*>(&flt);
			ctx->push(Value::number(*fltptr));
			break;
		}
		case PUSH_BOOLEAN:{
			auto val = opcodes[pc++];
			ctx->push(Value::boolean(val != 0));
			break;
		}
		case PUSH_TRUE:
			ctx->push(Value::boolean(true));
			break;
		case PUSH_FALSE:
			ctx->push(Value::boolean(false));
			break;
		case PUSH_NIL:
			ctx->push(Value::nil());
			break;
		case PUSH_SYMBOL:{
			auto raw = opcodes[pc++];
			auto sc = reinterpret_cast<StringContainer*>(raw);
			ctx->push(Value::symbol(sc));
			break;
		}
		case PUSH_STRING:{
			auto raw = opcodes[pc++];
			auto sc = reinterpret_cast<StringContainer*>(raw);
			ctx->push(Value::string(sc));
			break;
		}
		case PUSH_LAMBDA:{
			auto raw = opcodes[pc++];
			auto lc = reinterpret_cast<LambdaContainer*>(raw);
			ctx->push(Value::lambda(new LambdaContainer(env, lc->ops, lc->argnames, ctx, true)));
			break;
		}
		case PUSH_STACK_PLACEHOLDER:{
			auto raw = opcodes[pc++];
			auto sc = reinterpret_cast<StringContainer*>(raw);
			ctx->push(Value::stackplaceholder(sc));
			break;
		}
		case POP:
			ctx->pop();
			break;
		case ENTER_SCOPE:{
			env = std::make_shared<Env>(ctx, env);
			break;
		}
		case LEAVE_SCOPE:{
			env = env->outer;
			assert(env != nullptr);
			break;
		}
		case CALL:{
			auto n = static_cast<unsigned int>(opcodes[pc++]);
			auto callable = ctx->pop();
			ctx->push(callable.call(ctx, n, env));
			break;
		}
		case LOOKUP:{
			auto raw = opcodes[pc++];
			auto sc = reinterpret_cast<StringContainer*>(raw);
			ctx->push(env->lookup(sc));
			break;
		}
		case DECL:{
			auto raw = opcodes[pc++];
			auto sc = reinterpret_cast<StringContainer*>(raw);
			env->decl(sc, ctx->pop());
			ctx->push(Value::nil());
			break;
		}
		case SET:{
			auto raw = opcodes[pc++];
			auto sc = reinterpret_cast<StringContainer*>(raw);
			auto val = ctx->pop();
			env->set(sc, val);
			ctx->push(val);
			break;
		}
		case ADD:{
			auto b = ctx->pop();
			auto a = ctx->pop();
			if (a.type == type_t::Number && b.type == type_t::Number) {
				ctx->push(Value::number(a._number + b._number));
				break;
			}

			if (a.type == type_t::String/* && b.type == type_t::String*/) {
				auto sc = ctx->new_string(a._string->data);
				sc->data += b/*._string->data*/.to_string(false);
				ctx->push(Value::string(sc));
				ctx->heap_size += sc->gc_size();
				ctx->check_gc(env);
				break;
			}

			throw std::runtime_error("expected number or string");
		}
		case SUB:{
			auto b = ctx->pop();
			auto a = ctx->pop();
			if (a.type != type_t::Number || b.type != type_t::Number)
				throw std::runtime_error("expected number");
			ctx->push(Value::number(a._number - b._number));
			break;
		}
		case MUL:{
			auto b = ctx->pop();
			auto a = ctx->pop();
			if (a.type != type_t::Number || b.type != type_t::Number)
				throw std::runtime_error("expected number");
			ctx->push(Value::number(a._number * b._number));
			break;
		}
		case DIV:{
			auto b = ctx->pop();
			auto a = ctx->pop();
			if (a.type != type_t::Number || b.type != type_t::Number)
				throw std::runtime_error("expected number");
			ctx->push(Value::number(a._number / b._number));
			break;
		}
		case EQUALS:{
			auto b = ctx->pop();
			auto a = ctx->pop();
			ctx->push(Value::boolean(a == b));
			break;
		}
		case EQUALS_NOT:{
			auto b = ctx->pop();
			auto a = ctx->pop();
			ctx->push(Value::boolean(!(a == b)));
			break;
		}
		case SMALLER:{
			auto b = ctx->pop();
			auto a = ctx->pop();
			if (a.type != type_t::Number || b.type != type_t::Number)
				throw std::runtime_error("expected number");
			ctx->push(Value::boolean(a._number < b._number));
			break;
		}
		case BIGGER:{
			auto b = ctx->pop();
			auto a = ctx->pop();
			if (a.type != type_t::Number || b.type != type_t::Number)
				throw std::runtime_error("expected number");
			ctx->push(Value::boolean(a._number > b._number));
			break;
		}
		case SMALLER_OR_EQUAL:{
			auto b = ctx->pop();
			auto a = ctx->pop();
			if (a.type != type_t::Number || b.type != type_t::Number)
				throw std::runtime_error("expected number");
			ctx->push(Value::boolean(a._number <= b._number));
			break;
		}
		case BIGGER_OR_EQUAL:{
			auto b = ctx->pop();
			auto a = ctx->pop();
			if (a.type != type_t::Number || b.type != type_t::Number)
				throw std::runtime_error("expected number");
			ctx->push(Value::boolean(a._number >= b._number));
			break;
		}
		case NOT:{
			auto a = ctx->pop();
			if (a.type != type_t::Bool)
				throw std::runtime_error("expected boolean");
			ctx->push(Value::boolean(!a._boolean));
			break;
		}
		case MAKE_MAP:{
			auto n = static_cast<unsigned int>(opcodes[pc++]);
			auto mc = new MapContainer(ctx);
			for (unsigned int i = 0; i < n; ++i) {
				mc->set(ctx->pop(), ctx->pop());
			}

			ctx->push(Value::map(mc));
			ctx->heap_size += mc->gc_size();
			ctx->check_gc(env);
			break;
		}
		case MAKE_MAP_ARRLIKE:{
			auto n = static_cast<unsigned int>(opcodes[pc++]);
			auto mc = new MapContainer(ctx);
			for (unsigned int i = 0; i < n; ++i) {
				mc->set(Value::number(n - 1- i), ctx->pop());
			}

			ctx->push(Value::map(mc));
			ctx->heap_size += mc->gc_size();
			ctx->check_gc(env);
			break;
		}
		case GET_MAP_VAL:{
			auto map = ctx->pop();
			if (map.type != type_t::Map)
				throw std::runtime_error("expected map");

			ctx->push(map._map->get(ctx->pop()));
			break;
		}
		case SET_MAP_VAL:{
			auto map = ctx->pop();
			if (map.type != type_t::Map)
				throw std::runtime_error("expected map");

			auto val = ctx->pop();
			auto key = ctx->pop();
			auto prevsize = map._map->gc_size();
			map._map->set(key, val);
			if (prevsize < map._map->gc_size()) {
				ctx->heap_size -= prevsize;
				ctx->heap_size += map._map->gc_size();
				ctx->push(val);
				ctx->check_gc(env);
				break;
			}
			ctx->push(val);
			break;
		}
		case DESTRUCT_ARRLIKE:{
			auto n = static_cast<unsigned int>(opcodes[pc++]);
			auto map = ctx->pop();
			if (map.type != type_t::Map)
				throw std::runtime_error("expected map");

			for (unsigned int i = 0; i < n; ++i) {
				auto tomatch = ctx->pop();
				auto value = map._map->get(Value::number(i));
				if (tomatch.type == type_t::StackPlaceholder) {
					env->decl(tomatch._string, value);
				} else {
					if (!(tomatch == value)) {
						throw std::runtime_error("match error in destruction");
					}
				}
			}
			ctx->push(map);
			break;
		}
		case GOTO:{
			pc = static_cast<unsigned int>(opcodes[pc++]);
			assert(pc <= opcodes.size());
			break;
		}
		case IF_TRUE_GOTO:{
			auto a = ctx->pop();
			auto new_pc = static_cast<unsigned int>(opcodes[pc++]);
			if (a.type != type_t::Bool)
				throw std::runtime_error("expected boolean");

			if (a._boolean)
				pc = new_pc;
			break;
		}
		case IF_FALSE_GOTO:{
			auto a = ctx->pop();
			auto new_pc = static_cast<unsigned int>(opcodes[pc++]);
			if (a.type != type_t::Bool)
				throw std::runtime_error("expected boolean");

			if (!a._boolean)
				pc = new_pc;
			break;
		}
		case NOOP:
			assert("NOOPs should not happen");
			break;
		default:
			throw std::runtime_error("invalid opcode");
		}
	}

	assert(pc <= opcodes.size());
	assert(ctx->stack.size() == oldstacksize + 1);
	return ctx->pop();
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0xd8, %rsp
movq %rsi, 0x8(%rsp)
movq %rdi, %r13
movq %rdx, (%rsp)
movq 0x510(%rdx), %rax
subq 0x508(%rdx), %rax
sarq $0x4, %rax
movq %rax, 0x58(%rsp)
xorl %r15d, %r15d
leaq 0x9906(%rip), %r12      # 0x14b7c
movq %rdi, 0x30(%rsp)
movl %r15d, %r14d
movq (%r13), %rax
movq 0x8(%r13), %rcx
subq %rax, %rcx
sarq $0x3, %rcx
cmpq %r14, %rcx
jbe 0xbc78
movq (%rax,%r14,8), %rdx
cmpq $0x23, %rdx
ja 0xbeee
leal 0x1(%r14), %r15d
movslq (%r12,%rdx,4), %rdx
addq %r12, %rdx
movl %r15d, %ebx
jmpq *%rdx
addl $0x2, %r14d
movq (%rax,%rbx,8), %rdx
movq (%rsp), %rdi
pushq $0x1
jmp 0xb869
movl (%rax,%rbx,8), %ebp
pushq $0x68
popq %rdi
callq 0x5390
movq %rax, %r13
movq (%rsp), %rsi
movq %rax, %rdi
callq 0xd80c
movl %r14d, %r15d
addl $0x2, %r15d
movq 0x8(%rsp), %r14
movq (%rsp), %rdi
subl $0x1, %ebp
jb 0xbb01
callq 0xf1b4
movl %eax, %ebx
movq %rdx, %r12
movq (%rsp), %rdi
callq 0xf1b4
movq %rdx, %r8
movq %r13, %rdi
movl %ebx, %esi
movq %r12, %rdx
movl %eax, %ecx
callq 0xd90c
jmp 0xb2ed
movq (%rsp), %rdi
callq 0xf1b4
testl %eax, %eax
jne 0xbdd7
testb $0x1, %dl
jne 0xb3e3
movq (%r13), %rax
movl (%rax,%rbx,8), %r15d
jmp 0xb27b
movq (%rsp), %rdi
callq 0xf1b4
movl %eax, 0x40(%rsp)
movq %rdx, 0x48(%rsp)
movq (%rsp), %rdi
callq 0xf1b4
cmpl $0x1, %eax
jne 0xbbb6
cmpl $0x1, 0x40(%rsp)
jne 0xbbb6
movq %rdx, %xmm0
movq (%rsp), %rdi
addsd 0x48(%rsp), %xmm0
jmp 0xb9d1
addl $0x2, %r14d
movq (%rax,%rbx,8), %rbx
movq 0x8(%rsp), %rax
movq (%rax), %r12
movq (%rsp), %rdi
callq 0xf1b4
movq %rdx, %rcx
movq %r12, %rdi
leaq 0x97cb(%rip), %r12      # 0x14b7c
movq %rbx, %rsi
movl %eax, %edx
callq 0xed22
movq (%rsp), %rdi
pushq $0x2
popq %rsi
xorl %edx, %edx
jmp 0xb86a
movq (%rsp), %rdi
callq 0xf1b4
testl %eax, %eax
jne 0xbeb0
testb $0x1, %dl
jne 0xb33b
addl $0x2, %r14d
movl %r14d, %r15d
jmp 0xb27b
movq 0x8(%rsp), %rbx
movq (%rbx), %rsi
movq %rbx, %rdi
callq 0xc03a
cmpq $0x0, (%rbx)
jne 0xb27b
jmp 0xbd3e
movq (%rsp), %rdi
pushq $0x2
popq %rsi
xorl %edx, %edx
callq 0xf190
jmp 0xb27b
movl (%rax,%rbx,8), %ebx
movq (%rsp), %rdi
callq 0xf1b4
leaq 0x10(%rsp), %r13
movl %eax, (%r13)
movq %rdx, 0x8(%r13)
movq (%rsp), %r12
leaq 0xb0(%rsp), %rbp
movq %rbp, %rdi
movq 0x8(%rsp), %rsi
callq 0x6356
movq %r13, %rdi
movq %r12, %rsi
movl %ebx, %edx
movq %rbp, %rcx
callq 0xdb52
movq %r12, %rdi
movl %eax, %esi
callq 0xf190
addl $0x2, %r14d
leaq 0xb8(%rsp), %rdi
jmp 0xb606
movq (%rsp), %rdi
callq 0xf1b4
jmp 0xb27b
movq (%rsp), %rdi
callq 0xf1b4
movl %eax, %ebp
movq %rdx, %rbx
movq (%rsp), %rdi
callq 0xf1b4
cmpl $0x1, %eax
jne 0xbdf6
cmpl $0x1, %ebp
jne 0xbdf6
movq %rdx, %xmm0
andq $0x0, 0x10(%rsp)
movq %rbx, %xmm1
movq (%rsp), %rdi
ucomisd %xmm1, %xmm0
jmp 0xb510
movq (%rsp), %rdi
callq 0xf1b4
movl %eax, %ebp
movq %rdx, %rbx
movq (%rsp), %rdi
callq 0xf1b4
cmpl $0x1, %eax
jne 0xbe53
cmpl $0x1, %ebp
jne 0xbe53
movq %rdx, %xmm0
andq $0x0, 0x10(%rsp)
movq %rbx, %xmm1
movq (%rsp), %rdi
ucomisd %xmm0, %xmm1
setae 0x10(%rsp)
jmp 0xbaf0
andq $0x0, 0x10(%rsp)
movq (%rsp), %rdi
movb $0x1, 0x10(%rsp)
jmp 0xbaf0
addl $0x2, %r14d
movq (%rax,%rbx,8), %rbx
movq (%rsp), %rdi
callq 0xf1b4
movl %eax, %ebp
movq %rdx, %r12
movq 0x8(%rsp), %rax
movq (%rax), %rdi
movq %rbx, %rsi
movl %ebp, %edx
movq %r12, %rcx
callq 0xedca
movq (%rsp), %rdi
movl %ebp, %esi
movq %r12, %rdx
leaq 0x9613(%rip), %r12      # 0x14b7c
jmp 0xb86a
andq $0x0, 0x10(%rsp)
movq (%rsp), %rdi
movb $0x0, 0x10(%rsp)
jmp 0xbaf0
movq (%rax,%rbx,8), %rbx
movq (%rsp), %r12
pushq $0x48
popq %rdi
callq 0x5390
movq %rax, %r13
leaq 0x60(%rsp), %rdi
movq 0x8(%rsp), %rsi
callq 0x6356
movq 0x28(%rbx), %rbp
addq $0x30, %rbx
leaq 0xc0(%rsp), %rdi
movq %rbx, %rsi
callq 0x9684
movb $0x1, %r15b
movq (%rsp), %r8
leaq 0x60(%rsp), %rsi
leaq 0xc0(%rsp), %rcx
pushq $0x1
popq %r9
movq %r13, %rdi
movq %rbp, %rdx
callq 0xd722
xorl %r15d, %r15d
pushq $0x5
popq %rsi
movq %r12, %rdi
movq %r13, %rdx
callq 0xf190
addl $0x2, %r14d
leaq 0xc0(%rsp), %rdi
callq 0x96d2
leaq 0x68(%rsp), %rdi
callq 0x638a
movl %r14d, %r15d
jmp 0xbc67
movq (%rax,%rbx,8), %rax
andq $0x0, 0x10(%rsp)
testq %rax, %rax
setne 0x10(%rsp)
movq (%rsp), %rdi
addl $0x2, %r14d
movq 0x10(%rsp), %rdx
xorl %esi, %esi
jmp 0xb86a
movl (%rax,%rbx,8), %ebx
movq (%rsp), %rdi
callq 0xf1b4
cmpl $0x6, %eax
jne 0xbe91
movq %rdx, %r13
movl %r14d, %r15d
addl $0x2, %r15d
xorl %ebp, %ebp
movq 0x8(%rsp), %r14
cmpl %ebp, %ebx
je 0xbb9d
movq (%rsp), %rdi
callq 0xf1b4
movl %eax, 0x10(%rsp)
movq %rdx, 0x18(%rsp)
movl %ebp, %eax
cvtsi2sd %rax, %xmm0
movq %xmm0, %rdx
pushq $0x1
popq %rsi
movq %r13, %rdi
callq 0xda08
movl %eax, 0x40(%rsp)
movq %rdx, 0x48(%rsp)
cmpl $0x8, 0x10(%rsp)
jne 0xb6b4
movq %rdx, %rcx
movq (%r14), %rdi
movq 0x18(%rsp), %rsi
movl %eax, %edx
callq 0xed22
jmp 0xb6cb
leaq 0x10(%rsp), %rdi
leaq 0x40(%rsp), %rsi
callq 0xdd22
testb %al, %al
je 0xbcb4
incl %ebp
jmp 0xb65f
movq (%rsp), %rdi
callq 0xf1b4
movl %eax, %ebp
movq %rdx, %rbx
movq (%rsp), %rdi
callq 0xf1b4
cmpl $0x1, %eax
jne 0xbe15
cmpl $0x1, %ebp
jne 0xbe15
movq %rdx, %xmm0
movq %rbx, %xmm1
subsd %xmm1, %xmm0
jmp 0xb9cd
movq (%rsp), %rdi
callq 0xf1b4
leaq 0x10(%rsp), %rbx
movl %eax, (%rbx)
movq %rdx, 0x8(%rbx)
movq (%rsp), %rdi
callq 0xf1b4
leaq 0x40(%rsp), %rdi
movl %eax, (%rdi)
movq %rdx, 0x8(%rdi)
movq (%rsp), %r12
movq %rbx, %rsi
callq 0xdd22
andq $0x0, 0x38(%rsp)
jmp 0xb796
addl $0x2, %r14d
movq (%rax,%rbx,8), %rdx
movq (%rsp), %rdi
pushq $0x3
jmp 0xb869
movq (%rsp), %rdi
callq 0xf1b4
leaq 0x10(%rsp), %rbx
movl %eax, (%rbx)
movq %rdx, 0x8(%rbx)
movq (%rsp), %rdi
callq 0xf1b4
leaq 0x40(%rsp), %rdi
movl %eax, (%rdi)
movq %rdx, 0x8(%rdi)
movq (%rsp), %r12
movq %rbx, %rsi
callq 0xdd22
andq $0x0, 0x38(%rsp)
xorb $0x1, %al
movb %al, 0x38(%rsp)
movq 0x38(%rsp), %rdx
movq %r12, %rdi
leaq 0x93d3(%rip), %r12      # 0x14b7c
jmp 0xbaf5
addl $0x2, %r14d
movq (%rax,%rbx,8), %rsi
movq (%rsp), %rbx
movq 0x8(%rsp), %rax
movq (%rax), %rdi
callq 0xeb40
movq %rbx, %rdi
movl %eax, %esi
jmp 0xb86a
addl $0x2, %r14d
movq (%rax,%rbx,8), %rdx
movq (%rsp), %rdi
pushq $0x4
jmp 0xb869
movq (%rsp), %rdi
callq 0xf1b4
movl %eax, %ebp
movq %rdx, %rbx
movq (%rsp), %rdi
callq 0xf1b4
cmpl $0x1, %eax
jne 0xbd99
cmpl $0x1, %ebp
jne 0xbd99
movq %rdx, %xmm0
movq %rbx, %xmm1
mulsd %xmm0, %xmm1
movq (%rsp), %rdi
movq %xmm1, %rdx
jmp 0xb9d6
leaq 0x10(%rsp), %rbx
movq %rsp, %rsi
movq %rbx, %rdi
movq 0x8(%rsp), %r14
movq %r14, %rdx
callq 0xc019
movq %r14, %rdi
movq %rbx, %rsi
callq 0xc1c0
leaq 0x18(%rsp), %rdi
callq 0x638a
jmp 0xb27b
addl $0x2, %r14d
movq (%rax,%rbx,8), %rdx
movq (%rsp), %rdi
pushq $0x8
popq %rsi
callq 0xf190
movl %r14d, %r15d
jmp 0xb27b
movq (%rsp), %rdi
callq 0xf1b4
cmpl $0x6, %eax
jne 0xbd22
movq %rdx, %r12
movq (%rsp), %rdi
callq 0xf1b4
movl %eax, 0x54(%rsp)
movq %rdx, %rbp
movq (%rsp), %rdi
callq 0xf1b4
movl %eax, %r14d
movq %rdx, %r13
movq (%r12), %rax
movq %r12, %rdi
callq *0x18(%rax)
movq %rax, %rbx
movq %r12, %rdi
movl %r14d, %esi
movq %rbp, %r14
movl 0x54(%rsp), %ebp
movq %r13, %rdx
movl %ebp, %ecx
movq %r14, %r8
callq 0xd90c
movq (%r12), %rax
movq %r12, %rdi
callq *0x18(%rax)
movq (%rsp), %rdi
cmpq %rax, %rbx
jae 0xbc5d
subq %rbx, 0x308(%rdi)
movq (%r12), %rax
movq %r12, %rdi
callq *0x18(%rax)
movq (%rsp), %rdi
addq %rax, 0x308(%rdi)
movl %ebp, %esi
movq %r14, %rdx
callq 0xf190
movq (%rsp), %rbx
leaq 0x70(%rsp), %r14
movq %r14, %rdi
movq 0x8(%rsp), %rsi
callq 0x6356
movq %rbx, %rdi
movq %r14, %rsi
callq 0xb116
movq 0x30(%rsp), %r13
leaq 0x78(%rsp), %rdi
jmp 0xbc4c
movq (%rax,%rbx,8), %r15
movl %r15d, %eax
cmpq %rcx, %rax
jbe 0xb27b
jmp 0xbecf
movq (%rsp), %rdi
callq 0xf1b4
movl %eax, %ebp
movq %rdx, %rbx
movq (%rsp), %rdi
callq 0xf1b4
cmpl $0x1, %eax
jne 0xbe34
cmpl $0x1, %ebp
jne 0xbe34
andq $0x0, 0x10(%rsp)
movq %rdx, %xmm0
movq %rbx, %xmm1
ucomisd %xmm0, %xmm1
jmp 0xba20
movq (%rsp), %rdi
callq 0xf1b4
movl %eax, %ebp
movq %rdx, %rbx
movq (%rsp), %rdi
callq 0xf1b4
cmpl $0x1, %eax
jne 0xbdb8
cmpl $0x1, %ebp
jne 0xbdb8
movq %rdx, %xmm0
movq %rbx, %xmm1
divsd %xmm1, %xmm0
movq (%rsp), %rdi
movq %xmm0, %rdx
pushq $0x1
popq %rsi
callq 0xf190
jmp 0xb27b
movq (%rsp), %rdi
callq 0xf1b4
movl %eax, %ebp
movq %rdx, %rbx
movq (%rsp), %rdi
callq 0xf1b4
cmpl $0x1, %eax
jne 0xbd5b
cmpl $0x1, %ebp
jne 0xbd5b
andq $0x0, 0x10(%rsp)
movq %rdx, %xmm0
movq %rbx, %xmm1
ucomisd %xmm1, %xmm0
seta 0x10(%rsp)
movq (%rsp), %rdi
jmp 0xbaf0
movl (%rax,%rbx,8), %ebp
pushq $0x68
popq %rdi
callq 0x5390
movq %rax, %r13
movq (%rsp), %rsi
movq %rax, %rdi
callq 0xd80c
movl %r14d, %r15d
addl $0x2, %r15d
decl %ebp
movq 0x8(%rsp), %r14
cmpl $-0x1, %ebp
je 0xbb49
movl %ebp, %eax
cvtsi2sd %rax, %xmm0
movq %xmm0, %rbx
movq (%rsp), %rdi
callq 0xf1b4
movq %rdx, %r8
pushq $0x1
popq %rsi
movq %r13, %rdi
movq %rbx, %rdx
movl %eax, %ecx
callq 0xd90c
decl %ebp
jmp 0xba56
movq (%rsp), %rdi
callq 0xf1b4
cmpl $0x6, %eax
jne 0xbe72
movq %rdx, %rbx
movq (%rsp), %r12
movq %r12, %rdi
callq 0xf1b4
movq %rbx, %rdi
movl %eax, %esi
callq 0xda08
movq %r12, %rdi
movl %eax, %esi
callq 0xf190
leaq 0x90b5(%rip), %r12      # 0x14b7c
jmp 0xb27b
movq (%rsp), %rdi
callq 0xf1b4
testl %eax, %eax
jne 0xbd7a
movq (%rsp), %rdi
andq $0x0, 0x10(%rsp)
notb %dl
andb $0x1, %dl
movb %dl, 0x10(%rsp)
movq 0x10(%rsp), %rdx
xorl %esi, %esi
callq 0xf190
jmp 0xb27b
pushq $0x6
popq %rsi
movq %r13, %rdx
callq 0xf190
movq (%r13), %rax
movq %r13, %rdi
callq *0x18(%rax)
movq (%rsp), %rbx
addq %rax, 0x308(%rbx)
leaq 0x90(%rsp), %r12
movq %r12, %rdi
movq %r14, %rsi
callq 0x6356
movq %rbx, %rdi
movq %r12, %rsi
callq 0xb116
leaq 0x98(%rsp), %rdi
jmp 0xbb93
movq (%rsp), %rdi
pushq $0x6
popq %rsi
movq %r13, %rdx
callq 0xf190
movq (%r13), %rax
movq %r13, %rdi
callq *0x18(%rax)
movq (%rsp), %rbx
addq %rax, 0x308(%rbx)
leaq 0x80(%rsp), %r12
movq %r12, %rdi
movq %r14, %rsi
callq 0x6356
movq %rbx, %rdi
movq %r12, %rsi
callq 0xb116
leaq 0x88(%rsp), %rdi
callq 0x638a
jmp 0xbc67
movq (%rsp), %rdi
pushq $0x6
popq %rsi
movq %r13, %rdx
callq 0xf190
movq 0x30(%rsp), %r13
jmp 0xb27b
cmpl $0x4, %eax
jne 0xbf0d
movq (%rsp), %rdi
addq $0x20, %rdx
movq %rdx, %rsi
callq 0xf44a
movq %rax, %r12
leaq 0x10(%rsp), %rbx
leaq 0x40(%rsp), %rsi
movq %rbx, %rdi
xorl %edx, %edx
callq 0xde68
leaq 0x20(%r12), %rdi
movq %rbx, %rsi
callq 0x5670
movq 0x8(%rsp), %r14
leaq 0x10(%rsp), %rdi
callq 0x5170
movq (%rsp), %rdi
pushq $0x4
popq %rsi
movq %r12, %rdx
callq 0xf190
movq (%r12), %rax
movq %r12, %rdi
callq *0x18(%rax)
movq (%rsp), %rbx
addq %rax, 0x308(%rbx)
leaq 0xa0(%rsp), %r12
movq %r12, %rdi
movq %r14, %rsi
callq 0x6356
movq %rbx, %rdi
movq %r12, %rsi
callq 0xb116
leaq 0xa8(%rsp), %rdi
callq 0x638a
leaq 0x8f24(%rip), %r12      # 0x14b7c
jmp 0xb27b
movl %ebp, %esi
movq %r14, %rdx
callq 0xf190
movq 0x30(%rsp), %r13
leaq 0x8f09(%rip), %r12      # 0x14b7c
jmp 0xb27b
jb 0xbce4
movq (%rsp), %rdi
movq 0x510(%rdi), %rax
subq 0x508(%rdi), %rax
sarq $0x4, %rax
movq 0x58(%rsp), %rcx
incq %rcx
cmpq %rcx, %rax
jne 0xbd03
callq 0xf1b4
addq $0xd8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
pushq $0x10
popq %rdi
callq 0x51b0
movq %rax, %r14
leaq 0x8fed(%rip), %rsi      # 0x14cb3
movq %rax, %rdi
callq 0x5120
movq 0x1431b(%rip), %rsi     # 0x1fff0
movq 0x142cc(%rip), %rdx     # 0x1ffa8
movq %r14, %rdi
callq 0x55f0
leaq 0x8fe3(%rip), %rdi      # 0x14cce
leaq 0x8f29(%rip), %rsi      # 0x14c1b
leaq 0x8f28(%rip), %rcx      # 0x14c21
movl $0x128, %edx            # imm = 0x128
callq 0x5220
leaq 0x8fe8(%rip), %rdi      # 0x14cf2
leaq 0x8f0a(%rip), %rsi      # 0x14c1b
leaq 0x8f09(%rip), %rcx      # 0x14c21
movl $0x129, %edx            # imm = 0x129
callq 0x5220
pushq $0x10
popq %rdi
callq 0x51b0
movq %rax, %r14
leaq 0x8f72(%rip), %rsi      # 0x14ca6
movq %rax, %rdi
callq 0x5120
jmp 0xbcce
leaq 0x8ec7(%rip), %rdi      # 0x14c0c
leaq 0x8ecf(%rip), %rsi      # 0x14c1b
leaq 0x8ece(%rip), %rcx      # 0x14c21
pushq $0x44
popq %rdx
callq 0x5220
pushq $0x10
popq %rdi
callq 0x51b0
movq %rax, %r14
leaq 0x8f18(%rip), %rsi      # 0x14c85
movq %rax, %rdi
callq 0x5120
jmp 0xbcce
pushq $0x10
popq %rdi
callq 0x51b0
movq %rax, %r14
leaq 0x8f09(%rip), %rsi      # 0x14c95
movq %rax, %rdi
callq 0x5120
jmp 0xbcce
pushq $0x10
popq %rdi
callq 0x51b0
movq %rax, %r14
leaq 0x8eda(%rip), %rsi      # 0x14c85
movq %rax, %rdi
callq 0x5120
jmp 0xbcce
pushq $0x10
popq %rdi
callq 0x51b0
movq %rax, %r14
leaq 0x8ebb(%rip), %rsi      # 0x14c85
movq %rax, %rdi
callq 0x5120
jmp 0xbcce
pushq $0x10
popq %rdi
callq 0x51b0
movq %rax, %r14
leaq 0x8eac(%rip), %rsi      # 0x14c95
movq %rax, %rdi
callq 0x5120
jmp 0xbcce
pushq $0x10
popq %rdi
callq 0x51b0
movq %rax, %r14
leaq 0x8e7d(%rip), %rsi      # 0x14c85
movq %rax, %rdi
callq 0x5120
jmp 0xbcce
pushq $0x10
popq %rdi
callq 0x51b0
movq %rax, %r14
leaq 0x8e5e(%rip), %rsi      # 0x14c85
movq %rax, %rdi
callq 0x5120
jmp 0xbcce
pushq $0x10
popq %rdi
callq 0x51b0
movq %rax, %r14
leaq 0x8e3f(%rip), %rsi      # 0x14c85
movq %rax, %rdi
callq 0x5120
jmp 0xbcce
pushq $0x10
popq %rdi
callq 0x51b0
movq %rax, %r14
leaq 0x8e20(%rip), %rsi      # 0x14c85
movq %rax, %rdi
callq 0x5120
jmp 0xbcce
pushq $0x10
popq %rdi
callq 0x51b0
movq %rax, %r14
leaq 0x8e22(%rip), %rsi      # 0x14ca6
movq %rax, %rdi
callq 0x5120
jmp 0xbcce
pushq $0x10
popq %rdi
callq 0x51b0
movq %rax, %r14
leaq 0x8e03(%rip), %rsi      # 0x14ca6
movq %rax, %rdi
callq 0x5120
jmp 0xbcce
pushq $0x10
popq %rdi
callq 0x51b0
movq %rax, %r14
leaq 0x8dd3(%rip), %rsi      # 0x14c95
movq %rax, %rdi
callq 0x5120
jmp 0xbcce
leaq 0x8df8(%rip), %rdi      # 0x14cce
leaq 0x8d3e(%rip), %rsi      # 0x14c1b
leaq 0x8d3d(%rip), %rcx      # 0x14c21
movl $0x109, %edx            # imm = 0x109
callq 0x5220
pushq $0x10
popq %rdi
callq 0x51b0
movq %rax, %r14
leaq 0x8de3(%rip), %rsi      # 0x14ce3
movq %rax, %rdi
callq 0x5120
jmp 0xbcce
pushq $0x10
popq %rdi
callq 0x51b0
movq %rax, %r14
leaq 0x8d4c(%rip), %rsi      # 0x14c6b
movq %rax, %rdi
callq 0x5120
jmp 0xbcce
jmp 0xc006
jmp 0xc006
jmp 0xc006
jmp 0xc006
jmp 0xc006
jmp 0xc006
jmp 0xc006
jmp 0xc006
jmp 0xc006
jmp 0xc006
movq %rax, %rbx
leaq 0x10(%rsp), %rdi
callq 0x5170
jmp 0xc011
jmp 0xc006
jmp 0xc006
jmp 0xc006
jmp 0xc006
movq %rax, %rbx
leaq 0xa8(%rsp), %rdi
jmp 0xbfd3
movq %rax, %rbx
leaq 0x78(%rsp), %rdi
jmp 0xbfd3
jmp 0xc006
movq %rax, %rbx
leaq 0x88(%rsp), %rdi
jmp 0xbfd3
jmp 0xbfc1
movq %rax, %rbx
leaq 0x98(%rsp), %rdi
jmp 0xbfd3
movq %rax, %rbx
movb $0x1, %r15b
jmp 0xbfea
movq %rax, %rbx
pushq $0x68
jmp 0xbffb
movq %rax, %rbx
leaq 0xb8(%rsp), %rdi
callq 0x638a
jmp 0xc011
movq %rax, %rbx
leaq 0xc0(%rsp), %rdi
callq 0x96d2
leaq 0x68(%rsp), %rdi
callq 0x638a
testb %r15b, %r15b
je 0xc011
pushq $0x48
popq %rsi
movq %r13, %rdi
callq 0x53a0
jmp 0xc011
movq %rax, %rbx
movq %r14, %rdi
callq 0x5290
movq %rbx, %rdi
callq 0x5600