user: What is the c source code of the assembly code below?

```asm
<main>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x110,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x108(%rsp)
  xor    %eax,%eax
  lea    D116(%rip),%r12
  lea    0xc(%rsp),%rbp
  lea    D50(%rip),%rbx
  lea    D117(%rip),%r13
  jmp    L152
L109:
  mov    %r13,%rdi
  call   <puts@plt>
  mov    0xc(%rsp),%eax
  cmp    $0x1e,%eax
  jle    L40
L152:
  mov    $0x1e,%esi
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <scanf@plt>
  mov    0xc(%rsp),%eax
  cmp    $0x1e,%eax
  jg     L109
L40:
  test   %eax,%eax
  jle    L8
  lea    0x10(%rsp),%rbp
  mov    %rbp,%r12
  mov    $0x0,%ebx
  lea    D66(%rip),%r14
  lea    D50(%rip),%r13
L163:
  add    $0x1,%ebx
  mov    %ebx,%esi
  mov    %r14,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    %r12,%rsi
  mov    %r13,%rdi
  call   <scanf@plt>
  mov    0xc(%rsp),%eax
  add    $0x4,%r12
  cmp    %eax,%ebx
  jl     L163
  test   %eax,%eax
  jle    L8
  lea    -0x1(%rax),%eax
  lea    0x4(%rbp,%rax,4),%r8
  mov    $0x0,%ebx
  jmp    L17
L78:
  movslq %ebx,%rax
  mov    0x0(%rbp),%edx
  mov    %edx,0x90(%rsp,%rax,4)
  add    $0x1,%ebx
L74:
  add    $0x4,%rbp
  cmp    %r8,%rbp
  je     L127
L17:
  test   %ebx,%ebx
  jle    L78
  mov    0x0(%rbp),%edi
  mov    $0x1,%eax
L80:
  mov    0x8c(%rsp,%rax,4),%edx
  cmp    %edx,%edi
  setne  %sil
  cmp    %eax,%ebx
  setg   %cl
  add    $0x1,%rax
  test   %cl,%sil
  jne    L80
  cmp    %edx,%edi
  je     L74
  jmp    L78
L127:
  lea    D81(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  cmpl   $0x0,0xc(%rsp)
  jle    L41
L151:
  mov    $0x0,%ebp
  lea    D4(%rip),%r12
L188:
  mov    0x10(%rsp,%rbp,4),%esi
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  add    $0x1,%rbp
  cmp    %ebp,0xc(%rsp)
  jg     L188
L41:
  lea    D36(%rip),%rdi
  call   <puts@plt>
  lea    D107(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  test   %ebx,%ebx
  jle    L97
  lea    0x90(%rsp),%rbp
  lea    -0x1(%rbx),%eax
  lea    0x94(%rsp,%rax,4),%r12
  lea    D4(%rip),%rbx
L172:
  mov    0x0(%rbp),%esi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  add    $0x4,%rbp
  cmp    %rbp,%r12
  jne    L172
L97:
  lea    D27(%rip),%rdi
  call   <puts@plt>
  mov    0x108(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L133
  mov    $0x0,%eax
  add    $0x110,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L8:
  lea    D81(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x0,%ebx
  cmpl   $0x0,0xc(%rsp)
  jg     L151
  lea    D36(%rip),%rdi
  call   <puts@plt>
  lea    D107(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L97
L133:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: extract_symbolic_data
arguments: label: D116
datatype: string
name: extract_symbolic_data
arguments: label: D50
datatype: string
name: extract_symbolic_data
arguments: label: D117
datatype: string
name: extract_symbolic_data
arguments: label: D66
datatype: string
name: extract_symbolic_data
arguments: label: D81
datatype: string
name: extract_symbolic_data
arguments: label: D4
datatype: string
name: extract_symbolic_data
arguments: label: D36
datatype: string
name: extract_symbolic_data
arguments: label: D107
datatype: string
name: extract_symbolic_data
arguments: label: D27
datatype: string

tool: D116: Quanti elementi vuoi inserire (max: %d)? 

tool: D50: %d

tool: D117: Il valore inserito e' troppo grande!

tool: D66: Inserire il %do elemento: 

tool: D81: lista = [

tool: D4: %d 

tool: D36: ]

tool: D107: insieme = {

tool: D27: }

assistant: ```c
int main() {
  int i, j, k = 0;
  int dim;
  int trovato;
  int lista[30];
  int insieme[30];
  do {
    printf("Quanti elementi vuoi inserire (max: %d)? ", 30);
    scanf("%d", &dim);
    if (dim > 30)
      printf("Il valore inserito e' troppo grande!\n");
  } while (dim > 30);
  for (i = 0; i < dim; i++) {
    printf("Inserire il %do elemento: ", i + 1);
    scanf("%d", &lista[i]);
  }
  for (i = 0; i < dim; i++) {
    trovato = 0;
    for (j = 0; !trovato && j < k; j++)
      trovato = (lista[i] == insieme[j]);
    if (!trovato) {
      insieme[k] = lista[i];
      k++;
    }
  }
  printf("lista = [");
  for (i = 0; i < dim; i++) {
    printf("%d ", lista[i]);
  }
  printf("]\n");
  printf("insieme = {");
  for (i = 0; i < k; i++) {
    printf("%d ", insieme[i]);
  }
  printf("}\n");
}
```