// File: Kei18[P]pibt/./src/solver/pps.cpp
// Function: PPS::PUSH(Agent*, std::vector<Node*, std::allocator<Node*>>&, bool)
RES PPS::PUSH(Agent* c, Nodes &T, bool swap) {
  if (inArray(c, H)) return RES::FAIL;   // l.1
  if (inArray(c, M)) return RES::PAUSE;  // l.2
  if (swap == false && inArray(c, U)) return PAUSE;  // l.3

  auto itrU = std::find(U.begin(), U.end(), c);
  if (itrU != U.end()) U.erase(itrU);  // l.4

  Nodes pi;
  RES attempt;
  if (isTmpGoals[c->getId()]) {  // l.5, used when swapping, case 3
    S* s = getS(c);
    // error check
    if (!inArray(s, doneSwapers) && s->phase != SWAPPHASE::CLEARING) {
      std::cout << "error@PPS::PUSH, invalid swap phase, s : "
                << s->id << ", phase : " << s->phase << "\n";
      std::exit(1);
    }
    pi = SHORTEST_PATH(c->getNode(), c->getGoal(), T);  // l.6
    attempt = FEASIBLE(c, pi, T, swap);     // l.16

  } else {

    pi = SHORTEST_PATH(c, c->getGoal(), T); // l.8
    attempt = FEASIBLE(c, pi, T, swap);     // l.9

    // exclude swap detected agents
    if (attempt == RES::FAIL && !inArray(c, pusherToSwaper)) {  // l.12
      Nodes Y = CLOSEST_EMPTY_VERTICLES(c);

      if (!Y.empty()) {
        Node* g = c->getGoal();
        Node* e = *std::min_element(Y.begin(), Y.end(),
                                   [this, g] (Node* e1, Node* e2)
                                   { return this->pathDist(e1, g)
                                       < this->pathDist(e2, g); });  // l.14
        pi = SHORTEST_PATH(c, e, T);  // l.15
        attempt = FEASIBLE(c, pi, T, swap);  // l.16
      }
    }
  }

  if (attempt == RES::SUCCESS) {  // l.17
    move(c, pi);  // l.18
    M.push_back(c);  // l.18
  }

  return attempt;  // l.19
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x240, %rsp            # imm = 0x240
movb %cl, %al
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
andb $0x1, %al
movb %al, -0x21(%rbp)
movq -0x10(%rbp), %rsi
movq %rsi, -0x158(%rbp)
movq -0x18(%rbp), %rdi
addq $0x128, %rsi            # imm = 0x128
callq 0x8f430
testb $0x1, %al
jne 0x8f60f
jmp 0x8f61b
movl $0x1, -0x4(%rbp)
jmp 0x8fc6a
movq -0x158(%rbp), %rsi
movq -0x18(%rbp), %rdi
addq $0xe0, %rsi
callq 0x8f430
testb $0x1, %al
jne 0x8f638
jmp 0x8f644
movl $0x2, -0x4(%rbp)
jmp 0x8fc6a
movb -0x21(%rbp), %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
jne 0x8f67a
movq -0x158(%rbp), %rsi
movq -0x18(%rbp), %rdi
addq $0xf8, %rsi
callq 0x8f430
testb $0x1, %al
jne 0x8f66e
jmp 0x8f67a
movl $0x2, -0x4(%rbp)
jmp 0x8fc6a
movq -0x158(%rbp), %rdi
addq $0xf8, %rdi
callq 0x39b60
movq -0x158(%rbp), %rdi
movq %rax, -0x38(%rbp)
addq $0xf8, %rdi
callq 0x399f0
movq %rax, -0x40(%rbp)
movq -0x38(%rbp), %rdi
movq -0x40(%rbp), %rsi
leaq -0x18(%rbp), %rdx
callq 0x8be30
movq -0x158(%rbp), %rdi
movq %rax, -0x30(%rbp)
addq $0xf8, %rdi
callq 0x399f0
movq %rax, -0x48(%rbp)
leaq -0x30(%rbp), %rdi
leaq -0x48(%rbp), %rsi
callq 0x51bd0
testb $0x1, %al
jne 0x8f6e7
jmp 0x8f71c
movq -0x158(%rbp), %rax
addq $0xf8, %rax
movq %rax, -0x160(%rbp)
leaq -0x50(%rbp), %rdi
leaq -0x30(%rbp), %rsi
callq 0x628b0
movq -0x160(%rbp), %rdi
movq -0x50(%rbp), %rsi
callq 0x8bf70
movq %rax, -0x58(%rbp)
leaq -0x70(%rbp), %rdi
callq 0x3e880
movq -0x158(%rbp), %rax
addq $0x160, %rax            # imm = 0x160
movq %rax, -0x170(%rbp)
movq -0x18(%rbp), %rdi
callq 0x63b50
movl %eax, -0x164(%rbp)
jmp 0x8f74a
movq -0x170(%rbp), %rdi
movl -0x164(%rbp), %eax
movslq %eax, %rsi
callq 0x96f20
movq %rdx, -0x180(%rbp)
movq %rax, -0x178(%rbp)
jmp 0x8f76f
movq -0x180(%rbp), %rax
movq -0x178(%rbp), %rcx
movq %rcx, -0x88(%rbp)
movq %rax, -0x80(%rbp)
leaq -0x88(%rbp), %rdi
callq 0x96f80
testb $0x1, %al
jne 0x8f79d
jmp 0x8f9a5
movq -0x158(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x8fc90
movq %rax, -0x188(%rbp)
jmp 0x8f7b6
movq -0x158(%rbp), %rsi
movq -0x188(%rbp), %rax
movq %rax, -0xa0(%rbp)
movq -0xa0(%rbp), %rdi
addq $0xc8, %rsi
callq 0x8fd90
movb %al, -0x189(%rbp)
jmp 0x8f7e6
movb -0x189(%rbp), %al
testb $0x1, %al
jne 0x8f8b2
jmp 0x8f7f6
movq -0xa0(%rbp), %rax
cmpl $0x1, 0x78(%rax)
je 0x8f8b2
movq 0x7178a(%rip), %rdi     # 0x100f98
leaq 0x27310(%rip), %rsi     # 0xb6b25
callq 0x84d0
movq %rax, -0x198(%rbp)
jmp 0x8f823
movq -0x198(%rbp), %rdi
movq -0xa0(%rbp), %rax
movl (%rax), %esi
callq 0x8860
movq %rax, -0x1a0(%rbp)
jmp 0x8f841
movq -0x1a0(%rbp), %rdi
leaq 0x27300(%rip), %rsi     # 0xb6b4f
callq 0x84d0
movq %rax, -0x1a8(%rbp)
jmp 0x8f85d
movq -0x1a8(%rbp), %rdi
movq -0xa0(%rbp), %rax
movl 0x78(%rax), %esi
callq 0x8860
movq %rax, -0x1b0(%rbp)
jmp 0x8f87c
movq -0x1b0(%rbp), %rdi
leaq 0x23d2d(%rip), %rsi     # 0xb35b7
callq 0x84d0
jmp 0x8f891
movl $0x1, %edi
callq 0x85d0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x90(%rbp)
movl %eax, -0x94(%rbp)
jmp 0x8fc5f
movq -0x18(%rbp), %rdi
callq 0x51cb0
movq %rax, -0x1b8(%rbp)
jmp 0x8f8c4
movq -0x18(%rbp), %rdi
callq 0x56820
movq %rax, -0x1c0(%rbp)
jmp 0x8f8d6
movq -0x20(%rbp), %rsi
leaq -0xd0(%rbp), %rdi
callq 0x3aff0
jmp 0x8f8e8
movq -0x1c0(%rbp), %rcx
movq -0x1b8(%rbp), %rdx
movq -0x158(%rbp), %rsi
leaq -0xb8(%rbp), %rdi
leaq -0xd0(%rbp), %r8
callq 0x8fe00
jmp 0x8f912
leaq -0x70(%rbp), %rdi
movq %rdi, -0x1d0(%rbp)
leaq -0xb8(%rbp), %rsi
movq %rsi, -0x1d8(%rbp)
callq 0x3f230
movq -0x1d8(%rbp), %rdi
callq 0xd7d0
leaq -0xd0(%rbp), %rdi
callq 0xd7d0
movq -0x158(%rbp), %rdi
movq -0x1d0(%rbp), %rdx
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rcx
movzbl -0x21(%rbp), %r8d
andl $0x1, %r8d
callq 0x8fe50
movl %eax, -0x1c4(%rbp)
jmp 0x8f974
movl -0x1c4(%rbp), %eax
movl %eax, -0x74(%rbp)
jmp 0x8fc17
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x90(%rbp)
movl %eax, -0x94(%rbp)
leaq -0xd0(%rbp), %rdi
callq 0xd7d0
jmp 0x8fc5f
movq -0x18(%rbp), %rdi
movq %rdi, -0x1e8(%rbp)
callq 0x56820
movq %rax, -0x1e0(%rbp)
jmp 0x8f9be
movq -0x1e0(%rbp), %rcx
movq -0x1e8(%rbp), %rdx
movq -0x158(%rbp), %rsi
movq -0x20(%rbp), %r8
leaq -0xe8(%rbp), %rdi
callq 0x90450
jmp 0x8f9e5
leaq -0x70(%rbp), %rdi
movq %rdi, -0x1f8(%rbp)
leaq -0xe8(%rbp), %rsi
movq %rsi, -0x200(%rbp)
callq 0x3f230
movq -0x200(%rbp), %rdi
callq 0xd7d0
movq -0x158(%rbp), %rdi
movq -0x1f8(%rbp), %rdx
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rcx
movzbl -0x21(%rbp), %r8d
andl $0x1, %r8d
callq 0x8fe50
movl %eax, -0x1ec(%rbp)
jmp 0x8fa3b
movl -0x1ec(%rbp), %eax
movl %eax, -0x74(%rbp)
cmpl $0x1, -0x74(%rbp)
jne 0x8fc15
movq -0x158(%rbp), %rsi
movq -0x18(%rbp), %rdi
addq $0x98, %rsi
callq 0x8f430
movb %al, -0x201(%rbp)
jmp 0x8fa6d
movb -0x201(%rbp), %al
testb $0x1, %al
jne 0x8fc15
jmp 0x8fa7d
movq -0x158(%rbp), %rsi
movq -0x18(%rbp), %rdx
leaq -0x100(%rbp), %rdi
callq 0x905f0
jmp 0x8fa96
leaq -0x100(%rbp), %rdi
callq 0x3ec00
testb $0x1, %al
jne 0x8fc09
movq -0x18(%rbp), %rdi
callq 0x56820
movq %rax, -0x210(%rbp)
jmp 0x8fabc
movq -0x210(%rbp), %rax
movq %rax, -0x108(%rbp)
leaq -0x100(%rbp), %rdi
movq %rdi, -0x220(%rbp)
callq 0x3b730
movq -0x220(%rbp), %rdi
movq %rax, -0x120(%rbp)
callq 0x3b760
movq %rax, %rcx
movq -0x158(%rbp), %rax
movq %rcx, -0x128(%rbp)
movq %rax, -0x138(%rbp)
movq -0x108(%rbp), %rax
movq %rax, -0x130(%rbp)
movq -0x120(%rbp), %rdi
movq -0x128(%rbp), %rsi
movq -0x138(%rbp), %rdx
movq -0x130(%rbp), %rcx
callq 0x90cd0
movq %rax, -0x218(%rbp)
jmp 0x8fb40
movq -0x218(%rbp), %rax
movq %rax, -0x118(%rbp)
leaq -0x118(%rbp), %rdi
callq 0x3bb00
movq -0x158(%rbp), %rsi
movq (%rax), %rax
movq %rax, -0x110(%rbp)
movq -0x18(%rbp), %rdx
movq -0x110(%rbp), %rcx
movq -0x20(%rbp), %r8
leaq -0x150(%rbp), %rdi
callq 0x90450
jmp 0x8fb88
leaq -0x70(%rbp), %rdi
movq %rdi, -0x230(%rbp)
leaq -0x150(%rbp), %rsi
movq %rsi, -0x238(%rbp)
callq 0x3f230
movq -0x238(%rbp), %rdi
callq 0xd7d0
movq -0x158(%rbp), %rdi
movq -0x230(%rbp), %rdx
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rcx
movzbl -0x21(%rbp), %r8d
andl $0x1, %r8d
callq 0x8fe50
movl %eax, -0x224(%rbp)
jmp 0x8fbde
movl -0x224(%rbp), %eax
movl %eax, -0x74(%rbp)
jmp 0x8fc09
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x90(%rbp)
movl %eax, -0x94(%rbp)
leaq -0x100(%rbp), %rdi
callq 0xd7d0
jmp 0x8fc5f
leaq -0x100(%rbp), %rdi
callq 0xd7d0
jmp 0x8fc17
cmpl $0x0, -0x74(%rbp)
jne 0x8fc4e
movq -0x158(%rbp), %rdi
movq -0x18(%rbp), %rsi
leaq -0x70(%rbp), %rdx
callq 0x90d40
jmp 0x8fc33
movq -0x158(%rbp), %rdi
addq $0xe0, %rdi
leaq -0x18(%rbp), %rsi
callq 0xdab0
jmp 0x8fc4c
jmp 0x8fc4e
movl -0x74(%rbp), %eax
movl %eax, -0x4(%rbp)
leaq -0x70(%rbp), %rdi
callq 0xd7d0
jmp 0x8fc6a
leaq -0x70(%rbp), %rdi
callq 0xd7d0
jmp 0x8fc76
movl -0x4(%rbp), %eax
addq $0x240, %rsp            # imm = 0x240
popq %rbp
retq
movq -0x90(%rbp), %rdi
callq 0x8880
nopw %cs:(%rax,%rax)