// File: /workspace/github_cpp_makefile_star2_O2/toxaart[P]hierarchical_block_sparse_lib/source/HierarchicalBlockSparseMatrix.h
// Function: hbsm::HierarchicalBlockSparseMatrix<double>::symm_multiply(hbsm::HierarchicalBlockSparseMatrix<double> const&, bool, hbsm::HierarchicalBlockSparseMatrix<double> const&, bool, hbsm::HierarchicalBlockSparseMatrix<double>&)
void HierarchicalBlockSparseMatrix<Treal>::symm_multiply(HierarchicalBlockSparseMatrix<Treal> const & A, bool sA,
						 HierarchicalBlockSparseMatrix<Treal> const & B, bool sB,
						 HierarchicalBlockSparseMatrix<Treal> & C){

				if(A.nRows < B.nRows){ // A is to be adjusted
					HierarchicalBlockSparseMatrix<Treal>  A_alias;
					A_alias.copy(A);
					adjust_sizes(A_alias,B.nRows, B.nCols);
					symm_multiply(A_alias, sA, B, sB, C);
					return;
				}
				if(A.nRows > B.nRows){ // B is to be adjusted
					HierarchicalBlockSparseMatrix<Treal>  B_alias;
					B_alias.copy(B);
					adjust_sizes(B_alias, A.nRows, A.nCols);
					symm_multiply(A, sA, B_alias, sB, C);
					return;
				}


				if (!sA && !sB) throw std::runtime_error("Error in hbsm::symm_multiply, Neither A nor B are symmetric, one and only one of them should be symmetric.");

		    if (sA && sB) throw std::runtime_error("Error in hbsm::symm_multiply, Both A and B are symmetric, one and only one of them should be symmetric.");

				if(!C.empty()) throw std::runtime_error("Error in HierarchicalBlockSparseMatrix::symm_multiply(): non-empty matrix to write result!");

				if(A.nCols_orig != B.nRows_orig) throw std::runtime_error("Error in HierarchicalBlockSparseMatrix::symm_multiply(): matrices have bad sizes!");

				C.set_params(A.get_params());

				C.resize(A.nRows_orig,B.nCols_orig);



				if(A.lowest_level()){

					const Treal ZERO = 0.0;
					const Treal ONE = 1.0;

					//at this point all submatrices are square and have equal sizes!
					int M     = C.nRows;
					int N     = C.nCols;

					const Treal *aptr = A.get_submatrix_ptr();
					const Treal *bptr = B.get_submatrix_ptr();
					Treal *cptr = C.get_submatrix_ptr_for_modification();

					if(sA) symm("L", "U", &M, &N, &ONE, aptr, &M, bptr, &M, &ZERO, cptr, &M);
					if(sB) symm("R", "U", &M, &N, &ONE, bptr, &N, aptr, &M, &ZERO, cptr, &M);

					return;
				}


				if(sA){

					// same as regular multiplication, except that if A0 or A3 is involved, then recursive call is made

					// C0 = A0xB0 + A2xB1
					// C1 = A1xB0 + A3xB1
					// C2 = A0xB2 + A2xB3
					// C3 = A1xB2 + A3xB3

					std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> > A0xB0;
					if(A.children[0] != NULL && B.children[0] != NULL){
						A0xB0 = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
						symm_multiply(*A.children[0], sA, *B.children[0], sB, *A0xB0);
					}


					std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> > A2xB1;
					if(A.children[2] != NULL && B.children[1] != NULL){
						A2xB1 = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
						multiply(*A.children[2], false, *B.children[1], false, *A2xB1);
					}


					if(A0xB0 != NULL && A2xB1 == NULL){C.children[0] = A0xB0;C.children[0]->parent = &C;}
					if(A0xB0 == NULL && A2xB1 != NULL){C.children[0] = A2xB1;C.children[0]->parent = &C;}
					if(A0xB0 != NULL && A2xB1 != NULL){
						add_to_first(*A0xB0, *A2xB1);
						C.children[0] = A0xB0;
						C.children[0]->parent = &C;
					}


					std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> > A2TxB0;
					if(A.children[2] != NULL && B.children[0] != NULL){
						A2TxB0 = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
						multiply(*A.children[2], true, *B.children[0], false, *A2TxB0);
					}



					std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> > A3xB1;
					if(A.children[3] != NULL && B.children[1] != NULL){
						A3xB1 = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
						symm_multiply(*A.children[3], sA, *B.children[1], sB,* A3xB1);
					}



					if(A2TxB0 != NULL && A3xB1 == NULL){C.children[1] = A2TxB0;C.children[1]->parent = &C;}
					if(A2TxB0 == NULL && A3xB1 != NULL){C.children[1] = A3xB1; C.children[1]->parent = &C;}
					if(A2TxB0 != NULL && A3xB1 != NULL){
						add_to_first(*A2TxB0, *A3xB1);
						C.children[1] = A2TxB0;
						C.children[1]->parent = &C;
					}


					std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> > A0xB2;
					if(A.children[0] != NULL && B.children[2] != NULL){
						A0xB2 = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
						symm_multiply(*A.children[0], sA, *B.children[2], sB, *A0xB2);
					}


					std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> > A2xB3;
					if(A.children[2] != NULL && B.children[3] != NULL){
						A2xB3 = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
						multiply(*A.children[2], false, *B.children[3], false, *A2xB3);
					}


					if(A0xB2 != NULL && A2xB3 == NULL){C.children[2] = A0xB2;C.children[2]->parent = &C;}
					if(A0xB2 == NULL && A2xB3 != NULL){C.children[2] = A2xB3;C.children[2]->parent = &C;}
					if(A0xB2 != NULL && A2xB3 != NULL){
						add_to_first(*A0xB2, *A2xB3);
						C.children[2] = A0xB2;
						C.children[2]->parent = &C;
					}

					std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> > A2TxB2;
					if(A.children[2] != NULL && B.children[2] != NULL){
						A2TxB2 = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
						multiply(*A.children[2], true, *B.children[2], false, *A2TxB2);
					}


					std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> > A3xB3;
					if(A.children[3] != NULL && B.children[3] != NULL){
						A3xB3 = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
						symm_multiply(*A.children[3], sA, *B.children[3], sB, *A3xB3);
					}


				    if(A2TxB2 != NULL && A3xB3 == NULL){C.children[3] = A2TxB2;C.children[3]->parent = &C;}
					if(A2TxB2 == NULL && A3xB3 != NULL){C.children[3] = A3xB3;C.children[3]->parent = &C;}
					if(A2TxB2 != NULL && A3xB3 != NULL){
						add_to_first(*A2TxB2, *A3xB3);
						C.children[3] = A2TxB2;
						C.children[3]->parent = &C;
					}

					return;


				}

				if(sB){

					// same as regular multiplication, except that if B0 or B3 is involved, then recursive call is made
					// C0 = A0xB0 + A2xB1
					// C1 = A1xB0 + A3xB1
					// C2 = A0xB2 + A2xB3
					// C3 = A1xB2 + A3xB3


					std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> > A0xB0;
					if(A.children[0] != NULL && B.children[0] != NULL){
						A0xB0 = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
						symm_multiply(*A.children[0], sA, *B.children[0], sB, *A0xB0);
					}


					std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> > A2xB2T;
					if(A.children[2] != NULL && B.children[2] != NULL){
						A2xB2T = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
						multiply(*A.children[2], false, *B.children[2], true, *A2xB2T);
					}


					if(A0xB0 != NULL && A2xB2T == NULL){C.children[0] = A0xB0;C.children[0]->parent = &C;}
					if(A0xB0 == NULL && A2xB2T != NULL){C.children[0] = A2xB2T;C.children[0]->parent = &C;}
					if(A0xB0 != NULL && A2xB2T != NULL){
						add_to_first(*A0xB0, *A2xB2T);
						C.children[0] = A0xB0;
						C.children[0]->parent = &C;
					}


					std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> > A1xB0;
					if(A.children[1] != NULL && B.children[0] != NULL){
						A1xB0 = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
						symm_multiply(*A.children[1], sA, *B.children[0], sB, *A1xB0);
					}



					std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> > A3xB2T;
					if(A.children[3] != NULL && B.children[2] != NULL){
						A3xB2T = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
						multiply(*A.children[3], false, *B.children[2], true, *A3xB2T);
					}


					if(A1xB0 != NULL && A3xB2T == NULL){C.children[1] = A1xB0;C.children[1]->parent = &C;}
					if(A1xB0 == NULL && A3xB2T != NULL){C.children[1] = A3xB2T;C.children[1]->parent = &C;}
					if(A1xB0 != NULL && A3xB2T != NULL){
						add_to_first(*A1xB0, *A3xB2T);
						C.children[1] = A1xB0;
						C.children[1]->parent = &C;
					}


					std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> > A0xB2;
					if(A.children[0] != NULL && B.children[2] != NULL){
						A0xB2 = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
						multiply(*A.children[0], false, *B.children[2], false, *A0xB2);
					}


					std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> > A2xB3;
					if(A.children[2] != NULL && B.children[3] != NULL){
						A2xB3 = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
						symm_multiply(*A.children[2], sA, *B.children[3], sB, *A2xB3);
					}


					if(A0xB2 != NULL && A2xB3 == NULL){C.children[2] = A0xB2;C.children[2]->parent = &C;}
					if(A0xB2 == NULL && A2xB3 != NULL){C.children[2] = A2xB3;C.children[2]->parent = &C;}
					if(A0xB2 != NULL && A2xB3 != NULL){
						add_to_first(*A0xB2, *A2xB3);
						C.children[2] = A0xB2;
						C.children[2]->parent = &C;
					}

					std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> > A1xB2;
					if(A.children[1] != NULL && B.children[2] != NULL){
						A1xB2 = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
						multiply(*A.children[1], false, *B.children[2], false, *A1xB2);
					}


					std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> > A3xB3;
					if(A.children[3] != NULL && B.children[3] != NULL){
						A3xB3 = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
						symm_multiply(*A.children[3], sA, *B.children[3], sB, *A3xB3);
					}



					if(A1xB2 != NULL && A3xB3 == NULL){C.children[3] = A1xB2;C.children[3]->parent = &C;}
					if(A1xB2 == NULL && A3xB3 != NULL){C.children[3] = A3xB3;C.children[3]->parent = &C;}
					if(A1xB2 != NULL && A3xB3 != NULL){
						add_to_first(*A1xB2,*A3xB3);
						C.children[3] = A1xB2;
						C.children[3]->parent = &C;
					}

					return;

				}

				return;

		 }

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x148, %rsp            # imm = 0x148
movq %r8, %r14
movl %ecx, %r13d
movq %rdx, %rbx
movl %esi, %r12d
movq %rdi, %r15
movl (%rdx), %eax
movzbl %r13b, %ebp
cmpl %eax, (%rdi)
jge 0x172f7
xorps %xmm0, %xmm0
leaq 0xc0(%rsp), %rdi
movaps %xmm0, (%rdi)
orl $-0x1, 0x10(%rdi)
movups %xmm0, 0x18(%rdi)
movups %xmm0, 0x28(%rdi)
movups %xmm0, 0x38(%rdi)
movups %xmm0, 0x48(%rdi)
movups %xmm0, 0x58(%rdi)
movups %xmm0, 0x68(%rdi)
movups %xmm0, 0x78(%rdi)
movq %r15, %rsi
xorl %edx, %edx
callq 0x1816a
movl (%rbx), %esi
movl 0x4(%rbx), %edx
leaq 0xc0(%rsp), %rdi
callq 0x182cc
movzbl %r12b, %esi
leaq 0xc0(%rsp), %rdi
movq %rbx, %rdx
movl %ebp, %ecx
movq %r14, %r8
callq 0x17268
jmp 0x17362
jle 0x17381
xorps %xmm0, %xmm0
leaq 0xc0(%rsp), %rdi
movaps %xmm0, (%rdi)
orl $-0x1, 0x10(%rdi)
movups %xmm0, 0x18(%rdi)
movups %xmm0, 0x28(%rdi)
movups %xmm0, 0x38(%rdi)
movups %xmm0, 0x48(%rdi)
movups %xmm0, 0x58(%rdi)
movups %xmm0, 0x68(%rdi)
movups %xmm0, 0x78(%rdi)
movq %rbx, %rsi
xorl %edx, %edx
callq 0x1816a
movl (%r15), %esi
movl 0x4(%r15), %edx
leaq 0xc0(%rsp), %rdi
callq 0x182cc
movzbl %r12b, %esi
leaq 0xc0(%rsp), %rdx
movq %r15, %rdi
movl %ebp, %ecx
movq %r14, %r8
callq 0x17268
leaq 0xc0(%rsp), %rdi
callq 0xbf32
addq $0x148, %rsp            # imm = 0x148
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movl %r12d, %eax
orb %r13b, %al
je 0x18005
movl %r12d, %eax
andb %r13b, %al
cmpb $0x1, %al
je 0x18021
movq %r14, %rdi
callq 0x14e3a
testb %al, %al
je 0x1803d
movq %r14, 0xa8(%rsp)
movl 0xc(%r15), %eax
cmpl 0x8(%rbx), %eax
jne 0x18059
movq %rbx, %r14
movl 0x10(%r15), %eax
leaq 0xc0(%rsp), %rsi
movl %eax, (%rsi)
movq 0xa8(%rsp), %rbx
movq %rbx, %rdi
callq 0x7cc0
movl 0x8(%r15), %esi
movl 0xc(%r14), %edx
movq %rbx, %rdi
xorl %ecx, %ecx
callq 0x7d24
movq %r15, %rdi
callq 0x14f94
testb %al, %al
je 0x174f0
andq $0x0, 0xc0(%rsp)
movabsq $0x3ff0000000000000, %rax # imm = 0x3FF0000000000000
movq %rax, 0x50(%rsp)
movl (%rbx), %eax
movl %eax, 0x40(%rsp)
movl 0x4(%rbx), %eax
movl %eax, 0x30(%rsp)
movq %r15, %rdi
callq 0x1637c
movq %rax, %rbp
movq %r14, %rdi
callq 0x1637c
movq %rax, %r15
movq %rbx, %rdi
callq 0x16394
movq %rax, %rbx
testb %r12b, %r12b
je 0x17498
leaq 0x40(%rsp), %rdx
movq %rdx, 0x28(%rsp)
movq %rbx, 0x20(%rsp)
leaq 0xc0(%rsp), %rax
movq %rax, 0x18(%rsp)
movq %rdx, 0x10(%rsp)
movq %r15, 0x8(%rsp)
movq %rdx, (%rsp)
leaq 0x60f3(%rip), %rdi      # 0x1d572
leaq 0x63cf(%rip), %rsi      # 0x1d855
leaq 0x30(%rsp), %rcx
leaq 0x50(%rsp), %r8
movq %rbp, %r9
callq 0x2040
testb %r13b, %r13b
je 0x1736f
leaq 0x40(%rsp), %rdx
movq %rdx, 0x28(%rsp)
movq %rbx, 0x20(%rsp)
leaq 0xc0(%rsp), %rax
movq %rax, 0x18(%rsp)
movq %rdx, 0x10(%rsp)
movq %rbp, 0x8(%rsp)
leaq 0x30(%rsp), %rcx
movq %rcx, (%rsp)
leaq 0x6380(%rip), %rdi      # 0x1d857
leaq 0x6377(%rip), %rsi      # 0x1d855
leaq 0x50(%rsp), %r8
movq %r15, %r9
callq 0x2040
jmp 0x1736f
testb %r12b, %r12b
je 0x175c4
xorps %xmm0, %xmm0
movaps %xmm0, 0xc0(%rsp)
cmpq $0x0, 0x28(%r15)
movq 0xa8(%rsp), %rbx
je 0x17559
cmpq $0x0, 0x28(%r14)
je 0x17559
leaq 0x50(%rsp), %rdi
callq 0x152ec
leaq 0xc0(%rsp), %r12
leaq 0x50(%rsp), %rsi
movq %r12, %rdi
callq 0x14fba
leaq 0x58(%rsp), %rdi
callq 0x14fe8
movq 0x28(%r15), %rdi
movq 0x28(%r14), %rdx
movq (%r12), %r8
pushq $0x1
popq %rsi
movl %ebp, %ecx
callq 0x17268
xorps %xmm0, %xmm0
movaps %xmm0, 0x50(%rsp)
cmpq $0x0, 0x48(%r15)
je 0x17699
cmpq $0x0, 0x38(%r14)
je 0x17699
leaq 0x40(%rsp), %rdi
callq 0x152ec
leaq 0x50(%rsp), %r12
leaq 0x40(%rsp), %rsi
movq %r12, %rdi
callq 0x14fba
leaq 0x48(%rsp), %rdi
callq 0x14fe8
movq 0x48(%r15), %rdi
movq 0x38(%r14), %rdx
movq (%r12), %r8
andq $0x0, (%rsp)
xorl %esi, %esi
xorl %ecx, %ecx
xorl %r9d, %r9d
callq 0x8572
movq 0x50(%rsp), %rsi
jmp 0x1769b
testb %r13b, %r13b
movq 0xa8(%rsp), %rbx
je 0x1736f
xorps %xmm0, %xmm0
movaps %xmm0, 0xc0(%rsp)
cmpq $0x0, 0x28(%r15)
je 0x1762d
cmpq $0x0, 0x28(%r14)
je 0x1762d
leaq 0x50(%rsp), %rdi
callq 0x152ec
leaq 0xc0(%rsp), %r12
leaq 0x50(%rsp), %rsi
movq %r12, %rdi
callq 0x14fba
leaq 0x58(%rsp), %rdi
callq 0x14fe8
movq 0x28(%r15), %rdi
movq 0x28(%r14), %rdx
movq (%r12), %r8
pushq $0x1
popq %rcx
xorl %esi, %esi
callq 0x17268
xorps %xmm0, %xmm0
movaps %xmm0, 0x50(%rsp)
cmpq $0x0, 0x48(%r15)
je 0x17b1e
cmpq $0x0, 0x48(%r14)
je 0x17b1e
leaq 0x40(%rsp), %rdi
callq 0x152ec
leaq 0x50(%rsp), %r12
leaq 0x40(%rsp), %rsi
movq %r12, %rdi
callq 0x14fba
leaq 0x48(%rsp), %rdi
callq 0x14fe8
movq 0x48(%r15), %rdi
movq 0x48(%r14), %rdx
movq (%r12), %r8
andq $0x0, (%rsp)
pushq $0x1
popq %rcx
xorl %esi, %esi
xorl %r9d, %r9d
callq 0x8572
movq 0x50(%rsp), %rsi
jmp 0x17b20
xorl %esi, %esi
movq 0xc0(%rsp), %rdi
testq %rdi, %rdi
je 0x176d7
testq %rsi, %rsi
jne 0x17709
leaq 0x28(%rbx), %rdi
leaq 0xc0(%rsp), %r12
movq %r12, %rsi
callq 0x162fc
movq 0x28(%rbx), %rax
movq %rbx, 0x68(%rax)
movq (%r12), %rdi
movq 0x50(%rsp), %rsi
testq %rdi, %rdi
jne 0x17704
testq %rsi, %rsi
je 0x17729
leaq 0x28(%rbx), %rdi
leaq 0x50(%rsp), %rsi
callq 0x162fc
movq 0x28(%rbx), %rax
movq %rbx, 0x68(%rax)
movq 0xc0(%rsp), %rdi
testq %rdi, %rdi
je 0x17729
movq 0x50(%rsp), %rsi
testq %rsi, %rsi
je 0x17729
xorl %edx, %edx
callq 0x163ac
leaq 0x28(%rbx), %rdi
leaq 0xc0(%rsp), %rsi
callq 0x162fc
movq 0x28(%rbx), %rax
movq %rbx, 0x68(%rax)
xorps %xmm0, %xmm0
movaps %xmm0, 0x40(%rsp)
cmpq $0x0, 0x48(%r15)
je 0x17783
cmpq $0x0, 0x28(%r14)
je 0x17783
leaq 0x30(%rsp), %rdi
callq 0x152ec
leaq 0x40(%rsp), %r12
leaq 0x30(%rsp), %rsi
movq %r12, %rdi
callq 0x14fba
leaq 0x38(%rsp), %rdi
callq 0x14fe8
movq 0x48(%r15), %rdi
movq 0x28(%r14), %rdx
movq (%r12), %r8
andq $0x0, (%rsp)
pushq $0x1
popq %rsi
xorl %ecx, %ecx
xorl %r9d, %r9d
callq 0x8572
xorps %xmm0, %xmm0
movaps %xmm0, 0x30(%rsp)
cmpq $0x0, 0x58(%r15)
je 0x177e5
cmpq $0x0, 0x38(%r14)
je 0x177e5
leaq 0x90(%rsp), %rdi
callq 0x152ec
leaq 0x30(%rsp), %r12
leaq 0x90(%rsp), %rsi
movq %r12, %rdi
callq 0x14fba
leaq 0x98(%rsp), %rdi
callq 0x14fe8
movq 0x58(%r15), %rdi
movq 0x38(%r14), %rdx
movq (%r12), %r8
pushq $0x1
popq %rsi
movl %ebp, %ecx
callq 0x17268
movq 0x30(%rsp), %rsi
jmp 0x177e7
xorl %esi, %esi
movq 0x40(%rsp), %rdi
testq %rdi, %rdi
je 0x1781d
testq %rsi, %rsi
jne 0x1784c
leaq 0x38(%rbx), %rdi
leaq 0x40(%rsp), %r12
movq %r12, %rsi
callq 0x162fc
movq 0x38(%rbx), %rax
movq %rbx, 0x68(%rax)
movq (%r12), %rdi
movq 0x30(%rsp), %rsi
testq %rdi, %rdi
jne 0x17847
testq %rsi, %rsi
je 0x17869
leaq 0x38(%rbx), %rdi
leaq 0x30(%rsp), %rsi
callq 0x162fc
movq 0x38(%rbx), %rax
movq %rbx, 0x68(%rax)
movq 0x40(%rsp), %rdi
testq %rdi, %rdi
je 0x17869
movq 0x30(%rsp), %rsi
testq %rsi, %rsi
je 0x17869
xorl %edx, %edx
callq 0x163ac
leaq 0x38(%rbx), %rdi
leaq 0x40(%rsp), %rsi
callq 0x162fc
movq 0x38(%rbx), %rax
movq %rbx, 0x68(%rax)
xorps %xmm0, %xmm0
movaps %xmm0, 0x90(%rsp)
cmpq $0x0, 0x28(%r15)
je 0x178ca
cmpq $0x0, 0x48(%r14)
je 0x178ca
leaq 0x80(%rsp), %rdi
callq 0x152ec
leaq 0x90(%rsp), %r12
leaq 0x80(%rsp), %rsi
movq %r12, %rdi
callq 0x14fba
leaq 0x88(%rsp), %rdi
callq 0x14fe8
movq 0x28(%r15), %rdi
movq 0x48(%r14), %rdx
movq (%r12), %r8
pushq $0x1
popq %rsi
movl %ebp, %ecx
callq 0x17268
xorps %xmm0, %xmm0
movaps %xmm0, 0x80(%rsp)
cmpq $0x0, 0x48(%r15)
je 0x17933
cmpq $0x0, 0x58(%r14)
je 0x17933
leaq 0x70(%rsp), %rdi
callq 0x152ec
leaq 0x80(%rsp), %r12
leaq 0x70(%rsp), %rsi
movq %r12, %rdi
callq 0x14fba
leaq 0x78(%rsp), %rdi
callq 0x14fe8
movq 0x48(%r15), %rdi
movq 0x58(%r14), %rdx
movq (%r12), %r8
andq $0x0, (%rsp)
xorl %esi, %esi
xorl %ecx, %ecx
xorl %r9d, %r9d
callq 0x8572
movq 0x80(%rsp), %rsi
jmp 0x17935
xorl %esi, %esi
movq 0x90(%rsp), %rdi
testq %rdi, %rdi
je 0x17974
testq %rsi, %rsi
jne 0x179ac
leaq 0x48(%rbx), %rdi
leaq 0x90(%rsp), %r12
movq %r12, %rsi
callq 0x162fc
movq 0x48(%rbx), %rax
movq %rbx, 0x68(%rax)
movq (%r12), %rdi
movq 0x80(%rsp), %rsi
testq %rdi, %rdi
jne 0x179a7
testq %rsi, %rsi
je 0x179cc
leaq 0x48(%rbx), %rdi
leaq 0x80(%rsp), %rsi
callq 0x162fc
movq 0x48(%rbx), %rax
movq %rbx, 0x68(%rax)
movq 0x90(%rsp), %rdi
testq %rdi, %rdi
je 0x179cc
movq 0x80(%rsp), %rsi
testq %rsi, %rsi
je 0x179cc
xorl %edx, %edx
callq 0x163ac
leaq 0x48(%rbx), %rdi
leaq 0x90(%rsp), %rsi
callq 0x162fc
movq 0x48(%rbx), %rax
movq %rbx, 0x68(%rax)
xorps %xmm0, %xmm0
movaps %xmm0, 0x70(%rsp)
cmpq $0x0, 0x48(%r15)
je 0x17a26
cmpq $0x0, 0x48(%r14)
je 0x17a26
leaq 0x60(%rsp), %rdi
callq 0x152ec
leaq 0x70(%rsp), %r12
leaq 0x60(%rsp), %rsi
movq %r12, %rdi
callq 0x14fba
leaq 0x68(%rsp), %rdi
callq 0x14fe8
movq 0x48(%r15), %rdi
movq 0x48(%r14), %rdx
movq (%r12), %r8
andq $0x0, (%rsp)
pushq $0x1
popq %rsi
xorl %ecx, %ecx
xorl %r9d, %r9d
callq 0x8572
xorps %xmm0, %xmm0
movaps %xmm0, 0x60(%rsp)
cmpq $0x0, 0x58(%r15)
je 0x17a88
cmpq $0x0, 0x58(%r14)
je 0x17a88
leaq 0xb0(%rsp), %rdi
callq 0x152ec
leaq 0x60(%rsp), %r12
leaq 0xb0(%rsp), %rsi
movq %r12, %rdi
callq 0x14fba
leaq 0xb8(%rsp), %rdi
callq 0x14fe8
movq 0x58(%r15), %rdi
movq 0x58(%r14), %rdx
movq (%r12), %r8
pushq $0x1
popq %rsi
movl %ebp, %ecx
callq 0x17268
movq 0x60(%rsp), %rsi
jmp 0x17a8a
xorl %esi, %esi
movq 0x70(%rsp), %rdi
testq %rdi, %rdi
je 0x17ad7
testq %rsi, %rsi
jne 0x17b12
leaq 0x58(%rbx), %rdi
leaq 0x70(%rsp), %r14
movq %r14, %rsi
callq 0x162fc
movq 0xa8(%rsp), %rax
movq 0x58(%rax), %rax
movq 0xa8(%rsp), %rcx
movq %rcx, 0x68(%rax)
movq (%r14), %rdi
movq 0xa8(%rsp), %rbx
movq 0x60(%rsp), %rsi
testq %rdi, %rdi
jne 0x17b09
testq %rsi, %rsi
je 0x17fa7
leaq 0x58(%rbx), %rdi
leaq 0x60(%rsp), %rsi
callq 0x162fc
movq 0x58(%rbx), %rax
movq %rbx, 0x68(%rax)
movq 0x70(%rsp), %rdi
testq %rdi, %rdi
je 0x17fa7
movq 0x60(%rsp), %rsi
testq %rsi, %rsi
je 0x17fa7
xorl %edx, %edx
callq 0x163ac
jmp 0x17f91
xorl %esi, %esi
movq 0xc0(%rsp), %rdi
testq %rdi, %rdi
je 0x17b5c
testq %rsi, %rsi
jne 0x17b8e
leaq 0x28(%rbx), %rdi
leaq 0xc0(%rsp), %r12
movq %r12, %rsi
callq 0x162fc
movq 0x28(%rbx), %rax
movq %rbx, 0x68(%rax)
movq (%r12), %rdi
movq 0x50(%rsp), %rsi
testq %rdi, %rdi
jne 0x17b89
testq %rsi, %rsi
je 0x17bae
leaq 0x28(%rbx), %rdi
leaq 0x50(%rsp), %rsi
callq 0x162fc
movq 0x28(%rbx), %rax
movq %rbx, 0x68(%rax)
movq 0xc0(%rsp), %rdi
testq %rdi, %rdi
je 0x17bae
movq 0x50(%rsp), %rsi
testq %rsi, %rsi
je 0x17bae
xorl %edx, %edx
callq 0x163ac
leaq 0x28(%rbx), %rdi
leaq 0xc0(%rsp), %rsi
callq 0x162fc
movq 0x28(%rbx), %rax
movq %rbx, 0x68(%rax)
xorps %xmm0, %xmm0
movaps %xmm0, 0x40(%rsp)
cmpq $0x0, 0x38(%r15)
je 0x17c00
cmpq $0x0, 0x28(%r14)
je 0x17c00
leaq 0x30(%rsp), %rdi
callq 0x152ec
leaq 0x40(%rsp), %r12
leaq 0x30(%rsp), %rsi
movq %r12, %rdi
callq 0x14fba
leaq 0x38(%rsp), %rdi
callq 0x14fe8
movq 0x38(%r15), %rdi
movq 0x28(%r14), %rdx
movq (%r12), %r8
pushq $0x1
popq %rcx
xorl %esi, %esi
callq 0x17268
xorps %xmm0, %xmm0
movaps %xmm0, 0x30(%rsp)
cmpq $0x0, 0x58(%r15)
je 0x17c6a
cmpq $0x0, 0x48(%r14)
je 0x17c6a
leaq 0x90(%rsp), %rdi
callq 0x152ec
leaq 0x30(%rsp), %r12
leaq 0x90(%rsp), %rsi
movq %r12, %rdi
callq 0x14fba
leaq 0x98(%rsp), %rdi
callq 0x14fe8
movq 0x58(%r15), %rdi
movq 0x48(%r14), %rdx
movq (%r12), %r8
andq $0x0, (%rsp)
pushq $0x1
popq %rcx
xorl %esi, %esi
xorl %r9d, %r9d
callq 0x8572
movq 0x30(%rsp), %rsi
jmp 0x17c6c
xorl %esi, %esi
movq 0x40(%rsp), %rdi
testq %rdi, %rdi
je 0x17ca2
testq %rsi, %rsi
jne 0x17cd1
leaq 0x38(%rbx), %rdi
leaq 0x40(%rsp), %r12
movq %r12, %rsi
callq 0x162fc
movq 0x38(%rbx), %rax
movq %rbx, 0x68(%rax)
movq (%r12), %rdi
movq 0x30(%rsp), %rsi
testq %rdi, %rdi
jne 0x17ccc
testq %rsi, %rsi
je 0x17cee
leaq 0x38(%rbx), %rdi
leaq 0x30(%rsp), %rsi
callq 0x162fc
movq 0x38(%rbx), %rax
movq %rbx, 0x68(%rax)
movq 0x40(%rsp), %rdi
testq %rdi, %rdi
je 0x17cee
movq 0x30(%rsp), %rsi
testq %rsi, %rsi
je 0x17cee
xorl %edx, %edx
callq 0x163ac
leaq 0x38(%rbx), %rdi
leaq 0x40(%rsp), %rsi
callq 0x162fc
movq 0x38(%rbx), %rax
movq %rbx, 0x68(%rax)
xorps %xmm0, %xmm0
movaps %xmm0, 0x90(%rsp)
cmpq $0x0, 0x28(%r15)
je 0x17d56
cmpq $0x0, 0x48(%r14)
je 0x17d56
leaq 0x80(%rsp), %rdi
callq 0x152ec
leaq 0x90(%rsp), %r12
leaq 0x80(%rsp), %rsi
movq %r12, %rdi
callq 0x14fba
leaq 0x88(%rsp), %rdi
callq 0x14fe8
movq 0x28(%r15), %rdi
movq 0x48(%r14), %rdx
movq (%r12), %r8
andq $0x0, (%rsp)
xorl %esi, %esi
xorl %ecx, %ecx
xorl %r9d, %r9d
callq 0x8572
xorps %xmm0, %xmm0
movaps %xmm0, 0x80(%rsp)
cmpq $0x0, 0x48(%r15)
je 0x17db8
cmpq $0x0, 0x58(%r14)
je 0x17db8
leaq 0x70(%rsp), %rdi
callq 0x152ec
leaq 0x80(%rsp), %r12
leaq 0x70(%rsp), %rsi
movq %r12, %rdi
callq 0x14fba
leaq 0x78(%rsp), %rdi
callq 0x14fe8
movq 0x48(%r15), %rdi
movq 0x58(%r14), %rdx
movq (%r12), %r8
pushq $0x1
popq %rcx
xorl %esi, %esi
callq 0x17268
movq 0x80(%rsp), %rsi
jmp 0x17dba
xorl %esi, %esi
movq 0x90(%rsp), %rdi
testq %rdi, %rdi
je 0x17df9
testq %rsi, %rsi
jne 0x17e31
leaq 0x48(%rbx), %rdi
leaq 0x90(%rsp), %r12
movq %r12, %rsi
callq 0x162fc
movq 0x48(%rbx), %rax
movq %rbx, 0x68(%rax)
movq (%r12), %rdi
movq 0x80(%rsp), %rsi
testq %rdi, %rdi
jne 0x17e2c
testq %rsi, %rsi
je 0x17e51
leaq 0x48(%rbx), %rdi
leaq 0x80(%rsp), %rsi
callq 0x162fc
movq 0x48(%rbx), %rax
movq %rbx, 0x68(%rax)
movq 0x90(%rsp), %rdi
testq %rdi, %rdi
je 0x17e51
movq 0x80(%rsp), %rsi
testq %rsi, %rsi
je 0x17e51
xorl %edx, %edx
callq 0x163ac
leaq 0x48(%rbx), %rdi
leaq 0x90(%rsp), %rsi
callq 0x162fc
movq 0x48(%rbx), %rax
movq %rbx, 0x68(%rax)
xorps %xmm0, %xmm0
movaps %xmm0, 0x70(%rsp)
cmpq $0x0, 0x38(%r15)
je 0x17eaa
cmpq $0x0, 0x48(%r14)
je 0x17eaa
leaq 0x60(%rsp), %rdi
callq 0x152ec
leaq 0x70(%rsp), %r12
leaq 0x60(%rsp), %rsi
movq %r12, %rdi
callq 0x14fba
leaq 0x68(%rsp), %rdi
callq 0x14fe8
movq 0x38(%r15), %rdi
movq 0x48(%r14), %rdx
movq (%r12), %r8
andq $0x0, (%rsp)
xorl %esi, %esi
xorl %ecx, %ecx
xorl %r9d, %r9d
callq 0x8572
xorps %xmm0, %xmm0
movaps %xmm0, 0x60(%rsp)
cmpq $0x0, 0x58(%r15)
je 0x17f0c
cmpq $0x0, 0x58(%r14)
je 0x17f0c
leaq 0xb0(%rsp), %rdi
callq 0x152ec
leaq 0x60(%rsp), %r12
leaq 0xb0(%rsp), %rsi
movq %r12, %rdi
callq 0x14fba
leaq 0xb8(%rsp), %rdi
callq 0x14fe8
movq 0x58(%r15), %rdi
movq 0x58(%r14), %rdx
movq (%r12), %r8
pushq $0x1
popq %rcx
xorl %esi, %esi
callq 0x17268
movq 0x60(%rsp), %rsi
jmp 0x17f0e
xorl %esi, %esi
movq 0x70(%rsp), %rdi
testq %rdi, %rdi
je 0x17f5b
testq %rsi, %rsi
jne 0x17f8a
leaq 0x58(%rbx), %rdi
leaq 0x70(%rsp), %r14
movq %r14, %rsi
callq 0x162fc
movq 0xa8(%rsp), %rax
movq 0x58(%rax), %rax
movq 0xa8(%rsp), %rcx
movq %rcx, 0x68(%rax)
movq (%r14), %rdi
movq 0xa8(%rsp), %rbx
movq 0x60(%rsp), %rsi
testq %rdi, %rdi
jne 0x17f85
testq %rsi, %rsi
je 0x17fa7
leaq 0x58(%rbx), %rdi
leaq 0x60(%rsp), %rsi
callq 0x162fc
movq 0x58(%rbx), %rax
movq %rbx, 0x68(%rax)
movq 0x70(%rsp), %rdi
testq %rdi, %rdi
je 0x17fa7
movq 0x60(%rsp), %rsi
testq %rsi, %rsi
je 0x17fa7
xorl %edx, %edx
callq 0x163ac
leaq 0x58(%rbx), %rdi
leaq 0x70(%rsp), %rsi
callq 0x162fc
movq 0x58(%rbx), %rax
movq %rbx, 0x68(%rax)
leaq 0x68(%rsp), %rdi
callq 0x14fe8
leaq 0x78(%rsp), %rdi
callq 0x14fe8
leaq 0x88(%rsp), %rdi
callq 0x14fe8
leaq 0x98(%rsp), %rdi
callq 0x14fe8
leaq 0x38(%rsp), %rdi
callq 0x14fe8
leaq 0x48(%rsp), %rdi
callq 0x14fe8
leaq 0x58(%rsp), %rdi
callq 0x14fe8
leaq 0xc8(%rsp), %rdi
callq 0x14fe8
jmp 0x1736f
pushq $0x10
popq %rdi
callq 0x20d0
movq %rax, %r14
leaq 0x56be(%rip), %rsi      # 0x1d6d5
movq %rax, %rdi
callq 0x2080
jmp 0x18073
pushq $0x10
popq %rdi
callq 0x20d0
movq %rax, %r14
leaq 0x570d(%rip), %rsi      # 0x1d740
movq %rax, %rdi
callq 0x2080
jmp 0x18073
pushq $0x10
popq %rdi
callq 0x20d0
movq %rax, %r14
leaq 0x5759(%rip), %rsi      # 0x1d7a8
movq %rax, %rdi
callq 0x2080
jmp 0x18073
pushq $0x10
popq %rdi
callq 0x20d0
movq %rax, %r14
leaq 0x5798(%rip), %rsi      # 0x1d803
movq %rax, %rdi
callq 0x2080
movq 0xdf76(%rip), %rsi      # 0x25ff0
movq 0xdf3f(%rip), %rdx      # 0x25fc0
movq %r14, %rdi
callq 0x2270
jmp 0x180a8
jmp 0x180d0
jmp 0x180a8
jmp 0x180b1
jmp 0x180e9
jmp 0x180b1
jmp 0x180ba
jmp 0x18108
jmp 0x180ba
jmp 0x180c3
jmp 0x18138
jmp 0x180c3
jmp 0x180a8
jmp 0x180d0
movq %rax, %rbx
jmp 0x180dd
jmp 0x180b1
jmp 0x180e9
movq %rax, %rbx
jmp 0x180f9
jmp 0x180ba
jmp 0x18108
movq %rax, %rbx
jmp 0x18115
jmp 0x180c3
jmp 0x18138
movq %rax, %rbx
jmp 0x18129
jmp 0x180d0
jmp 0x180e9
jmp 0x18108
jmp 0x18138
movq %rax, %rbx
leaq 0x68(%rsp), %rdi
callq 0x14fe8
leaq 0x78(%rsp), %rdi
callq 0x14fe8
jmp 0x180ec
movq %rax, %rbx
leaq 0x88(%rsp), %rdi
callq 0x14fe8
leaq 0x98(%rsp), %rdi
callq 0x14fe8
jmp 0x1810b
movq %rax, %rbx
leaq 0x38(%rsp), %rdi
callq 0x14fe8
leaq 0x48(%rsp), %rdi
callq 0x14fe8
leaq 0x58(%rsp), %rdi
callq 0x14fe8
leaq 0xc8(%rsp), %rdi
callq 0x14fe8
jmp 0x18162
movq %rax, %rbx
jmp 0x1811f
jmp 0x18143
jmp 0x18143
jmp 0x18143
movq %rax, %rbx
movq %r14, %rdi
callq 0x2130
jmp 0x18162
jmp 0x18152
movq %rax, %rbx
leaq 0xc0(%rsp), %rdi
callq 0xbf32
movq %rbx, %rdi
callq 0x2290