// File: grogers0[P]dots_and_boxes/./boost/algorithm/combination.hpp
// Function: bool boost::detail::next_combination<__gnu_cxx::__normal_iterator<Edge*, std::vector<Edge, std::allocator<Edge>>>>(__gnu_cxx::__normal_iterator<Edge*, std::vector<Edge, std::allocator<Edge>>>, __gnu_cxx::__normal_iterator<Edge*, std::vector<Edge, std::allocator<Edge>>>, __gnu_cxx::__normal_iterator<Edge*, std::vector<Edge, std::allocator<Edge>>>, __gnu_cxx::__normal_iterator<Edge*, std::vector<Edge, std::allocator<Edge>>>)
bool next_combination(BidirectionalIterator first1,
                        BidirectionalIterator last1,
                        BidirectionalIterator first2,
                        BidirectionalIterator last2)
  {
      if ((first1 == last1) || (first2 == last2)) {
          return false;
      }
      
      BidirectionalIterator m1 = last1;
      BidirectionalIterator m2 = last2; --m2;
      
      // Find first m1 not less than *m2 (i.e., lower_bound(first1, last1, *m2)).
      // Actually, this loop stops at one position before that, except perhaps
      // if m1 == first1 (in which case one must compare *first1 with *m2).
      while (--m1 != first1 && !(*m1 < *m2)) {
      }
      
      // Test if all elements in [first1, last1) not less than *m2.
      bool result = (m1 == first1) && !(*first1 < *m2);
      
      if (!result) {

          // Find first first2 greater than *m1 (since *m1 < *m2, we know it
          // can't pass m2 and there's no need to test m2).
          while (first2 != m2 && !(*m1 < *first2)) {
              ++first2;
          }
          
          first1 = m1;
          std::iter_swap (first1, first2);
          ++first1;
          ++first2;
      }
      
      // Merge [first1, last1) with [first2, last2), given that the rest of the
      // original ranges are sorted and compare appropriately.
      if ((first1 != last1) && (first2 != last2)) {      
          for (m1 = last1, m2 = first2;  (m1 != first1) && (m2 != last2); ++m2) {
              std::iter_swap (--m1, m2);
          }
          
          std::reverse (first1, m1);
          std::reverse (first1, last1);
          
          std::reverse (m2, last2);
          std::reverse (first2, last2);
      }
      
      return !result;
  }

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xe0, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq %rcx, -0x28(%rbp)
leaq -0x10(%rbp), %rdi
leaq -0x18(%rbp), %rsi
callq 0x9fc0
testb $0x1, %al
jne 0x9ccf
leaq -0x20(%rbp), %rdi
leaq -0x28(%rbp), %rsi
callq 0x9fc0
testb $0x1, %al
jne 0x9ccf
jmp 0x9cd8
movb $0x0, -0x1(%rbp)
jmp 0x9faa
movq -0x18(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x28(%rbp), %rax
movq %rax, -0x38(%rbp)
leaq -0x38(%rbp), %rdi
callq 0x98a0
leaq -0x30(%rbp), %rdi
callq 0x98a0
movq %rax, %rdi
leaq -0x10(%rbp), %rsi
callq 0x98c0
movb %al, %cl
xorl %eax, %eax
testb $0x1, %cl
movb %al, -0xa9(%rbp)
jne 0x9d17
jmp 0x9d4c
leaq -0x30(%rbp), %rdi
callq 0x8a40
movq %rax, -0xb8(%rbp)
leaq -0x38(%rbp), %rdi
callq 0x8a40
movq -0xb8(%rbp), %rdi
movl (%rax), %eax
movl %eax, -0x3c(%rbp)
movl -0x3c(%rbp), %esi
callq 0xa000
xorb $-0x1, %al
movb %al, -0xa9(%rbp)
movb -0xa9(%rbp), %al
testb $0x1, %al
jne 0x9d58
jmp 0x9d5a
jmp 0x9cf1
leaq -0x30(%rbp), %rdi
leaq -0x10(%rbp), %rsi
callq 0x9fc0
movb %al, %cl
xorl %eax, %eax
testb $0x1, %cl
movb %al, -0xb9(%rbp)
jne 0x9d78
jmp 0x9dad
leaq -0x10(%rbp), %rdi
callq 0x8a40
movq %rax, -0xc8(%rbp)
leaq -0x38(%rbp), %rdi
callq 0x8a40
movq -0xc8(%rbp), %rdi
movl (%rax), %eax
movl %eax, -0x44(%rbp)
movl -0x44(%rbp), %esi
callq 0xa000
xorb $-0x1, %al
movb %al, -0xb9(%rbp)
movb -0xb9(%rbp), %al
andb $0x1, %al
movb %al, -0x3d(%rbp)
testb $0x1, -0x3d(%rbp)
jne 0x9e65
jmp 0x9dc4
leaq -0x20(%rbp), %rdi
leaq -0x38(%rbp), %rsi
callq 0x98c0
movb %al, %cl
xorl %eax, %eax
testb $0x1, %cl
movb %al, -0xc9(%rbp)
jne 0x9de2
jmp 0x9e17
leaq -0x30(%rbp), %rdi
callq 0x8a40
movq %rax, -0xd8(%rbp)
leaq -0x20(%rbp), %rdi
callq 0x8a40
movq -0xd8(%rbp), %rdi
movl (%rax), %eax
movl %eax, -0x48(%rbp)
movl -0x48(%rbp), %esi
callq 0xa000
xorb $-0x1, %al
movb %al, -0xc9(%rbp)
movb -0xc9(%rbp), %al
testb $0x1, %al
jne 0x9e23
jmp 0x9e2e
leaq -0x20(%rbp), %rdi
callq 0x9c50
jmp 0x9dc4
movq -0x30(%rbp), %rax
movq %rax, -0x10(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x20(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x50(%rbp), %rdi
movq -0x58(%rbp), %rsi
callq 0xa100
leaq -0x10(%rbp), %rdi
callq 0x9c50
leaq -0x20(%rbp), %rdi
callq 0x9c50
leaq -0x10(%rbp), %rdi
leaq -0x18(%rbp), %rsi
callq 0x98c0
testb $0x1, %al
jne 0x9e7b
jmp 0x9fa0
leaq -0x20(%rbp), %rdi
leaq -0x28(%rbp), %rsi
callq 0x98c0
testb $0x1, %al
jne 0x9e91
jmp 0x9fa0
movq -0x18(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x20(%rbp), %rax
movq %rax, -0x38(%rbp)
leaq -0x30(%rbp), %rdi
leaq -0x10(%rbp), %rsi
callq 0x98c0
movb %al, %cl
xorl %eax, %eax
testb $0x1, %cl
movb %al, -0xd9(%rbp)
jne 0x9ebf
jmp 0x9ed2
leaq -0x38(%rbp), %rdi
leaq -0x28(%rbp), %rsi
callq 0x98c0
movb %al, -0xd9(%rbp)
movb -0xd9(%rbp), %al
testb $0x1, %al
jne 0x9ede
jmp 0x9f0e
leaq -0x30(%rbp), %rdi
callq 0x98a0
movq (%rax), %rax
movq %rax, -0x60(%rbp)
movq -0x38(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x60(%rbp), %rdi
movq -0x68(%rbp), %rsi
callq 0xa100
leaq -0x38(%rbp), %rdi
callq 0x9c50
jmp 0x9ea1
movq -0x10(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x30(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x70(%rbp), %rdi
movq -0x78(%rbp), %rsi
callq 0xa140
movq -0x10(%rbp), %rax
movq %rax, -0x80(%rbp)
movq -0x18(%rbp), %rax
movq %rax, -0x88(%rbp)
movq -0x80(%rbp), %rdi
movq -0x88(%rbp), %rsi
callq 0xa140
movq -0x38(%rbp), %rax
movq %rax, -0x90(%rbp)
movq -0x28(%rbp), %rax
movq %rax, -0x98(%rbp)
movq -0x90(%rbp), %rdi
movq -0x98(%rbp), %rsi
callq 0xa140
movq -0x20(%rbp), %rax
movq %rax, -0xa0(%rbp)
movq -0x28(%rbp), %rax
movq %rax, -0xa8(%rbp)
movq -0xa0(%rbp), %rdi
movq -0xa8(%rbp), %rsi
callq 0xa140
movb -0x3d(%rbp), %al
xorb $-0x1, %al
andb $0x1, %al
movb %al, -0x1(%rbp)
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0xe0, %rsp
popq %rbp
retq
nopl (%rax,%rax)