// File: hzeller[P]gcode-multi-shell-extrude/third_party/clipper.cpp
// Function: ClipperLib::Clipper::IntersectEdges(ClipperLib::TEdge*, ClipperLib::TEdge*, ClipperLib::IntPoint const&, bool)
void Clipper::IntersectEdges(TEdge *e1, TEdge *e2,
     const IntPoint &Pt, bool protect)
{
  //e1 will be to the Left of e2 BELOW the intersection. Therefore e1 is before
  //e2 in AEL except when e1 is being inserted at the intersection point ...
  bool e1stops = !protect &&  !e1->NextInLML &&
    e1->Top.X == Pt.X && e1->Top.Y == Pt.Y;
  bool e2stops = !protect &&  !e2->NextInLML &&
    e2->Top.X == Pt.X && e2->Top.Y == Pt.Y;
  bool e1Contributing = ( e1->OutIdx >= 0 );
  bool e2Contributing = ( e2->OutIdx >= 0 );

#ifdef use_lines
  //if either edge is on an OPEN path ...
  if (e1->WindDelta == 0 || e2->WindDelta == 0)
  {
    //ignore subject-subject open path intersections UNLESS they
    //are both open paths, AND they are both 'contributing maximas' ...
    if (e1->WindDelta == 0 && e2->WindDelta == 0)
    {
      if ((e1stops || e2stops) && e1Contributing && e2Contributing)
        AddLocalMaxPoly(e1, e2, Pt);
    }

    //if intersecting a subj line with a subj poly ...
    else if (e1->PolyTyp == e2->PolyTyp && 
      e1->WindDelta != e2->WindDelta && m_ClipType == ctUnion)
    {
      if (e1->WindDelta == 0)
      {
        if (e2Contributing)
        {
          AddOutPt(e1, Pt);
          if (e1Contributing) e1->OutIdx = Unassigned;
        }
      }
      else
      {
        if (e1Contributing)
        {
          AddOutPt(e2, Pt);
          if (e2Contributing) e2->OutIdx = Unassigned;
        }
      }
    }
    else if (e1->PolyTyp != e2->PolyTyp)
    {
      //toggle subj open path OutIdx on/off when Abs(clip.WndCnt) == 1 ...
      if ((e1->WindDelta == 0) && abs(e2->WindCnt) == 1 && 
        (m_ClipType != ctUnion || e2->WindCnt2 == 0))
      {
        AddOutPt(e1, Pt);
        if (e1Contributing) e1->OutIdx = Unassigned;
      }
      else if ((e2->WindDelta == 0) && (abs(e1->WindCnt) == 1) && 
        (m_ClipType != ctUnion || e1->WindCnt2 == 0))
      {
        AddOutPt(e2, Pt);
        if (e2Contributing) e2->OutIdx = Unassigned;
      }
    }

    if (e1stops)
      if (e1->OutIdx < 0) DeleteFromAEL(e1);
      else throw clipperException("Error intersecting polylines");
    if (e2stops) 
      if (e2->OutIdx < 0) DeleteFromAEL(e2);
      else throw clipperException("Error intersecting polylines");
    return;
  }
#endif

  //update winding counts...
  //assumes that e1 will be to the Right of e2 ABOVE the intersection
  if ( e1->PolyTyp == e2->PolyTyp )
  {
    if ( IsEvenOddFillType( *e1) )
    {
      int oldE1WindCnt = e1->WindCnt;
      e1->WindCnt = e2->WindCnt;
      e2->WindCnt = oldE1WindCnt;
    } else
    {
      if (e1->WindCnt + e2->WindDelta == 0 ) e1->WindCnt = -e1->WindCnt;
      else e1->WindCnt += e2->WindDelta;
      if ( e2->WindCnt - e1->WindDelta == 0 ) e2->WindCnt = -e2->WindCnt;
      else e2->WindCnt -= e1->WindDelta;
    }
  } else
  {
    if (!IsEvenOddFillType(*e2)) e1->WindCnt2 += e2->WindDelta;
    else e1->WindCnt2 = ( e1->WindCnt2 == 0 ) ? 1 : 0;
    if (!IsEvenOddFillType(*e1)) e2->WindCnt2 -= e1->WindDelta;
    else e2->WindCnt2 = ( e2->WindCnt2 == 0 ) ? 1 : 0;
  }

  PolyFillType e1FillType, e2FillType, e1FillType2, e2FillType2;
  if (e1->PolyTyp == ptSubject)
  {
    e1FillType = m_SubjFillType;
    e1FillType2 = m_ClipFillType;
  } else
  {
    e1FillType = m_ClipFillType;
    e1FillType2 = m_SubjFillType;
  }
  if (e2->PolyTyp == ptSubject)
  {
    e2FillType = m_SubjFillType;
    e2FillType2 = m_ClipFillType;
  } else
  {
    e2FillType = m_ClipFillType;
    e2FillType2 = m_SubjFillType;
  }

  cInt e1Wc, e2Wc;
  switch (e1FillType)
  {
    case pftPositive: e1Wc = e1->WindCnt; break;
    case pftNegative: e1Wc = -e1->WindCnt; break;
    default: e1Wc = Abs(e1->WindCnt);
  }
  switch(e2FillType)
  {
    case pftPositive: e2Wc = e2->WindCnt; break;
    case pftNegative: e2Wc = -e2->WindCnt; break;
    default: e2Wc = Abs(e2->WindCnt);
  }

  if ( e1Contributing && e2Contributing )
  {
    if ( e1stops || e2stops || 
      (e1Wc != 0 && e1Wc != 1) || (e2Wc != 0 && e2Wc != 1) ||
      (e1->PolyTyp != e2->PolyTyp && m_ClipType != ctXor) )
        AddLocalMaxPoly(e1, e2, Pt); 
    else
    {
      AddOutPt(e1, Pt);
      AddOutPt(e2, Pt);
      SwapSides( *e1 , *e2 );
      SwapPolyIndexes( *e1 , *e2 );
    }
  }
  else if ( e1Contributing )
  {
    if (e2Wc == 0 || e2Wc == 1) 
    {
      AddOutPt(e1, Pt);
      SwapSides(*e1, *e2);
      SwapPolyIndexes(*e1, *e2);
    }
  }
  else if ( e2Contributing )
  {
    if (e1Wc == 0 || e1Wc == 1) 
    {
      AddOutPt(e2, Pt);
      SwapSides(*e1, *e2);
      SwapPolyIndexes(*e1, *e2);
    }
  } 
  else if ( (e1Wc == 0 || e1Wc == 1) && 
    (e2Wc == 0 || e2Wc == 1) && !e1stops && !e2stops )
  {
    //neither edge is currently contributing ...

    cInt e1Wc2, e2Wc2;
    switch (e1FillType2)
    {
      case pftPositive: e1Wc2 = e1->WindCnt2; break;
      case pftNegative : e1Wc2 = -e1->WindCnt2; break;
      default: e1Wc2 = Abs(e1->WindCnt2);
    }
    switch (e2FillType2)
    {
      case pftPositive: e2Wc2 = e2->WindCnt2; break;
      case pftNegative: e2Wc2 = -e2->WindCnt2; break;
      default: e2Wc2 = Abs(e2->WindCnt2);
    }

    if (e1->PolyTyp != e2->PolyTyp)
        AddLocalMinPoly(e1, e2, Pt);
    else if (e1Wc == 1 && e2Wc == 1)
      switch( m_ClipType ) {
        case ctIntersection:
          if (e1Wc2 > 0 && e2Wc2 > 0)
            AddLocalMinPoly(e1, e2, Pt);
          break;
        case ctUnion:
          if ( e1Wc2 <= 0 && e2Wc2 <= 0 )
            AddLocalMinPoly(e1, e2, Pt);
          break;
        case ctDifference:
          if (((e1->PolyTyp == ptClip) && (e1Wc2 > 0) && (e2Wc2 > 0)) ||
              ((e1->PolyTyp == ptSubject) && (e1Wc2 <= 0) && (e2Wc2 <= 0)))
                AddLocalMinPoly(e1, e2, Pt);
          break;
        case ctXor:
          AddLocalMinPoly(e1, e2, Pt);
      }
    else
      SwapSides( *e1, *e2 );
  }

  if(  (e1stops != e2stops) &&
    ( (e1stops && (e1->OutIdx >= 0)) || (e2stops && (e2->OutIdx >= 0)) ) )
  {
    SwapSides( *e1, *e2 );
    SwapPolyIndexes( *e1, *e2 );
  }

  //finally, delete any non-contributing maxima edges  ...
  if( e1stops ) DeleteFromAEL( e1 );
  if( e2stops ) DeleteFromAEL( e2 );
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x90, %rsp
movb %r8b, %al
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
andb $0x1, %al
movb %al, -0x21(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x70(%rbp)
xorl %eax, %eax
testb $0x1, -0x21(%rbp)
movb %al, -0x61(%rbp)
jne 0x18022
movq -0x10(%rbp), %rcx
xorl %eax, %eax
cmpq $0x0, 0x70(%rcx)
movb %al, -0x61(%rbp)
jne 0x18022
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rcx
movq -0x20(%rbp), %rdx
xorl %eax, %eax
cmpq (%rdx), %rcx
movb %al, -0x61(%rbp)
jne 0x18022
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x20(%rbp), %rcx
cmpq 0x8(%rcx), %rax
sete %al
movb %al, -0x61(%rbp)
movb -0x61(%rbp), %al
andb $0x1, %al
movb %al, -0x22(%rbp)
xorl %eax, %eax
testb $0x1, -0x21(%rbp)
movb %al, -0x71(%rbp)
jne 0x18071
movq -0x18(%rbp), %rcx
xorl %eax, %eax
cmpq $0x0, 0x70(%rcx)
movb %al, -0x71(%rbp)
jne 0x18071
movq -0x18(%rbp), %rax
movq 0x20(%rax), %rcx
movq -0x20(%rbp), %rdx
xorl %eax, %eax
cmpq (%rdx), %rcx
movb %al, -0x71(%rbp)
jne 0x18071
movq -0x18(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x20(%rbp), %rcx
cmpq 0x8(%rcx), %rax
sete %al
movb %al, -0x71(%rbp)
movb -0x71(%rbp), %al
andb $0x1, %al
movb %al, -0x23(%rbp)
movq -0x10(%rbp), %rax
cmpl $0x0, 0x5c(%rax)
setge %al
andb $0x1, %al
movb %al, -0x24(%rbp)
movq -0x18(%rbp), %rax
cmpl $0x0, 0x5c(%rax)
setge %al
andb $0x1, %al
movb %al, -0x25(%rbp)
movq -0x10(%rbp), %rax
movl 0x48(%rax), %eax
movq -0x18(%rbp), %rcx
cmpl 0x48(%rcx), %eax
jne 0x18159
movq -0x70(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x17070
testb $0x1, %al
jne 0x180c0
jmp 0x180e4
movq -0x10(%rbp), %rax
movl 0x54(%rax), %eax
movl %eax, -0x2c(%rbp)
movq -0x18(%rbp), %rax
movl 0x54(%rax), %ecx
movq -0x10(%rbp), %rax
movl %ecx, 0x54(%rax)
movl -0x2c(%rbp), %ecx
movq -0x18(%rbp), %rax
movl %ecx, 0x54(%rax)
jmp 0x18154
movq -0x10(%rbp), %rax
movl 0x54(%rax), %eax
movq -0x18(%rbp), %rcx
addl 0x50(%rcx), %eax
cmpl $0x0, %eax
jne 0x18109
movq -0x10(%rbp), %rax
xorl %ecx, %ecx
subl 0x54(%rax), %ecx
movq -0x10(%rbp), %rax
movl %ecx, 0x54(%rax)
jmp 0x1811a
movq -0x18(%rbp), %rax
movl 0x50(%rax), %ecx
movq -0x10(%rbp), %rax
addl 0x54(%rax), %ecx
movl %ecx, 0x54(%rax)
movq -0x18(%rbp), %rax
movl 0x54(%rax), %eax
movq -0x10(%rbp), %rcx
subl 0x50(%rcx), %eax
cmpl $0x0, %eax
jne 0x1813f
movq -0x18(%rbp), %rax
xorl %ecx, %ecx
subl 0x54(%rax), %ecx
movq -0x18(%rbp), %rax
movl %ecx, 0x54(%rax)
jmp 0x18152
movq -0x10(%rbp), %rax
movl 0x50(%rax), %edx
movq -0x18(%rbp), %rax
movl 0x54(%rax), %ecx
subl %edx, %ecx
movl %ecx, 0x54(%rax)
jmp 0x18154
jmp 0x181db
movq -0x70(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x17070
testb $0x1, %al
jne 0x1817d
movq -0x18(%rbp), %rax
movl 0x50(%rax), %ecx
movq -0x10(%rbp), %rax
addl 0x58(%rax), %ecx
movl %ecx, 0x58(%rax)
jmp 0x18198
movq -0x10(%rbp), %rax
movl 0x58(%rax), %edx
xorl %ecx, %ecx
movl $0x1, %eax
cmpl $0x0, %edx
cmovel %eax, %ecx
movq -0x10(%rbp), %rax
movl %ecx, 0x58(%rax)
movq -0x70(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x17070
testb $0x1, %al
jne 0x181be
movq -0x10(%rbp), %rax
movl 0x50(%rax), %edx
movq -0x18(%rbp), %rax
movl 0x58(%rax), %ecx
subl %edx, %ecx
movl %ecx, 0x58(%rax)
jmp 0x181d9
movq -0x18(%rbp), %rax
movl 0x58(%rax), %edx
xorl %ecx, %ecx
movl $0x1, %eax
cmpl $0x0, %edx
cmovel %eax, %ecx
movq -0x18(%rbp), %rax
movl %ecx, 0x58(%rax)
jmp 0x181db
movq -0x10(%rbp), %rax
cmpl $0x0, 0x48(%rax)
jne 0x181fd
movq -0x70(%rbp), %rax
movl 0xb8(%rax), %ecx
movl %ecx, -0x30(%rbp)
movl 0xb4(%rax), %eax
movl %eax, -0x38(%rbp)
jmp 0x18213
movq -0x70(%rbp), %rax
movl 0xb4(%rax), %ecx
movl %ecx, -0x30(%rbp)
movl 0xb8(%rax), %eax
movl %eax, -0x38(%rbp)
movq -0x18(%rbp), %rax
cmpl $0x0, 0x48(%rax)
jne 0x18235
movq -0x70(%rbp), %rax
movl 0xb8(%rax), %ecx
movl %ecx, -0x34(%rbp)
movl 0xb4(%rax), %eax
movl %eax, -0x3c(%rbp)
jmp 0x1824b
movq -0x70(%rbp), %rax
movl 0xb4(%rax), %ecx
movl %ecx, -0x34(%rbp)
movl 0xb8(%rax), %eax
movl %eax, -0x3c(%rbp)
movl -0x30(%rbp), %eax
movl %eax, -0x78(%rbp)
subl $0x2, %eax
je 0x18262
jmp 0x18258
movl -0x78(%rbp), %eax
subl $0x3, %eax
je 0x18270
jmp 0x18281
movq -0x10(%rbp), %rax
movslq 0x54(%rax), %rax
movq %rax, -0x48(%rbp)
jmp 0x18292
movq -0x10(%rbp), %rcx
xorl %eax, %eax
subl 0x54(%rcx), %eax
cltq
movq %rax, -0x48(%rbp)
jmp 0x18292
movq -0x10(%rbp), %rax
movslq 0x54(%rax), %rdi
callq 0x20680
movq %rax, -0x48(%rbp)
movl -0x34(%rbp), %eax
movl %eax, -0x7c(%rbp)
subl $0x2, %eax
je 0x182a9
jmp 0x1829f
movl -0x7c(%rbp), %eax
subl $0x3, %eax
je 0x182b7
jmp 0x182c8
movq -0x18(%rbp), %rax
movslq 0x54(%rax), %rax
movq %rax, -0x50(%rbp)
jmp 0x182d9
movq -0x18(%rbp), %rcx
xorl %eax, %eax
subl 0x54(%rcx), %eax
cltq
movq %rax, -0x50(%rbp)
jmp 0x182d9
movq -0x18(%rbp), %rax
movslq 0x54(%rax), %rdi
callq 0x20680
movq %rax, -0x50(%rbp)
testb $0x1, -0x24(%rbp)
je 0x18387
testb $0x1, -0x25(%rbp)
je 0x18387
testb $0x1, -0x22(%rbp)
jne 0x1832f
testb $0x1, -0x23(%rbp)
jne 0x1832f
cmpq $0x0, -0x48(%rbp)
je 0x18307
cmpq $0x1, -0x48(%rbp)
jne 0x1832f
cmpq $0x0, -0x50(%rbp)
je 0x18315
cmpq $0x1, -0x50(%rbp)
jne 0x1832f
movq -0x10(%rbp), %rax
movl 0x48(%rax), %eax
movq -0x18(%rbp), %rcx
cmpl 0x48(%rcx), %eax
je 0x18346
movq -0x70(%rbp), %rax
cmpl $0x3, 0x68(%rax)
je 0x18346
movq -0x70(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
callq 0x17900
jmp 0x18382
movq -0x70(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x175e0
movq -0x70(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x175e0
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x21060
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x21090
jmp 0x1860c
testb $0x1, -0x24(%rbp)
je 0x183cb
cmpq $0x0, -0x50(%rbp)
je 0x1839b
cmpq $0x1, -0x50(%rbp)
jne 0x183c6
movq -0x70(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x175e0
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x21060
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x21090
jmp 0x1860a
testb $0x1, -0x25(%rbp)
je 0x1840f
cmpq $0x0, -0x48(%rbp)
je 0x183df
cmpq $0x1, -0x48(%rbp)
jne 0x1840a
movq -0x70(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x175e0
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x21060
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x21090
jmp 0x18608
cmpq $0x0, -0x48(%rbp)
je 0x18421
cmpq $0x1, -0x48(%rbp)
jne 0x18606
cmpq $0x0, -0x50(%rbp)
je 0x18433
cmpq $0x1, -0x50(%rbp)
jne 0x18606
testb $0x1, -0x22(%rbp)
jne 0x18606
testb $0x1, -0x23(%rbp)
jne 0x18606
movl -0x38(%rbp), %eax
movl %eax, -0x80(%rbp)
subl $0x2, %eax
je 0x1845e
jmp 0x18454
movl -0x80(%rbp), %eax
subl $0x3, %eax
je 0x1846c
jmp 0x1847d
movq -0x10(%rbp), %rax
movslq 0x58(%rax), %rax
movq %rax, -0x58(%rbp)
jmp 0x1848e
movq -0x10(%rbp), %rcx
xorl %eax, %eax
subl 0x58(%rcx), %eax
cltq
movq %rax, -0x58(%rbp)
jmp 0x1848e
movq -0x10(%rbp), %rax
movslq 0x58(%rax), %rdi
callq 0x20680
movq %rax, -0x58(%rbp)
movl -0x3c(%rbp), %eax
movl %eax, -0x84(%rbp)
subl $0x2, %eax
je 0x184ab
jmp 0x1849e
movl -0x84(%rbp), %eax
subl $0x3, %eax
je 0x184b9
jmp 0x184ca
movq -0x18(%rbp), %rax
movslq 0x58(%rax), %rax
movq %rax, -0x60(%rbp)
jmp 0x184db
movq -0x18(%rbp), %rcx
xorl %eax, %eax
subl 0x58(%rcx), %eax
cltq
movq %rax, -0x60(%rbp)
jmp 0x184db
movq -0x18(%rbp), %rax
movslq 0x58(%rax), %rdi
callq 0x20680
movq %rax, -0x60(%rbp)
movq -0x10(%rbp), %rax
movl 0x48(%rax), %eax
movq -0x18(%rbp), %rcx
cmpl 0x48(%rcx), %eax
je 0x18505
movq -0x70(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
callq 0x173e0
jmp 0x18604
cmpq $0x1, -0x48(%rbp)
jne 0x185f5
cmpq $0x1, -0x50(%rbp)
jne 0x185f5
movq -0x70(%rbp), %rax
movl 0x68(%rax), %eax
movq %rax, -0x90(%rbp)
subq $0x3, %rax
ja 0x185f3
movq -0x90(%rbp), %rax
leaq 0x141a7(%rip), %rcx     # 0x2c6e8
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
cmpq $0x0, -0x58(%rbp)
jle 0x1856d
cmpq $0x0, -0x60(%rbp)
jle 0x1856d
movq -0x70(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
callq 0x173e0
jmp 0x185f3
cmpq $0x0, -0x58(%rbp)
jg 0x18595
cmpq $0x0, -0x60(%rbp)
jg 0x18595
movq -0x70(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
callq 0x173e0
jmp 0x185f3
movq -0x10(%rbp), %rax
cmpl $0x1, 0x48(%rax)
jne 0x185af
cmpq $0x0, -0x58(%rbp)
jle 0x185af
cmpq $0x0, -0x60(%rbp)
jg 0x185c7
movq -0x10(%rbp), %rax
cmpl $0x0, 0x48(%rax)
jne 0x185dc
cmpq $0x0, -0x58(%rbp)
jg 0x185dc
cmpq $0x0, -0x60(%rbp)
jg 0x185dc
movq -0x70(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
callq 0x173e0
jmp 0x185f3
movq -0x70(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
callq 0x173e0
jmp 0x18602
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x21060
jmp 0x18604
jmp 0x18606
jmp 0x18608
jmp 0x1860a
jmp 0x1860c
movb -0x22(%rbp), %al
andb $0x1, %al
movzbl %al, %eax
movb -0x23(%rbp), %cl
andb $0x1, %cl
movzbl %cl, %ecx
cmpl %ecx, %eax
je 0x1865b
testb $0x1, -0x22(%rbp)
je 0x18631
movq -0x10(%rbp), %rax
cmpl $0x0, 0x5c(%rax)
jge 0x18641
testb $0x1, -0x23(%rbp)
je 0x1865b
movq -0x18(%rbp), %rax
cmpl $0x0, 0x5c(%rax)
jl 0x1865b
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x21060
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x21090
testb $0x1, -0x22(%rbp)
je 0x1866e
movq -0x70(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x18690
testb $0x1, -0x23(%rbp)
je 0x18681
movq -0x70(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x18690
addq $0x90, %rsp
popq %rbp
retq
nopw (%rax,%rax)