user: Please show me the C implementation that matches the assembly code listed below:

```asm
<main>:
  endbr64
  push   %r15
  lea    D91(%rip),%rdi
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  lea    D31(%rip),%rbx
  sub    $0x28,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  call   <puts@plt>
  lea    D138(%rip),%rdi
  call   <puts@plt>
  lea    D127(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  lea    0x10(%rsp),%rsi
  mov    %rbx,%rdi
  call   <scanf@plt>
  mov    0x10(%rsp),%eax
  test   %eax,%eax
  jle    L1
  movl   $0x0,0xc(%rsp)
  mov    $0x1,%r15d
  xor    %r13d,%r13d
  xor    %r14d,%r14d
  lea    D170(%rip),%r12
  lea    0x14(%rsp),%rbp
  jmp    L21
  nopw   0x0(%rax,%rax,1)
L50:
  add    $0x1,%r15d
  cmp    $0x2a,%eax
  je     L107
  cmp    $0x12,%eax
  je     L16
  add    $0x1,%r13d
L128:
  cmp    %r15d,0x10(%rsp)
  jl     L138
L21:
  mov    %r15d,%esi
  mov    %r12,%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <scanf@plt>
  mov    0x14(%rsp),%eax
  test   %eax,%eax
  jns    L50
  lea    D91(%rip),%rdi
  call   <puts@plt>
  lea    D138(%rip),%rdi
  call   <puts@plt>
  cmp    %r15d,0x10(%rsp)
  jge    L21
L138:
  lea    D101(%rip),%rdi
  call   <puts@plt>
  mov    %r14d,%esi
  lea    D131(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    0xc(%rsp),%ebx
  lea    D111(%rip),%rdi
  xor    %eax,%eax
  mov    %ebx,%esi
  call   <printf@plt>
  xor    %eax,%eax
  mov    %r13d,%esi
  lea    D1(%rip),%rdi
  call   <printf@plt>
  cmp    %ebx,%r14d
  jg     L100
  jl     L8
  je     L130
L86:
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L73
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopw   0x0(%rax,%rax,1)
L107:
  add    $0x1,%r14d
  jmp    L128
  nopl   0x0(%rax)
L16:
  addl   $0x1,0xc(%rsp)
  jmp    L128
L8:
  lea    D83(%rip),%rdi
  call   <puts@plt>
  jmp    L86
L100:
  lea    D116(%rip),%rdi
  call   <puts@plt>
  jmp    L86
L1:
  lea    D101(%rip),%rdi
  call   <puts@plt>
  xor    %esi,%esi
  lea    D131(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  xor    %esi,%esi
  lea    D111(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  xor    %esi,%esi
  lea    D1(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
L130:
  lea    D22(%rip),%rdi
  call   <puts@plt>
  jmp    L86
L73:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: parse_data
arguments: label: D91
datatype: string
name: parse_data
arguments: label: D31
datatype: string
name: parse_data
arguments: label: D138
datatype: string
name: parse_data
arguments: label: D127
datatype: string
name: parse_data
arguments: label: D170
datatype: string
name: parse_data
arguments: label: D101
datatype: string
name: parse_data
arguments: label: D131
datatype: string
name: parse_data
arguments: label: D111
datatype: string
name: parse_data
arguments: label: D1
datatype: string
name: parse_data
arguments: label: D83
datatype: string
name: parse_data
arguments: label: D116
datatype: string
name: parse_data
arguments: label: D22
datatype: string

tool: D91: Candidato A: 42

tool: D31: %d

tool: D138: Candidato B: 18

tool: D127: 
Entre com o numero de eleitores: 

tool: D170: Voto do eleitor %d: 

tool: D101: 
Resultado:

tool: D131: Quantidade de votos do candidato A: %d


tool: D111: Quantidade de votos do candidado B: %d


tool: D1: Quantidade de votos nulos: %d


tool: D83: O candidato B venceu a eleicao

tool: D116: O candidato A venceu a eleicao

tool: D22: Empate

assistant: ```c
void main() {
  int candA, candB, nulo, eleitor, voto;
  int cont = 1;
  candA = candB = nulo = 0;
  printf("Candidato A: 42\n");
  printf("Candidato B: 18\n");
  printf("\nEntre com o numero de eleitores: ");
  scanf("%d", &eleitor);
  while (cont <= eleitor) {
    printf("Voto do eleitor %d: ", cont);
    scanf("%d", &voto);
    if (voto < 0) {
      printf("Candidato A: 42\n");
      printf("Candidato B: 18\n");
      cont--;
    } else if (voto == 42) {
      candA += 1;
    } else if (voto == 18) {
      candB += 1;
    } else if (voto != 42 && voto != 18) {
      nulo += 1;
    }
    cont++;
  }
  puts("\nResultado:");
  printf("Quantidade de votos do candidato A: %d\n", candA);
  printf("Quantidade de votos do candidado B: %d\n", candB);
  printf("Quantidade de votos nulos: %d\n", nulo);
  if (candA > candB) {
    puts("O candidato A venceu a eleicao");
  } else if (candB > candA) {
    puts("O candidato B venceu a eleicao");
  } else if (candB == candA) {
    puts("Empate");
  }
  return 0;
}
```