// File: /workspace/github_cpp_makefile_star2_O1/tomfunkhouser[P]gaps/pkgs/R3Shapes/R3Mesh.cpp
// Function: gaps::R3Mesh::FillHole(gaps::R3MeshEdge*, double, double)
void R3Mesh::
FillHole(R3MeshEdge *seed_edge, RNLength max_perimeter, RNLength max_planar_deviation)
{
  // Check if seed edge is on boundary
  R3MeshFace *seed_face = FaceOnEdge(seed_edge);
  if (!seed_face) return; 
  if (FaceAcrossEdge(seed_edge, seed_face)) return;
  R3MeshVertex *seed_vertex = VertexOnEdge(seed_edge, seed_face, RN_CCW);

  // Create counterclockwise linked list of boundary vertices
  R3mesh_mark++;
  R3MeshBoundaryVertexData *head = NULL;
  R3MeshBoundaryVertexData *tail = NULL;
  R3MeshEdge *edge = seed_edge;
  R3MeshVertex *vertex = seed_vertex;
  // R3MeshFace *face = seed_face;
  do {
    // Create boundary vertex 
    R3MeshBoundaryVertexData *vdata = new R3MeshBoundaryVertexData();
    vdata->vertex = vertex;
    vdata->edge = edge;
    vdata->prev = NULL;
    vdata->next = NULL;
    vdata->heappointer = NULL;
    vdata->error = 0;

    // Mark vertex (so can detect figure 8)
    SetVertexMark(vertex, R3mesh_mark);

    // Add boundary vertex to list
    if (!head) head = vdata;
    if (tail) tail->next = vdata;
    vdata->prev = tail;
    tail = vdata;

    // Update vdata error 
    if (vdata->prev) {
      R3MeshVertex *prev_vertex = vdata->prev->vertex;
      R3MeshVertex *next_vertex = VertexAcrossEdge(vdata->edge, vdata->vertex);
      const R3Point& position = VertexPosition(vertex);
      const R3Point& prev_position = VertexPosition(prev_vertex);
      const R3Point& next_position = VertexPosition(next_vertex);
      const R3Vector& prev_normal = VertexNormal(prev_vertex);
      const R3Vector& next_normal = VertexNormal(next_vertex);
      R3Vector prev_vector = prev_position - position;
      R3Vector next_vector = next_position - position;
      R3Vector cross = prev_vector % next_vector;
      RNAngle interior_angle = R3InteriorAngle(prev_vector, next_vector);
      if (cross.Dot(VertexNormal(vdata->vertex)) > 0) interior_angle = RN_TWO_PI - interior_angle;
      RNAngle normal_angle = R3InteriorAngle(prev_normal, next_normal);
      vdata->error = interior_angle + normal_angle;
    }

    // Find next vertex
    vertex = VertexAcrossEdge(edge, vertex);

    // Check for repeated vertex (figure 8)
    if (VertexMark(vertex) == R3mesh_mark) {
      if (vertex != seed_vertex) {
        // Find previous instance of repeated vertex
        R3MeshBoundaryVertexData *vdata = tail->prev;
        while (vdata->vertex != vertex) vdata = vdata->prev;

        // Remove part of list before repeated vertex
        head = vdata;
        vdata = head->prev;
        head->prev = NULL;
        while (vdata) { 
          R3MeshBoundaryVertexData *prev = vdata->prev; 
          delete vdata; 
          vdata = prev; 
        }

        // Now have a complete loop
        break;
      }
    }

    // Find next edge
    R3MeshEdge *e = edge;
    while (e) {
      R3MeshFace *f = FaceOnVertex(vertex, e, RN_CCW);
      if (!f) { assert(e != edge); edge = e; break; }
      e = EdgeOnFace(f, vertex, RN_CW);
      if (!e || (e == edge)) return; 
    } 

    // Find next face
    // face = FaceOnVertex(vertex, edge, RN_CW);
  } while (vertex != seed_vertex);

  // Complete loop
  if (head && tail) {
    // Add link between head and tail
    head->prev = tail;
    tail->next = head;

    // Update head error 
    if (head) {
      R3MeshBoundaryVertexData *vdata = head;
      R3MeshVertex *prev_vertex = vdata->prev->vertex;
      R3MeshVertex *next_vertex = vdata->next->vertex;
      const R3Point& position = VertexPosition(vertex);
      const R3Point& prev_position = VertexPosition(prev_vertex);
      const R3Point& next_position = VertexPosition(next_vertex);
      const R3Vector& prev_normal = VertexNormal(prev_vertex);
      const R3Vector& next_normal = VertexNormal(next_vertex);
      R3Vector prev_vector = prev_position - position;
      R3Vector next_vector = next_position - position;
      R3Vector cross = prev_vector % next_vector;
      RNAngle interior_angle = R3InteriorAngle(prev_vector, next_vector);
      if (cross.Dot(VertexNormal(vdata->vertex)) > 0) interior_angle = RN_TWO_PI - interior_angle;
      RNAngle normal_angle = R3InteriorAngle(prev_normal, next_normal);
      vdata->error = interior_angle + normal_angle;
    }
  }

  // Split any edges spanning (back side of) boundary
  R3MeshBoundaryVertexData *vdata = head;
  do {
    R3MeshVertex *vertex = vdata->vertex;
    for (int i = 0; i < VertexValence(vertex); i++) {
      R3MeshEdge *edge = EdgeOnVertex(vertex, i);
      if (edge == vdata->edge) continue;
      if (edge == vdata->prev->edge) continue;
      R3MeshVertex *neighbor = VertexAcrossEdge(edge, vertex);
      if (VertexMark(neighbor)) SubdivideEdge(edge);
    }
    vdata = vdata->next;
  } while (vdata != head);

  // Mark hole boundary
  UnmarkHoleBoundary(this, head);

  // Check hole boundary
  if (!CheckHoleBoundary(this, head, max_perimeter, max_planar_deviation)) return;

  // Fill hole boundary
  FillHoleBoundary(this, head);
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0xf8, %rsp
movsd %xmm1, 0x60(%rsp)
movsd %xmm0, 0x68(%rsp)
movq %rsi, %r13
movq %rdi, 0x8(%rsp)
movq 0x20(%rsi), %rcx
movq %rcx, %rax
testq %rcx, %rcx
jne 0x17cdb
movq 0x18(%r13), %rax
testq %rax, %rax
je 0x17cf0
movq 0x18(%r13), %rdx
cmpq %rax, %rdx
cmovneq %rdx, %rcx
testq %rcx, %rcx
je 0x17d02
addq $0xf8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
xorl %ecx, %ecx
cmpq %rax, %rdx
sete %cl
movq 0x8(%r13,%rcx,8), %r14
incl 0xcd79b(%rip)           # 0xe54b0
leaq 0x922ac(%rip), %rax     # 0xa9fc8
movsd (%rax), %xmm0
movsd %xmm0, 0x48(%rsp)
xorl %r15d, %r15d
movq %r14, 0x10(%rsp)
xorl %ebp, %ebp
movl $0x30, %edi
callq 0xe440
xorpd %xmm0, %xmm0
movapd %xmm0, (%rax)
movapd %xmm0, 0x10(%rax)
movapd %xmm0, 0x20(%rax)
leaq 0x10(%rax), %r12
movq %r14, (%rax)
movq %r13, 0x8(%rax)
movl 0xcd753(%rip), %ecx     # 0xe54b0
movl %ecx, 0x88(%r14)
testq %rbp, %rbp
cmoveq %rax, %rbp
testq %r15, %r15
je 0x17eb4
movq %rax, 0x18(%r15)
movq %r15, 0x10(%rax)
movq 0x8(%r13), %rbx
cmpq %r14, %rbx
jne 0x17d89
movq 0x10(%r13), %rbx
movq %rax, 0x38(%rsp)
movq (%r15), %r15
testb $0x2, 0x78(%r15)
jne 0x17da9
movq 0x8(%rsp), %rdi
movq (%rdi), %rax
movq %r15, %rsi
callq *0x2b0(%rax)
movq %r13, 0x40(%rsp)
testb $0x2, 0x78(%rbx)
jne 0x17dc5
movq 0x8(%rsp), %rdi
movq (%rdi), %rax
movq %rbx, %rsi
callq *0x2b0(%rax)
leaq 0x18(%r14), %r13
movq %r15, 0x50(%rsp)
leaq 0x18(%r15), %rsi
leaq 0x18(%rbx), %r15
leaq 0x70(%rsp), %rdi
movq %r13, %rdx
callq 0x3cc88
leaq 0x20(%rsp), %rdi
movq %r15, %rsi
movq %r13, %rdx
callq 0x3cc88
leaq 0xc8(%rsp), %rdi
leaq 0x70(%rsp), %r15
movq %r15, %rsi
leaq 0x20(%rsp), %rdx
callq 0x3de12
movq %r15, %rdi
leaq 0x20(%rsp), %rsi
callq 0x4c77b
movapd %xmm0, 0xb0(%rsp)
movq 0x38(%rsp), %rax
movq (%rax), %r13
testb $0x2, 0x78(%r13)
jne 0x17e43
movq 0x8(%rsp), %rdi
movq (%rdi), %rax
movq %r13, %rsi
callq *0x2b0(%rax)
movq 0x50(%rsp), %r15
addq $0x30, %r15
addq $0x30, %rbx
addq $0x30, %r13
leaq 0xc8(%rsp), %rdi
movq %r13, %rsi
callq 0x3d756
movsd 0x48(%rsp), %xmm1
movapd 0xb0(%rsp), %xmm2
subsd %xmm2, %xmm1
xorpd %xmm3, %xmm3
cmpltsd %xmm0, %xmm3
andpd %xmm3, %xmm1
andnpd %xmm2, %xmm3
orpd %xmm1, %xmm3
movapd %xmm3, 0x50(%rsp)
movq %r15, %rdi
movq %rbx, %rsi
callq 0x4c77b
addsd 0x50(%rsp), %xmm0
movq 0x38(%rsp), %rax
movsd %xmm0, 0x28(%rax)
movq 0x40(%rsp), %r13
jmp 0x17eb8
movq %r15, (%r12)
movq 0x8(%r13), %rcx
cmpq %r14, %rcx
movq %rcx, %r14
jne 0x17ec8
movq 0x10(%r13), %r14
cmpq 0x10(%rsp), %r14
je 0x17f24
movl 0xcd5db(%rip), %ecx     # 0xe54b0
cmpl %ecx, 0x88(%r14)
jne 0x17f24
movq (%r12), %rbp
leaq 0x10(%rbp), %r12
cmpq %r14, (%rbp)
jne 0x17ede
movq 0x10(%rbp), %rdi
movq $0x0, 0x10(%rbp)
movl $0x2, %ebx
testq %rdi, %rdi
je 0x17f94
movq %rax, %r12
movq 0x10(%rdi), %r15
movl $0x30, %esi
callq 0xe450
movq %r15, %rdi
testq %r15, %r15
jne 0x17f09
movq %r12, %rax
jmp 0x17f94
movq %r13, %rsi
xorl %ebx, %ebx
testq %rsi, %rsi
je 0x17f94
xorl %ecx, %ecx
cmpq %r14, 0x8(%rsi)
setne %cl
movq 0x18(%rsi,%rcx,8), %rcx
testq %rcx, %rcx
je 0x17f57
cmpq %r14, 0x8(%rcx)
je 0x17f61
cmpq %r14, 0x10(%rcx)
je 0x17f68
cmpq %r14, 0x18(%rcx)
je 0x17f6f
xorl %esi, %esi
jmp 0x17f78
movl $0x9, %ecx
movq %rsi, %r13
jmp 0x17f89
movl $0x30, %edx
jmp 0x17f74
movl $0x20, %edx
jmp 0x17f74
movl $0x28, %edx
movq (%rcx,%rdx), %rsi
testq %rsi, %rsi
sete %cl
cmpq %r13, %rsi
sete %dl
orb %cl, %dl
movzbl %dl, %ecx
testl %ecx, %ecx
je 0x17f27
cmpl $0x9, %ecx
je 0x17f94
movl %ecx, %ebx
testl %ebx, %ebx
jne 0x17fa8
movq %rax, %r15
cmpq 0x10(%rsp), %r14
jne 0x17d30
jmp 0x17fb1
cmpl $0x2, %ebx
jne 0x17cf0
movq %rax, 0x10(%rbp)
movq %rbp, 0x18(%rax)
movq (%rax), %rbx
movq 0x18(%rbp), %rax
movq (%rax), %r15
testb $0x2, 0x78(%rbx)
jne 0x17fda
movq 0x8(%rsp), %rdi
movq (%rdi), %rax
movq %rbx, %rsi
callq *0x2b0(%rax)
addq $0x18, %r14
leaq 0x18(%rbx), %r13
leaq 0x18(%r15), %rax
movq %rax, 0x10(%rsp)
testb $0x2, 0x78(%r15)
jne 0x18003
movq 0x8(%rsp), %rdi
movq (%rdi), %rax
movq %r15, %rsi
callq *0x2b0(%rax)
addq $0x30, %rbx
addq $0x30, %r15
leaq 0x70(%rsp), %r12
movq %r12, %rdi
movq %r13, %rsi
movq %r14, %rdx
callq 0x3cc88
leaq 0x20(%rsp), %r13
movq %r13, %rdi
movq 0x10(%rsp), %rsi
movq %r14, %rdx
callq 0x3cc88
leaq 0xc8(%rsp), %rdi
movq %r12, %rsi
movq %r13, %rdx
callq 0x3de12
movq %r12, %rdi
movq %r13, %rsi
callq 0x4c77b
movapd %xmm0, 0x10(%rsp)
movq (%rbp), %r14
testb $0x2, 0x78(%r14)
jne 0x18073
movq 0x8(%rsp), %rdi
movq (%rdi), %rax
movq %r14, %rsi
callq *0x2b0(%rax)
addq $0x30, %r14
leaq 0xc8(%rsp), %rdi
movq %r14, %rsi
callq 0x3d756
movsd 0x48(%rsp), %xmm1
movapd 0x10(%rsp), %xmm2
subsd %xmm2, %xmm1
xorpd %xmm3, %xmm3
cmpltsd %xmm0, %xmm3
andpd %xmm3, %xmm1
andnpd %xmm2, %xmm3
orpd %xmm1, %xmm3
movapd %xmm3, 0x10(%rsp)
movq %rbx, %rdi
movq %r15, %rsi
callq 0x4c77b
addsd 0x10(%rsp), %xmm0
movsd %xmm0, 0x28(%rbp)
movq %rbp, %rbx
movq (%rbx), %r14
cmpl $0x0, 0x14(%r14)
jle 0x18120
xorl %r15d, %r15d
movq 0x8(%r14), %rax
movq (%rax,%r15,8), %rsi
cmpq 0x8(%rbx), %rsi
je 0x18114
movq 0x10(%rbx), %rax
cmpq 0x8(%rax), %rsi
je 0x18114
movq 0x8(%rsi), %rax
cmpq %r14, %rax
jne 0x180fd
movq 0x10(%rsi), %rax
cmpl $0x0, 0x88(%rax)
je 0x18114
movq 0x8(%rsp), %rdi
movq (%rdi), %rax
callq *0xc8(%rax)
incq %r15
movslq 0x14(%r14), %rax
cmpq %rax, %r15
jl 0x180d8
movq 0x18(%rbx), %rbx
cmpq %rbp, %rbx
jne 0x180cb
movq %rbp, %rax
movq 0x8(%rax), %rcx
testq %rcx, %rcx
je 0x1813c
movl $0x0, 0x48(%rcx)
movq 0x18(%rax), %rax
cmpq %rbp, %rax
jne 0x1812c
xorpd %xmm1, %xmm1
movsd 0x68(%rsp), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x1819e
movq %rbp, %r14
movq 0x8(%r14), %rbx
testq %rbx, %rbx
je 0x18189
testb $0x2, 0x38(%rbx)
jne 0x18184
movq 0x8(%rsp), %rdi
movq (%rdi), %rax
movq %rbx, %rsi
movsd %xmm1, 0x10(%rsp)
callq *0x2b8(%rax)
movsd 0x10(%rsp), %xmm1
addsd 0x28(%rbx), %xmm1
ucomisd 0x68(%rsp), %xmm1
ja 0x17cf0
movq 0x18(%r14), %r14
cmpq %rbp, %r14
jne 0x18158
xorpd %xmm0, %xmm0
movsd 0x60(%rsp), %xmm1
ucomisd %xmm0, %xmm1
jbe 0x182a8
xorpd %xmm0, %xmm0
leaq 0x20(%rsp), %rbx
movapd %xmm0, (%rbx)
movq $0x0, 0x10(%rbx)
movq %rbp, %r14
movq (%r14), %rsi
testq %rsi, %rsi
je 0x181de
addq $0x18, %rsi
movq %rbx, %rdi
callq 0x24922
movq 0x18(%r14), %r14
cmpq %rbp, %r14
jne 0x181ca
movq 0x20(%rsp), %rsi
movq 0x28(%rsp), %rax
subq %rsi, %rax
shrq $0x3, %rax
imull $0xaaaaaaab, %eax, %edx # imm = 0xAAAAAAAB
cmpl $0x4, %edx
jl 0x18287
leaq 0x70(%rsp), %rdi
xorl %ebx, %ebx
xorl %ecx, %ecx
callq 0x3b91c
movq 0x20(%rsp), %rax
cmpq %rax, 0x28(%rsp)
setne %r14b
je 0x18281
movl $0x1, %r15d
xorl %ecx, %ecx
leaq 0x70(%rsp), %rbx
movabsq $-0x5555555555555555, %r12 # imm = 0xAAAAAAAAAAAAAAAB
leaq (%rcx,%rcx,2), %rcx
leaq (%rax,%rcx,8), %rdi
movq %rbx, %rsi
callq 0x4a0b6
ucomisd 0x60(%rsp), %xmm0
ja 0x1827c
movl %r15d, %ecx
movq 0x20(%rsp), %rax
movq 0x28(%rsp), %rdx
subq %rax, %rdx
sarq $0x3, %rdx
imulq %r12, %rdx
incl %r15d
cmpq %rcx, %rdx
seta %r14b
ja 0x1823c
xorl %ebx, %ebx
jmp 0x18281
movl $0x1, %ebx
testb $0x1, %r14b
jne 0x18289
xorl %ebx, %ebx
movq 0x20(%rsp), %rdi
testq %rdi, %rdi
je 0x182a0
movq 0x30(%rsp), %rsi
subq %rdi, %rsi
callq 0xe450
testl %ebx, %ebx
jne 0x17cf0
movabsq $0x2000000000, %rax     # imm = 0x2000000000
leaq 0x70(%rsp), %rbx
movq %rax, 0x10(%rbx)
xorpd %xmm0, %xmm0
movapd %xmm0, (%rbx)
movupd %xmm0, 0x18(%rbx)
movq $0x0, 0x28(%rbx)
movl $0x1, 0x30(%rbx)
movl $0x28, 0x10(%rbx)
movq %rbp, %r14
movq %rbx, %rdi
movq %r14, %rsi
callq 0x24b3a
movq 0x18(%r14), %r14
cmpq %rbp, %r14
jne 0x182e1
movl 0x78(%rsp), %eax
cmpl $0x4, %eax
jl 0x184fd
leaq 0xc8(%rsp), %r15
leaq 0x70(%rsp), %rdi
callq 0x24c36
movq %rax, %rbx
movq (%rax), %r14
movq 0x10(%rax), %rax
movq 0x18(%rbx), %rcx
movq %rax, 0x40(%rsp)
movq (%rax), %rsi
movq %rcx, 0x50(%rsp)
movq (%rcx), %rcx
movq 0x8(%rsp), %rdi
movq (%rdi), %rax
movq %r14, %rdx
xorl %r8d, %r8d
callq *0x48(%rax)
testq %rax, %rax
je 0x18573
movq 0x20(%rax), %rcx
cmpq %r14, 0x8(%rcx)
je 0x1835c
cmpq %r14, 0x10(%rcx)
jne 0x18387
movq 0x28(%rax), %rcx
cmpq %r14, 0x8(%rcx)
je 0x1836c
cmpq %r14, 0x10(%rcx)
jne 0x18387
movq 0x30(%rax), %rax
cmpq %r14, 0x8(%rax)
je 0x18385
cmpq %r14, 0x10(%rax)
movl $0x0, %ecx
cmovneq %rax, %rcx
jmp 0x18387
xorl %ecx, %ecx
movq 0x10(%rbx), %rax
movq %rcx, 0x8(%rax)
movq 0x18(%rbx), %rcx
movq %rcx, 0x18(%rax)
movq 0x18(%rbx), %rcx
movq %rax, 0x10(%rcx)
movl $0x30, %esi
movq %rbx, %rdi
callq 0xe450
addq $0x18, %r14
movq %r14, 0xb0(%rsp)
xorl %r12d, %r12d
testl %r12d, %r12d
movq 0x50(%rsp), %r14
cmoveq 0x40(%rsp), %r14
movq 0x10(%r14), %rax
movq 0x18(%r14), %rcx
movq (%rax), %r13
movq (%rcx), %rbx
testb $0x2, 0x78(%r13)
jne 0x183ef
movq 0x8(%rsp), %rdi
movq (%rdi), %rax
movq %r13, %rsi
callq *0x2b0(%rax)
testb $0x2, 0x78(%rbx)
jne 0x18406
movq 0x8(%rsp), %rdi
movq (%rdi), %rax
movq %rbx, %rsi
callq *0x2b0(%rax)
leaq 0x18(%r13), %rsi
leaq 0x20(%rsp), %rdi
movq 0xb0(%rsp), %rbp
movq %rbp, %rdx
callq 0x3cc88
leaq 0x18(%rbx), %rsi
movq %r15, %rdi
movq %rbp, %rdx
callq 0x3cc88
leaq 0xe0(%rsp), %rdi
leaq 0x20(%rsp), %rbp
movq %rbp, %rsi
movq %r15, %rdx
callq 0x3de12
movq %rbp, %rdi
movq %r15, %rbp
movq %r15, %rsi
callq 0x4c77b
movapd %xmm0, 0x10(%rsp)
movq (%r14), %r15
testb $0x2, 0x78(%r15)
jne 0x18475
movq 0x8(%rsp), %rdi
movq (%rdi), %rax
movq %r15, %rsi
callq *0x2b0(%rax)
addq $0x30, %r15
leaq 0xe0(%rsp), %rdi
movq %r15, %rsi
callq 0x3d756
movsd %xmm0, 0x38(%rsp)
addq $0x30, %r13
addq $0x30, %rbx
movq %r13, %rdi
movq %rbx, %rsi
callq 0x4c77b
movsd 0x48(%rsp), %xmm1
movapd 0x10(%rsp), %xmm3
subsd %xmm3, %xmm1
xorpd %xmm2, %xmm2
cmpltsd 0x38(%rsp), %xmm2
andpd %xmm2, %xmm1
andnpd %xmm3, %xmm2
orpd %xmm1, %xmm2
addsd %xmm0, %xmm2
movsd %xmm2, 0x28(%r14)
leaq 0x70(%rsp), %rdi
movq %r14, %rsi
callq 0x24cd0
incl %r12d
cmpl $0x1, %r12d
movq %rbp, %r15
je 0x183bb
movl 0x78(%rsp), %eax
cmpl $0x4, %eax
jge 0x1830a
cmpl $0x3, %eax
jne 0x18573
leaq 0x70(%rsp), %rdi
callq 0x24c36
movq %rax, %rbx
movq (%rax), %rdx
movq 0x10(%rax), %rax
movq (%rax), %rsi
movq 0x18(%rbx), %rax
movq (%rax), %rcx
movq 0x8(%rsp), %rdi
movq (%rdi), %rax
xorl %r8d, %r8d
callq *0x48(%rax)
movl $0x30, %esi
movq %rbx, %rdi
callq 0xe450
leaq 0x70(%rsp), %rdi
callq 0x24c36
testq %rax, %rax
je 0x18557
movl $0x30, %esi
movq %rax, %rdi
callq 0xe450
leaq 0x70(%rsp), %rdi
callq 0x24c36
testq %rax, %rax
je 0x18573
movl $0x30, %esi
movq %rax, %rdi
callq 0xe450
movq 0x70(%rsp), %rdi
testq %rdi, %rdi
je 0x17cf0
callq 0xe5b0
jmp 0x17cf0
jmp 0x18597
jmp 0x185c1
jmp 0x185c1
jmp 0x18597
jmp 0x185c1
jmp 0x185c1
movq %rax, %rbx
movq 0x20(%rsp), %rdi
testq %rdi, %rdi
je 0x185d3
movq 0x30(%rsp), %rsi
subq %rdi, %rsi
callq 0xe450
jmp 0x185d3
jmp 0x185c1
jmp 0x185c1
jmp 0x185c1
jmp 0x185c1
jmp 0x185c1
jmp 0x185c1
jmp 0x185c1
movq %rax, %rbx
movq 0x70(%rsp), %rdi
testq %rdi, %rdi
je 0x185d3
callq 0xe5b0
movq %rbx, %rdi
callq 0xe7e0
nop