// File: /workspace/github_cpp_makefile_star2_O2/menhits[P]phplus/src/Parser.cpp
// Function: parseExpression(std::vector<std::shared_ptr<TokenData>, std::allocator<std::shared_ptr<TokenData>>> const&, int, int)
AstNode parseExpression(const vector<Token>& tokens, int left, int right)
{
	//error.log(FUNC+" called on '"+stringFromTokens(tokens, left, right)+"'", JSYK);
	
	if (left>right)
	{
		throw PhplusError(FUNC + " sent left higher then right", INTERNAL_ERROR, tokens[left]);
	}
	else if (left==right)
	{
		return AstToken::make(tokens[left]);
	}
	
	if (ops->isOpenBrac(tokens[left]->getOp()) && skipBrace(tokens, left)==right) // if the braces enclose this entire expression
	{
		if (tokens[left]->getOp()==ops->openPeren)
		{
			return astNodeFromTokens(tokens, left+1, right-1);
		}
		else if (tokens[left]->getOp()==ops->openCrBrac)
		{
			return parseType(tokens, left+1, right-1);
		}
		else
		{
			throw PhplusError("unhandled brace '"+tokens[left]->getOp()->getText()+"'", INTERNAL_ERROR, tokens[left]);
		}
	}
	
	int i=findExpressionSplit(tokens, left, right);
	
	Operator op=tokens[i]->getOp();
	
	if (op==ops->minus && i==left && i!=right)
	{
		//dont error
	}
	else if ((i==left)==op->takesLeftInput() || (i==right)==op->takesRightInput())
	{
		throw PhplusError("improper use of '"+op->getText()+"' operator", SOURCE_ERROR, tokens[i]);
	}
	
	if (op==ops->pipe)
	{
		throw PhplusError("invalid use of '"+op->getText()+"'", SOURCE_ERROR, tokens[i]);
	}
	else if (op==ops->ifOp || op==ops->loop || op==ops->rightArrow || op==ops->andOp || op==ops->orOp)
	{
		vector<AstNode> leftNodes;
		vector<AstNode> rightNodes;
		
		if (i>left)
			parseSequence(tokens, left, i-1, ops->pipe, leftNodes);
		
		if (i<right)
			parseSequence(tokens, i+1, right, ops->pipe, rightNodes);
		
		return AstOpWithInput::make(leftNodes, tokens[i], rightNodes);
	}
	else if (op==ops->comma)
	{
		vector<AstNode> nodes;
		
		parseSequence(tokens, left, right, ops->comma, nodes);
		
		return AstTuple::make(nodes);
	}
	else if (op==ops->doubleColon)
	{
		unique_ptr<AstToken> centerNode=nullptr;
		AstNode rightNode=nullptr;
		
		if (i==left+1 && tokens[i-1]->getType()==TokenData::IDENTIFIER)
		{
			centerNode=AstToken::make(tokens[i-1]);
		}
		else
		{
			throw PhplusError("you can only use constant assignment on a single identifier", SOURCE_ERROR, tokens[i]);
		}
		
		if (i<right)
		{
			rightNode=parseExpression(tokens, i+1, right);
		}
		else
		{
			rightNode=AstVoid::make();
		}
		
		return AstConstExpression::make(move(centerNode), move(rightNode));
	}
	else if (op==ops->notEqual)
	{
		AstNode rightNode=i<right?parseExpression(tokens, i+1, right):AstVoid::make();
		AstNode leftNode=i>left?parseExpression(tokens, left, i-1):AstVoid::make();
		AstNode centerNode=AstToken::make(
			makeToken(
				ops->equal->getText(),
				tokens[i]->getFile(),
				tokens[i]->getLine(),
				tokens[i]->getCharPos()+1,
				TokenData::OPERATOR,
				ops->equal
			)
		);
		
		AstNode notNode=AstToken::make(
			makeToken(
				ops->notOp->getText(),
				tokens[i]->getFile(),
				tokens[i]->getLine(),
				tokens[i]->getCharPos(),
				TokenData::OPERATOR,
				ops->notOp
			)
		);
		
		return AstExpression::make(
			AstVoid::make(),
			move(notNode),
			AstExpression::make(
				move(leftNode),
				move(centerNode),
				move(rightNode)
			)
		);
	}
	else if (op==ops->plusPlus || op==ops->minusMinus)
	{
		throw PhplusError("++ and -- are not yet implemented", SOURCE_ERROR, tokens[i]);
		
		//AstNode leftNode=parseExpression(tokens, left, i-1);
		
		//return AstExpression::make(AstVoid::make(), leftNode, AstExpression::make(leftNode, AstToken::make(Token)))
	}
	else if (op==ops->dot)
	{
		return AstExpression::make
		(
			i>left ? parseExpression(tokens, left, i-1) : AstVoid::make(),
			i<right ? parseExpression(tokens, i+1, right) : AstVoid::make(),
			AstVoid::make()
		);
	}
	else if (op==ops->colon)
	{
		AstNode leftNode=AstVoid::make();
		AstNode centerNode=parseExpression(tokens, left, i-1);;
		AstNode rightNode=i<right?parseExpression(tokens, i+1, right):AstVoid::make();
		
		// make sure if it is an abc.xyz: ijk structure, it gets parsed as such, rather then (abc.xyz): ijk
		// we do this by parsing it the latter way (already done) and then detecting if we need to change it
		if (typeid(*centerNode)==typeid(AstExpression))
		{
			AstExpression * exprNode=(AstExpression*)&*centerNode;
			
			if (!exprNode->leftIn->isVoid() && !exprNode->center->isVoid() && exprNode->rightIn->isVoid())
			{
				leftNode=move(exprNode->leftIn);
				centerNode=move(exprNode->center);
			}
		}
		
		// make a function body if needed, else make a normal expression
		
		if (
			(centerNode->isType() || centerNode->isFunctionWithOutput())
			&&
			(leftNode->isVoid() || leftNode->isType())
			&&
			!rightNode->isType()
		){
			if (leftNode->isVoid())
				leftNode=AstVoidType::make();
			
			AstNode funcRightIn;
			AstNode funcReturn;
			
			if (centerNode->isFunctionWithOutput())
			{
				funcRightIn=move(((AstOpWithInput*)&*(centerNode))->leftIn[0]);
				funcReturn=move(((AstOpWithInput*)&*(centerNode))->rightIn[0]);
			}
			else
			{
				funcRightIn=move(centerNode);
				funcReturn=AstVoidType::make();
			}
			
			return AstFuncBody::make(move(leftNode), move(funcRightIn), move(funcReturn), move(rightNode));
		}
		else
		{
			return AstExpression::make(move(leftNode), move(centerNode), move(rightNode));
		}
	}
	else
	{
		return AstExpression::make
		(
			i>left ? parseExpression(tokens, left, i-1) : AstVoid::make(),
			AstToken::make(tokens[i]),
			i<right ? parseExpression(tokens, i+1, right) : AstVoid::make()
		);
	}
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x378, %rsp            # imm = 0x378
movq %rsi, %r14
movslq %edx, %r15
cmpl %ecx, %edx
jg 0x208a7
movq %rdi, %r13
jne 0x1f9dd
shlq $0x4, %r15
addq (%r14), %r15
leaq 0x208(%rsp), %r14
movq %r14, %rdi
movq %r15, %rsi
callq 0x12e2e
leaq 0x40(%rsp), %rdi
movq %r14, %rsi
callq 0x21c90
leaq 0x40(%rsp), %rdi
movq (%rdi), %rax
andq $0x0, (%rdi)
movq %rax, (%r13)
callq 0x131d6
leaq 0x210(%rsp), %rdi
jmp 0x1fd72
movl %ecx, %r12d
movl %edx, %ebp
movq %r13, 0x60(%rsp)
leaq 0x5a902(%rip), %rax     # 0x7a2f0
movq (%rax), %r13
movq (%r14), %rax
shlq $0x4, %r15
movq (%rax,%r15), %rsi
addq $0x40, %rsi
leaq 0x158(%rsp), %rbx
movq %rbx, %rdi
callq 0xc950
movq %r13, %rdi
movq %rbx, %rsi
callq 0xc7ec
testb %al, %al
je 0x1fafb
movq %r14, %rdi
movl %ebp, %esi
callq 0x1f29d
movl %eax, %r13d
leaq 0x160(%rsp), %rdi
callq 0xc984
cmpl %r12d, %r13d
jne 0x1fb08
movq (%r14), %rax
movq (%rax,%r15), %rsi
addq $0x40, %rsi
leaq 0x40(%rsp), %rbx
movq %rbx, %rdi
callq 0xc950
leaq 0x5a88b(%rip), %rax     # 0x7a2f0
movq (%rax), %rax
movq (%rbx), %rbx
movq 0x190(%rax), %r13
leaq 0x48(%rsp), %rdi
callq 0xc984
cmpq %r13, %rbx
je 0x1fd8c
movq (%r14), %rax
movq (%rax,%r15), %rsi
addq $0x40, %rsi
leaq 0x40(%rsp), %rbx
movq %rbx, %rdi
callq 0xc950
leaq 0x5a84c(%rip), %rax     # 0x7a2f0
movq (%rax), %rax
movq (%rbx), %rbx
movq 0x1d0(%rax), %r13
leaq 0x48(%rsp), %rdi
callq 0xc984
cmpq %r13, %rbx
jne 0x20a69
incl %ebp
decl %r12d
leaq 0x40(%rsp), %rbx
movq %rbx, %rdi
movq %r14, %rsi
movl %ebp, %edx
movl %r12d, %ecx
callq 0x210eb
movq (%rbx), %rax
andq $0x0, (%rbx)
movq 0x60(%rsp), %r13
movq %rax, (%r13)
movq %rbx, %rdi
callq 0x134e8
jmp 0x1fd77
leaq 0x160(%rsp), %rdi
callq 0xc984
movq %r14, %rdi
movl %ebp, %esi
movl %r12d, %edx
callq 0x1f74d
movl %eax, %ebx
movl %eax, %r13d
movq %r14, 0x18(%rsp)
movq (%r14), %rax
movq %r13, %r14
shlq $0x4, %r14
movq (%rax,%r14), %rsi
addq $0x40, %rsi
leaq 0xb8(%rsp), %r15
movq %r15, %rdi
callq 0xc950
leaq 0x5a7a8(%rip), %rax     # 0x7a2f0
movq (%rax), %rsi
movq (%r15), %rax
movq %r13, %r15
cmpq 0xf0(%rsi), %rax
sete %cl
cmpl %ebp, %ebx
sete %dl
cmpl %r12d, %ebx
setne %dil
andb %cl, %dl
testb %dil, %dl
jne 0x1fb9e
cmpl %ebp, %r15d
setne %dl
movl 0x28(%rax), %ecx
testl $0xfffffffd, %ecx       # imm = 0xFFFFFFFD
sete %dil
xorb %dl, %dil
jne 0x20931
decl %ecx
cmpl %r12d, %r15d
setne %dl
cmpl $0x2, %ecx
sbbb $0x0, %dl
jne 0x20931
cmpq 0x20(%rsi), %rax
je 0x209cd
cmpq 0x10(%rsi), %rax
je 0x1fc53
cmpq (%rsi), %rax
je 0x1fc53
cmpq 0x170(%rsi), %rax
je 0x1fc53
cmpq 0x70(%rsi), %rax
je 0x1fc53
cmpq 0x60(%rsi), %rax
je 0x1fc53
cmpq 0x50(%rsi), %rax
je 0x1fda8
cmpq 0x40(%rsi), %rax
je 0x1fe1c
cmpq 0x90(%rsi), %rax
je 0x1fedc
cmpq 0x140(%rsi), %rax
je 0x20b1b
cmpq 0x150(%rsi), %rax
je 0x20b1b
cmpq 0x160(%rsi), %rax
je 0x1ffad
cmpq 0x30(%rsi), %rax
je 0x20342
cmpl %ebp, %r15d
jle 0x203a3
leal -0x1(%r15), %ecx
leaq 0x80(%rsp), %rdi
movq 0x18(%rsp), %rbx
movq %rbx, %rsi
movl %ebp, %edx
callq 0x1f970
jmp 0x203c5
xorps %xmm0, %xmm0
movaps %xmm0, 0x40(%rsp)
andq $0x0, 0x50(%rsp)
movaps %xmm0, 0x20(%rsp)
andq $0x0, 0x30(%rsp)
cmpl %ebp, %r15d
jle 0x1fcb2
addq $0x20, %rsi
movq %r15, %r13
leal -0x1(%r15), %ebx
leaq 0x1f8(%rsp), %r15
movq %r15, %rdi
callq 0xc950
leaq 0x40(%rsp), %r8
movq 0x18(%rsp), %rdi
movl %ebp, %esi
movl %ebx, %edx
movq %r15, %rcx
callq 0x21778
leaq 0x200(%rsp), %rdi
callq 0xc984
movq %r13, %r15
cmpl %r12d, %r15d
jge 0x1fcfd
incl %r15d
leaq 0x5a62f(%rip), %rax     # 0x7a2f0
movq (%rax), %rsi
addq $0x20, %rsi
leaq 0x1e8(%rsp), %rbx
movq %rbx, %rdi
callq 0xc950
leaq 0x20(%rsp), %r8
movq 0x18(%rsp), %rdi
movl %r15d, %esi
movl %r12d, %edx
movq %rbx, %rcx
callq 0x21778
leaq 0x1f0(%rsp), %rdi
callq 0xc984
movq 0x18(%rsp), %rax
addq (%rax), %r14
leaq 0x1d8(%rsp), %rbx
movq %rbx, %rdi
movq %r14, %rsi
callq 0x12e2e
leaq 0x8(%rsp), %rdi
leaq 0x40(%rsp), %rsi
leaq 0x20(%rsp), %rcx
movq %rbx, %rdx
callq 0x21ce2
leaq 0x8(%rsp), %rdi
movq (%rdi), %rax
andq $0x0, (%rdi)
movq 0x60(%rsp), %r13
movq %rax, (%r13)
callq 0x21d60
leaq 0x1e0(%rsp), %rdi
callq 0xc984
leaq 0x20(%rsp), %rdi
callq 0x1df42
leaq 0x40(%rsp), %rdi
callq 0x1df42
leaq 0xc0(%rsp), %rdi
callq 0xc984
movq %r13, %rax
addq $0x378, %rsp            # imm = 0x378
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
incl %ebp
decl %r12d
movq 0x60(%rsp), %r13
movq %r13, %rdi
movq %r14, %rsi
movl %ebp, %edx
movl %r12d, %ecx
callq 0x1ebe8
jmp 0x1fd77
addq $0x50, %rsi
xorps %xmm0, %xmm0
leaq 0x40(%rsp), %rbx
movaps %xmm0, (%rbx)
andq $0x0, 0x10(%rbx)
leaq 0x1c8(%rsp), %r15
movq %r15, %rdi
callq 0xc950
movq 0x18(%rsp), %rdi
movl %ebp, %esi
movl %r12d, %edx
movq %r15, %rcx
movq %rbx, %r8
callq 0x21778
leaq 0x1d0(%rsp), %rdi
callq 0xc984
leaq 0x20(%rsp), %rdi
leaq 0x40(%rsp), %rsi
callq 0x21d7a
movq 0x60(%rsp), %r13
leaq 0x20(%rsp), %rdi
movq (%rdi), %rax
andq $0x0, (%rdi)
movq %rax, (%r13)
callq 0x21dcc
jmp 0x1fd60
andq $0x0, 0x40(%rsp)
andq $0x0, 0x20(%rsp)
incl %ebp
cmpl %ebp, %r15d
jne 0x20b8c
movq 0x18(%rsp), %rax
movq (%rax), %rax
movq -0x10(%rax,%r14), %rcx
cmpl $0x2, 0x38(%rcx)
jne 0x20b8c
leaq (%rax,%r14), %rsi
addq $-0x10, %rsi
leaq 0x1b8(%rsp), %rbx
movq %rbx, %rdi
callq 0x12e2e
leaq 0x8(%rsp), %rdi
movq %rbx, %rsi
callq 0x21c90
leaq 0x8(%rsp), %rbx
movq (%rbx), %rsi
andq $0x0, (%rbx)
leaq 0x40(%rsp), %rdi
callq 0x131f0
movq %rbx, %rdi
callq 0x131d6
leaq 0x1c0(%rsp), %rdi
callq 0xc984
cmpl %r12d, %r15d
movq 0x60(%rsp), %r13
movq 0x18(%rsp), %rsi
jge 0x1ff07
incl %r15d
leaq 0x8(%rsp), %rdi
movl %r15d, %edx
movl %r12d, %ecx
callq 0x1f970
leaq 0x8(%rsp), %rbx
movq (%rbx), %rsi
andq $0x0, (%rbx)
leaq 0x20(%rsp), %rdi
callq 0x12dbe
movq %rbx, %rdi
callq 0x11c58
jmp 0x1ff2f
cmpl %r12d, %r15d
jge 0x1ffdb
leal 0x1(%r15), %edx
leaq 0x40(%rsp), %rdi
movq 0x18(%rsp), %rsi
movl %r12d, %ecx
callq 0x1f970
leaq 0x5a3ee(%rip), %r12     # 0x7a2f0
jmp 0x20002
leaq 0x8(%rsp), %rdi
callq 0x21bcc
leaq 0x8(%rsp), %rbx
movq (%rbx), %rsi
andq $0x0, (%rbx)
leaq 0x20(%rsp), %rdi
callq 0x12dbe
movq %rbx, %rdi
callq 0x21c0a
movq 0x40(%rsp), %rax
andq $0x0, 0x40(%rsp)
leaq 0x130(%rsp), %rsi
movq %rax, (%rsi)
movq 0x20(%rsp), %rax
leaq 0x128(%rsp), %rdx
movq %rax, (%rdx)
andq $0x0, 0x20(%rsp)
leaq 0x8(%rsp), %rdi
callq 0x21de6
leaq 0x8(%rsp), %rdi
movq (%rdi), %rax
andq $0x0, (%rdi)
movq %rax, (%r13)
callq 0x21e52
leaq 0x128(%rsp), %rdi
callq 0x11c58
leaq 0x130(%rsp), %rdi
callq 0x131d6
leaq 0x20(%rsp), %rdi
callq 0x11c58
leaq 0x40(%rsp), %rdi
callq 0x131d6
jmp 0x1fd6a
cmpl %ebp, %r15d
jle 0x204b5
leal -0x1(%r15), %ecx
leaq 0x90(%rsp), %rdi
movq 0x18(%rsp), %rbx
movq %rbx, %rsi
movl %ebp, %edx
callq 0x1f970
movq 0x60(%rsp), %r13
jmp 0x204dc
leaq 0x20(%rsp), %rdi
callq 0x21bcc
leaq 0x20(%rsp), %rdi
movq (%rdi), %rax
andq $0x0, (%rdi)
movq %rax, 0x40(%rsp)
callq 0x21c0a
leaq 0x5a2ee(%rip), %r12     # 0x7a2f0
cmpl %ebp, %r15d
jle 0x20020
decl %r15d
leaq 0x20(%rsp), %rdi
movq 0x18(%rsp), %rsi
movl %ebp, %edx
movl %r15d, %ecx
callq 0x1f970
jmp 0x20040
leaq 0x8(%rsp), %rdi
callq 0x21bcc
leaq 0x8(%rsp), %rdi
movq (%rdi), %rax
andq $0x0, (%rdi)
movq %rax, 0x20(%rsp)
callq 0x21c0a
movq (%r12), %rax
movq 0x80(%rax), %rsi
leaq 0x248(%rsp), %rdi
callq 0xa3b0
movq 0x18(%rsp), %r15
movq (%r15), %rax
movq (%rax,%r14), %rsi
addq $0x20, %rsi
leaq 0x1a8(%rsp), %rbx
movq %rbx, %rdi
callq 0x19fe6
movq (%r15), %rax
movq (%rax,%r14), %rax
movl 0x30(%rax), %ebp
movl 0x34(%rax), %r15d
incl %r15d
movq (%r12), %rsi
subq $-0x80, %rsi
leaq 0x198(%rsp), %r12
movq %r12, %rdi
callq 0xc950
movq %r12, (%rsp)
leaq 0x148(%rsp), %rdi
leaq 0x248(%rsp), %rsi
pushq $0x5
popq %r9
movq %rbx, %rdx
movl %ebp, %ecx
movl %r15d, %r8d
callq 0x3ce00
leaq 0x10(%rsp), %rdi
leaq 0x148(%rsp), %rsi
callq 0x21c90
leaq 0x10(%rsp), %rdi
movq (%rdi), %rax
andq $0x0, (%rdi)
movq %rax, 0x8(%rsp)
callq 0x131d6
leaq 0x150(%rsp), %rdi
callq 0xc984
leaq 0x1a0(%rsp), %rdi
callq 0xc984
leaq 0x1b0(%rsp), %rdi
callq 0xc984
leaq 0x248(%rsp), %rdi
callq 0xa558
leaq 0x5a1c7(%rip), %r12     # 0x7a2f0
movq (%r12), %rax
movq 0x130(%rax), %rsi
leaq 0x228(%rsp), %rdi
callq 0xa3b0
movq 0x18(%rsp), %r15
movq (%r15), %rax
movq (%rax,%r14), %rsi
addq $0x20, %rsi
leaq 0x188(%rsp), %rbx
movq %rbx, %rdi
callq 0x19fe6
movq (%r15), %rax
movq (%rax,%r14), %rax
movl 0x30(%rax), %ebp
movl 0x34(%rax), %r14d
movl $0x130, %esi            # imm = 0x130
addq (%r12), %rsi
leaq 0x178(%rsp), %r15
movq %r15, %rdi
callq 0xc950
movq %r15, (%rsp)
leaq 0x138(%rsp), %rdi
leaq 0x228(%rsp), %rsi
pushq $0x5
popq %r9
movq %rbx, %rdx
movl %ebp, %ecx
movl %r14d, %r8d
callq 0x3ce00
leaq 0x68(%rsp), %rdi
leaq 0x138(%rsp), %rsi
callq 0x21c90
movq 0x60(%rsp), %r13
leaq 0x68(%rsp), %rdi
movq (%rdi), %rbx
andq $0x0, (%rdi)
movq %rbx, 0x10(%rsp)
callq 0x131d6
leaq 0x140(%rsp), %rdi
callq 0xc984
leaq 0x180(%rsp), %rdi
callq 0xc984
leaq 0x190(%rsp), %rdi
callq 0xc984
leaq 0x228(%rsp), %rdi
callq 0xa558
leaq 0x70(%rsp), %rdi
callq 0x21bcc
movq 0x70(%rsp), %rax
andq $0x0, 0x70(%rsp)
andq $0x0, 0x10(%rsp)
movq %rax, 0xb0(%rsp)
movq %rbx, 0xa8(%rsp)
movq 0x20(%rsp), %rax
leaq 0x118(%rsp), %rsi
movq %rax, (%rsi)
andq $0x0, 0x20(%rsp)
movq 0x8(%rsp), %rax
andq $0x0, 0x8(%rsp)
leaq 0x110(%rsp), %rdx
movq %rax, (%rdx)
movq 0x40(%rsp), %rax
leaq 0x108(%rsp), %rcx
movq %rax, (%rcx)
andq $0x0, 0x40(%rsp)
leaq 0x98(%rsp), %rdi
callq 0x21e6c
movq 0x98(%rsp), %rax
andq $0x0, 0x98(%rsp)
leaq 0x120(%rsp), %rcx
movq %rax, (%rcx)
leaq 0x68(%rsp), %rdi
leaq 0xb0(%rsp), %rsi
leaq 0xa8(%rsp), %rdx
callq 0x21e6c
leaq 0x68(%rsp), %rdi
movq (%rdi), %rax
andq $0x0, (%rdi)
movq %rax, (%r13)
callq 0x21eea
leaq 0x120(%rsp), %rdi
callq 0x11c58
leaq 0x98(%rsp), %rdi
callq 0x21eea
leaq 0x108(%rsp), %rdi
callq 0x11c58
leaq 0x110(%rsp), %rdi
callq 0x11c58
leaq 0x118(%rsp), %rdi
callq 0x11c58
leaq 0xa8(%rsp), %rdi
callq 0x11c58
leaq 0xb0(%rsp), %rdi
callq 0x11c58
leaq 0x70(%rsp), %rdi
callq 0x21c0a
leaq 0x10(%rsp), %rdi
jmp 0x20725
leaq 0x20(%rsp), %rdi
callq 0x21bcc
leaq 0x20(%rsp), %rdi
movq (%rdi), %rax
andq $0x0, (%rdi)
movq %rax, 0x40(%rsp)
callq 0x21c0a
leal -0x1(%r15), %ecx
leaq 0x20(%rsp), %rdi
movq 0x18(%rsp), %rbx
movq %rbx, %rsi
movl %ebp, %edx
callq 0x1f970
movq 0x60(%rsp), %r13
cmpl %r12d, %r15d
jge 0x205be
incl %r15d
leaq 0x8(%rsp), %rdi
movq %rbx, %rsi
movl %r15d, %edx
movl %r12d, %ecx
callq 0x1f970
jmp 0x205de
leaq 0x20(%rsp), %rdi
callq 0x21bcc
movq 0x20(%rsp), %rax
andq $0x0, 0x20(%rsp)
movq %rax, 0x80(%rsp)
movq 0x18(%rsp), %rbx
addq (%rbx), %r14
leaq 0x168(%rsp), %rbx
movq %rbx, %rdi
movq %r14, %rsi
callq 0x12e2e
leaq 0x8(%rsp), %rdi
movq %rbx, %rsi
callq 0x21c90
movq 0x8(%rsp), %rax
andq $0x0, 0x8(%rsp)
movq %rax, 0xa0(%rsp)
cmpl %r12d, %r15d
movq 0x60(%rsp), %r13
jge 0x2041d
leal 0x1(%r15), %edx
leaq 0x78(%rsp), %rdi
movq 0x18(%rsp), %rsi
movl %r12d, %ecx
callq 0x1f970
jmp 0x20437
leaq 0x10(%rsp), %rdi
callq 0x21bcc
movq 0x10(%rsp), %rax
andq $0x0, 0x10(%rsp)
movq %rax, 0x78(%rsp)
leaq 0x40(%rsp), %rdi
leaq 0x80(%rsp), %rsi
leaq 0xa0(%rsp), %rdx
leaq 0x78(%rsp), %rcx
callq 0x21e6c
leaq 0x40(%rsp), %rdi
movq (%rdi), %rax
andq $0x0, (%rdi)
movq %rax, (%r13)
callq 0x21eea
leaq 0x78(%rsp), %rdi
callq 0x11c58
cmpl %r12d, %r15d
jl 0x20484
leaq 0x10(%rsp), %rdi
callq 0x21c0a
leaq 0xa0(%rsp), %rdi
callq 0x11c58
leaq 0x8(%rsp), %rdi
callq 0x131d6
leaq 0x170(%rsp), %rdi
callq 0xc984
leaq 0x80(%rsp), %rdi
jmp 0x205a1
leaq 0x20(%rsp), %rdi
callq 0x21bcc
movq 0x60(%rsp), %r13
movq 0x18(%rsp), %rbx
movq 0x20(%rsp), %rax
andq $0x0, 0x20(%rsp)
movq %rax, 0x90(%rsp)
cmpl %r12d, %r15d
jge 0x204fa
leal 0x1(%r15), %edx
leaq 0x88(%rsp), %rdi
movq %rbx, %rsi
movl %r12d, %ecx
callq 0x1f970
jmp 0x20517
leaq 0x8(%rsp), %rdi
callq 0x21bcc
movq 0x8(%rsp), %rax
andq $0x0, 0x8(%rsp)
movq %rax, 0x88(%rsp)
leaq 0x10(%rsp), %rdi
callq 0x21bcc
movq 0x10(%rsp), %rax
andq $0x0, 0x10(%rsp)
leaq 0x100(%rsp), %rcx
movq %rax, (%rcx)
leaq 0x40(%rsp), %rdi
leaq 0x90(%rsp), %rsi
leaq 0x88(%rsp), %rdx
callq 0x21e6c
leaq 0x40(%rsp), %rdi
movq (%rdi), %rax
andq $0x0, (%rdi)
movq %rax, (%r13)
callq 0x21eea
leaq 0x100(%rsp), %rdi
callq 0x11c58
leaq 0x10(%rsp), %rdi
callq 0x21c0a
leaq 0x88(%rsp), %rdi
callq 0x11c58
cmpl %r12d, %r15d
jl 0x20599
leaq 0x8(%rsp), %rdi
callq 0x21c0a
leaq 0x90(%rsp), %rdi
callq 0x11c58
cmpl %ebp, %r15d
jg 0x1fd6a
leaq 0x20(%rsp), %rdi
callq 0x21c0a
jmp 0x1fd6a
leaq 0x10(%rsp), %rdi
callq 0x21bcc
leaq 0x10(%rsp), %rdi
movq (%rdi), %rax
andq $0x0, (%rdi)
movq %rax, 0x8(%rsp)
callq 0x21c0a
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq -0x8(%rax), %rdi
leaq 0x571bf(%rip), %rsi     # 0x777b0
callq 0x21f04
testb %al, %al
je 0x20654
movq 0x20(%rsp), %r14
movq 0x88(%r14), %rdi
movq (%rdi), %rax
callq *(%rax)
testb %al, %al
jne 0x20654
movq 0x90(%r14), %rdi
movq (%rdi), %rax
callq *(%rax)
testb %al, %al
jne 0x20654
movq 0x98(%r14), %rdi
movq (%rdi), %rax
callq *(%rax)
testb %al, %al
je 0x20654
leaq 0x88(%r14), %rsi
addq $0x90, %r14
leaq 0x40(%rsp), %rdi
callq 0x12da6
leaq 0x20(%rsp), %rdi
movq %r14, %rsi
callq 0x12da6
movq 0x20(%rsp), %rdi
movq (%rdi), %rax
callq *0x8(%rax)
testb %al, %al
jne 0x20672
movq 0x20(%rsp), %rdi
movq (%rdi), %rax
callq *0x10(%rax)
testb %al, %al
je 0x206a2
movq 0x40(%rsp), %rdi
movq (%rdi), %rax
callq *(%rax)
testb %al, %al
jne 0x2068f
movq 0x40(%rsp), %rdi
movq (%rdi), %rax
callq *0x8(%rax)
testb %al, %al
je 0x206a2
movq 0x8(%rsp), %rdi
movq (%rdi), %rax
callq *0x8(%rax)
testb %al, %al
je 0x2074d
movq 0x40(%rsp), %rax
leaq 0xd8(%rsp), %rsi
movq %rax, (%rsi)
andq $0x0, 0x40(%rsp)
movq 0x20(%rsp), %rax
andq $0x0, 0x20(%rsp)
leaq 0xd0(%rsp), %rdx
movq %rax, (%rdx)
movq 0x8(%rsp), %rax
leaq 0xc8(%rsp), %rcx
movq %rax, (%rcx)
andq $0x0, 0x8(%rsp)
leaq 0x10(%rsp), %rdi
callq 0x21e6c
leaq 0x10(%rsp), %rdi
movq (%rdi), %rax
andq $0x0, (%rdi)
movq %rax, (%r13)
callq 0x21eea
leaq 0xc8(%rsp), %rdi
callq 0x11c58
leaq 0xd0(%rsp), %rdi
callq 0x11c58
leaq 0xd8(%rsp), %rdi
callq 0x11c58
leaq 0x8(%rsp), %rdi
callq 0x11c58
leaq 0x20(%rsp), %rdi
callq 0x11c58
leaq 0x40(%rsp), %rdi
callq 0x11c58
jmp 0x1fd6a
movq 0x40(%rsp), %rdi
movq (%rdi), %rax
callq *(%rax)
testb %al, %al
je 0x20783
leaq 0x10(%rsp), %rdi
callq 0x21f2c
leaq 0x10(%rsp), %rbx
movq (%rbx), %rsi
andq $0x0, (%rbx)
leaq 0x40(%rsp), %rdi
callq 0x12dbe
movq %rbx, %rdi
callq 0x21f6a
andq $0x0, 0x10(%rsp)
andq $0x0, 0x68(%rsp)
movq 0x20(%rsp), %rdi
movq (%rdi), %rax
callq *0x10(%rax)
movq 0x20(%rsp), %rsi
testb %al, %al
je 0x207cc
movq 0x98(%rsi), %rsi
leaq 0x10(%rsp), %rdi
callq 0x12da6
movq 0x20(%rsp), %rax
movq 0xb0(%rax), %rsi
leaq 0x68(%rsp), %rdi
callq 0x12da6
jmp 0x20804
andq $0x0, 0x20(%rsp)
leaq 0x10(%rsp), %rdi
callq 0x12dbe
leaq 0x70(%rsp), %rdi
callq 0x21f2c
leaq 0x70(%rsp), %rbx
movq (%rbx), %rsi
andq $0x0, (%rbx)
leaq 0x68(%rsp), %rdi
callq 0x12dbe
movq %rbx, %rdi
callq 0x21f6a
movq 0x40(%rsp), %rax
andq $0x0, 0x40(%rsp)
leaq 0xf8(%rsp), %rsi
movq %rax, (%rsi)
movq 0x10(%rsp), %rax
leaq 0xf0(%rsp), %rdx
movq %rax, (%rdx)
andq $0x0, 0x10(%rsp)
movq 0x68(%rsp), %rax
andq $0x0, 0x68(%rsp)
leaq 0xe8(%rsp), %rcx
movq %rax, (%rcx)
movq 0x8(%rsp), %rax
leaq 0xe0(%rsp), %r8
movq %rax, (%r8)
andq $0x0, 0x8(%rsp)
movq %r13, %rdi
callq 0x11c72
leaq 0xe0(%rsp), %rdi
callq 0x11c58
leaq 0xe8(%rsp), %rdi
callq 0x11c58
leaq 0xf0(%rsp), %rdi
callq 0x11c58
leaq 0xf8(%rsp), %rdi
callq 0x11c58
leaq 0x68(%rsp), %rdi
callq 0x11c58
jmp 0x20338
pushq $0x38
popq %rdi
callq 0xa1b0
movq %rax, %r12
leaq 0x34c9a(%rip), %rsi     # 0x55553
leaq 0x40(%rsp), %rdi
leaq 0x20(%rsp), %rdx
callq 0xa150
leaq 0x34c94(%rip), %rdx     # 0x55563
leaq 0x358(%rsp), %rdi
leaq 0x40(%rsp), %rsi
callq 0xc882
shlq $0x4, %r15
addq (%r14), %r15
leaq 0x2a8(%rsp), %rbx
movq %rbx, %rdi
movq %r15, %rsi
callq 0x12e2e
movb $0x1, %bpl
leaq 0x358(%rsp), %rsi
pushq $0x3
popq %rdx
movq %r12, %rdi
movq %rbx, %rcx
callq 0x19f06
xorl %ebp, %ebp
leaq 0x56c7b(%rip), %rsi     # 0x77598
leaq -0xf292(%rip), %rdx     # 0x11692
movq %r12, %rdi
callq 0xa4e0
jmp 0x20bfb
pushq $0x38
popq %rdi
callq 0xa1b0
movq %rax, %r15
movq 0xb8(%rsp), %rsi
leaq 0x20(%rsp), %rdi
callq 0xa3b0
leaq 0x34c3d(%rip), %rsi     # 0x55592
leaq 0x40(%rsp), %rdi
leaq 0x20(%rsp), %rdx
callq 0x11ff8
leaq 0x34c39(%rip), %rdx     # 0x555a4
leaq 0x318(%rsp), %rdi
leaq 0x40(%rsp), %rsi
callq 0xc882
movq 0x18(%rsp), %rax
addq (%rax), %r14
leaq 0x288(%rsp), %rbx
movq %rbx, %rdi
movq %r14, %rsi
callq 0x12e2e
movb $0x1, %bpl
leaq 0x318(%rsp), %rsi
movq %r15, %rdi
xorl %edx, %edx
movq %rbx, %rcx
callq 0x19f06
xorl %ebp, %ebp
leaq 0x56bdf(%rip), %rsi     # 0x77598
leaq -0xf32e(%rip), %rdx     # 0x11692
movq %r15, %rdi
callq 0xa4e0
jmp 0x20bfb
pushq $0x38
popq %rdi
callq 0xa1b0
movq %rax, %r15
movq 0xb8(%rsp), %rsi
leaq 0x20(%rsp), %rdi
callq 0xa3b0
leaq 0x34bbe(%rip), %rsi     # 0x555af
leaq 0x40(%rsp), %rdi
leaq 0x20(%rsp), %rdx
callq 0x11ff8
leaq 0x3884b(%rip), %rdx     # 0x59252
leaq 0x2f8(%rsp), %rdi
leaq 0x40(%rsp), %rsi
callq 0xc882
movq 0x18(%rsp), %rax
addq (%rax), %r14
leaq 0x278(%rsp), %rbx
movq %rbx, %rdi
movq %r14, %rsi
callq 0x12e2e
movb $0x1, %bpl
leaq 0x2f8(%rsp), %rsi
movq %r15, %rdi
xorl %edx, %edx
movq %rbx, %rcx
callq 0x19f06
xorl %ebp, %ebp
leaq 0x56b43(%rip), %rsi     # 0x77598
leaq -0xf3ca(%rip), %rdx     # 0x11692
movq %r15, %rdi
callq 0xa4e0
jmp 0x20bfb
pushq $0x38
popq %rdi
callq 0xa1b0
movq %rax, %r12
movq %r14, %r13
movq (%r14), %rax
movq (%rax,%r15), %rsi
addq $0x40, %rsi
leaq 0xb8(%rsp), %rbx
movq %rbx, %rdi
callq 0xc950
movq (%rbx), %rsi
leaq 0x20(%rsp), %rdi
callq 0xa3b0
leaq 0x34ada(%rip), %rsi     # 0x55580
leaq 0x40(%rsp), %rdi
leaq 0x20(%rsp), %rdx
callq 0x11ff8
leaq 0x38796(%rip), %rdx     # 0x59252
leaq 0x338(%rsp), %rdi
leaq 0x40(%rsp), %rsi
callq 0xc882
addq (%r13), %r15
leaq 0x298(%rsp), %rbx
movq %rbx, %rdi
movq %r15, %rsi
callq 0x12e2e
movb $0x1, %bpl
leaq 0x338(%rsp), %rsi
pushq $0x3
popq %rdx
movq %r12, %rdi
movq %rbx, %rcx
callq 0x19f06
xorl %ebp, %ebp
leaq 0x56a91(%rip), %rsi     # 0x77598
leaq -0xf47c(%rip), %rdx     # 0x11692
movq %r12, %rdi
callq 0xa4e0
jmp 0x20bfb
pushq $0x38
popq %rdi
callq 0xa1b0
movq %rax, %r15
leaq 0x34acf(%rip), %rsi     # 0x555fc
leaq 0x2b8(%rsp), %rdi
leaq 0x40(%rsp), %rdx
callq 0xa150
movq 0x18(%rsp), %rax
addq (%rax), %r14
leaq 0x218(%rsp), %rbx
movq %rbx, %rdi
movq %r14, %rsi
callq 0x12e2e
movb $0x1, %bpl
leaq 0x2b8(%rsp), %rsi
movq %r15, %rdi
xorl %edx, %edx
movq %rbx, %rcx
callq 0x19f06
xorl %ebp, %ebp
leaq 0x56a1d(%rip), %rsi     # 0x77598
leaq -0xf4f0(%rip), %rdx     # 0x11692
movq %r15, %rdi
callq 0xa4e0
jmp 0x20bfb
pushq $0x38
popq %rdi
callq 0xa1b0
movq %rax, %r15
leaq 0x34a22(%rip), %rsi     # 0x555c0
leaq 0x2d8(%rsp), %rdi
leaq 0x8(%rsp), %rdx
callq 0xa150
movq 0x18(%rsp), %rax
addq (%rax), %r14
leaq 0x268(%rsp), %rbx
movq %rbx, %rdi
movq %r14, %rsi
callq 0x12e2e
movb $0x1, %bpl
leaq 0x2d8(%rsp), %rsi
movq %r15, %rdi
xorl %edx, %edx
movq %rbx, %rcx
callq 0x19f06
xorl %ebp, %ebp
leaq 0x569ac(%rip), %rsi     # 0x77598
leaq -0xf561(%rip), %rdx     # 0x11692
movq %r15, %rdi
callq 0xa4e0
jmp 0x20c3b
jmp 0x20e8a
movq %rax, %rbx
leaq 0xe0(%rsp), %rdi
callq 0x11c58
leaq 0xe8(%rsp), %rdi
callq 0x11c58
leaq 0xf0(%rsp), %rdi
callq 0x11c58
leaq 0xf8(%rsp), %rdi
callq 0x11c58
jmp 0x20c3e
movq %rax, %rbx
leaq 0x68(%rsp), %rdi
callq 0x11c58
jmp 0x20df8
jmp 0x20e85
jmp 0x20e85
movq %rax, %rbx
leaq 0xc8(%rsp), %rdi
callq 0x11c58
leaq 0xd0(%rsp), %rdi
callq 0x11c58
leaq 0xd8(%rsp), %rdi
jmp 0x20dfd
jmp 0x20c83
movq %rax, %rbx
jmp 0x20cf5
jmp 0x20cb2
jmp 0x20cb2
jmp 0x20c8e
movq %r15, %r14
movq %rax, %rbx
jmp 0x20d2b
jmp 0x20cb2
jmp 0x20cb2
jmp 0x20e8a
jmp 0x20ca8
jmp 0x20cb2
jmp 0x20ca8
movq %rax, %rbx
jmp 0x20ea1
jmp 0x20cb2
movq %rax, %rbx
jmp 0x210af
movq %rax, %rbx
leaq 0x100(%rsp), %rdi
callq 0x11c58
leaq 0x10(%rsp), %rdi
callq 0x21c0a
jmp 0x20cd9
movq %rax, %rbx
leaq 0x88(%rsp), %rdi
callq 0x11c58
cmpl %r12d, %r15d
jl 0x20cf5
leaq 0x8(%rsp), %rdi
callq 0x21c0a
leaq 0x90(%rsp), %rdi
callq 0x11c58
cmpl %ebp, %r15d
jle 0x20d6d
jmp 0x210af
movq %rax, %rbx
leaq 0x78(%rsp), %rdi
callq 0x11c58
movq %r15, %r14
cmpl %r12d, %r15d
jl 0x20d2b
leaq 0x10(%rsp), %rdi
callq 0x21c0a
leaq 0xa0(%rsp), %rdi
callq 0x11c58
leaq 0x8(%rsp), %rdi
callq 0x131d6
jmp 0x20d4a
movq %r15, %r14
movq %rax, %rbx
leaq 0x170(%rsp), %rdi
callq 0xc984
leaq 0x80(%rsp), %rdi
callq 0x11c58
cmpl %ebp, %r14d
jg 0x210af
leaq 0x20(%rsp), %rdi
callq 0x21c0a
jmp 0x210af
jmp 0x20d7e
movq %rax, %rbx
jmp 0x20f10
movq %rax, %rbx
leaq 0x120(%rsp), %rdi
callq 0x11c58
leaq 0x98(%rsp), %rdi
callq 0x21eea
jmp 0x20da8
movq %rax, %rbx
leaq 0x108(%rsp), %rdi
callq 0x11c58
leaq 0x110(%rsp), %rdi
callq 0x11c58
leaq 0x118(%rsp), %rdi
callq 0x11c58
leaq 0xa8(%rsp), %rdi
callq 0x11c58
leaq 0xb0(%rsp), %rdi
callq 0x11c58
leaq 0x70(%rsp), %rdi
callq 0x21c0a
jmp 0x20df8
movq %rax, %rbx
leaq 0x10(%rsp), %rdi
callq 0x11c58
jmp 0x20e8d
movq %rax, %rbx
leaq 0x140(%rsp), %rdi
callq 0xc984
jmp 0x20e1c
movq %rax, %rbx
leaq 0x180(%rsp), %rdi
callq 0xc984
leaq 0x190(%rsp), %rdi
callq 0xc984
leaq 0x228(%rsp), %rdi
callq 0xa558
jmp 0x20e8d
jmp 0x20e8a
movq %rax, %rbx
leaq 0x150(%rsp), %rdi
callq 0xc984
jmp 0x20e5c
movq %rax, %rbx
leaq 0x1a0(%rsp), %rdi
callq 0xc984
leaq 0x1b0(%rsp), %rdi
callq 0xc984
leaq 0x248(%rsp), %rdi
callq 0xa558
jmp 0x20e97
movq %rax, %rbx
jmp 0x20e97
movq %rax, %rbx
leaq 0x8(%rsp), %rdi
callq 0x11c58
leaq 0x20(%rsp), %rdi
callq 0x11c58
leaq 0x40(%rsp), %rdi
callq 0x11c58
jmp 0x210af
movq %rax, %rbx
leaq 0x128(%rsp), %rdi
callq 0x11c58
leaq 0x130(%rsp), %rdi
callq 0x131d6
jmp 0x20f10
movq %rax, %rbx
leaq 0x1c0(%rsp), %rdi
callq 0xc984
jmp 0x20f10
movq %rax, %rbx
leaq 0x270(%rsp), %rdi
callq 0xc984
leaq 0x2d8(%rsp), %rdi
callq 0xa558
testb %bpl, %bpl
jne 0x20f08
jmp 0x20f10
movq %rax, %rbx
movq %r15, %rdi
callq 0xa230
leaq 0x20(%rsp), %rdi
callq 0x11c58
leaq 0x40(%rsp), %rdi
callq 0x131d6
jmp 0x210af
movq %rax, %rbx
leaq 0x220(%rsp), %rdi
callq 0xc984
leaq 0x2b8(%rsp), %rdi
jmp 0x2101d
jmp 0x21048
movq %rax, %rbx
leaq 0x2a0(%rsp), %rdi
callq 0xc984
leaq 0x338(%rsp), %rdi
callq 0xa558
jmp 0x20f70
movq %rax, %rbx
movb $0x1, %bpl
leaq 0x40(%rsp), %rdi
callq 0xa558
jmp 0x20f9f
movq %rax, %rbx
jmp 0x210a5
movq %rax, %rbx
leaq 0x1d0(%rsp), %rdi
callq 0xc984
jmp 0x210a5
movq %rax, %rbx
movb $0x1, %bpl
leaq 0x20(%rsp), %rdi
callq 0xa558
jmp 0x20fb1
movq %rax, %rbx
movb $0x1, %bpl
leaq 0xc0(%rsp), %rdi
callq 0xc984
jmp 0x21084
movq %rax, %rbx
leaq 0x280(%rsp), %rdi
callq 0xc984
leaq 0x2f8(%rsp), %rdi
jmp 0x20ff7
jmp 0x20ffe
movq %rax, %rbx
leaq 0x290(%rsp), %rdi
callq 0xc984
leaq 0x318(%rsp), %rdi
callq 0xa558
jmp 0x21004
movq %rax, %rbx
movb $0x1, %bpl
leaq 0x40(%rsp), %rdi
callq 0xa558
jmp 0x21018
jmp 0x21012
movq %rax, %rbx
movb $0x1, %bpl
leaq 0x20(%rsp), %rdi
callq 0xa558
testb %bpl, %bpl
jne 0x2104b
jmp 0x210af
movq %rax, %rbx
leaq 0x1f0(%rsp), %rdi
jmp 0x21096
movq %rax, %rbx
leaq 0x200(%rsp), %rdi
jmp 0x21096
jmp 0x21048
movq %rax, %rbx
movq %r15, %rdi
callq 0xa230
jmp 0x210af
movq %rax, %rbx
leaq 0x2b0(%rsp), %rdi
callq 0xc984
leaq 0x358(%rsp), %rdi
callq 0xa558
jmp 0x2107a
movq %rax, %rbx
movb $0x1, %bpl
leaq 0x40(%rsp), %rdi
callq 0xa558
testb %bpl, %bpl
jne 0x210c9
jmp 0x210e3
movq %rax, %rbx
leaq 0x1e0(%rsp), %rdi
callq 0xc984
leaq 0x20(%rsp), %rdi
callq 0x1df42
leaq 0x40(%rsp), %rdi
callq 0x1df42
leaq 0xc0(%rsp), %rdi
jmp 0x210de
movq %rax, %rbx
leaq 0x210(%rsp), %rdi
jmp 0x210de
movq %rax, %rbx
movq %r12, %rdi
callq 0xa230
jmp 0x210e3
movq %rax, %rbx
leaq 0x160(%rsp), %rdi
callq 0xc984
movq %rbx, %rdi
callq 0xa500