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

```asm
<main>:
  endbr64
  push   %r14
  mov    $0x42,%edi
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    $0x1e8480,%ebx
  sub    $0x2c0,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x2b8(%rsp)
  xor    %eax,%eax
  lea    0x50(%rsp),%rbp
  lea    0x10(%rsp),%r12
  call   <tea_bag_size@plt>
  xor    %edi,%edi
  lea    0x180(%rsp),%r13
  cmp    $0x48,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x130,%edx
  mov    $0x58,%esi
  mov    %rbp,%rdi
  call   <memset@plt>
  mov    $0x42,%edx
  mov    $0x61,%esi
  mov    %rbp,%rdi
  call   <memset@plt>
  mov    %r13,%rdi
  mov    $0x130,%edx
  mov    $0x58,%esi
  call   <memset@plt>
  xor    %esi,%esi
  mov    %r13,%rdi
  mov    $0x48,%edx
  call   <memset@plt>
  mov    %r13,%rdi
  mov    $0x42,%edx
  mov    $0x61,%esi
  call   <memset@plt>
  mov    $0x42,%edx
  mov    %rbp,%rsi
  mov    %r12,%rdi
  call   <tea_encrypt@plt>
  mov    $0x48,%edx
  mov    %rbp,%rsi
  mov    %r12,%rdi
  call   <tea_decrypt@plt>
  mov    $0x42,%edx
  mov    %rbp,%rsi
  mov    %r12,%rdi
  call   <tea_encrypt@plt>
  mov    $0x48,%edx
  mov    %rbp,%rsi
  mov    %r12,%rdi
  call   <tea_decrypt@plt>
  mov    %r13,%rsi
  mov    $0x130,%edx
  mov    %rbp,%rdi
  call   <memcmp@plt>
  xor    %edi,%edi
  lea    0x8(%rsp),%r13
  test   %rax,%rax
  sete   %dil
  call   <assert@plt>
  xor    %esi,%esi
  mov    %r13,%rdi
  call   <gettimeofday@plt>
  nopl   0x0(%rax)
L10:
  mov    $0x42,%edx
  mov    %rbp,%rsi
  mov    %r12,%rdi
  call   <tea_encrypt@plt>
  sub    $0x1,%ebx
  jne    L10
  lea    0xc(%rsp),%r14
  xor    %esi,%esi
  mov    %r14,%rdi
  call   <gettimeofday@plt>
  mov    %r14,%rsi
  mov    %r13,%rdi
  call   <delta_timeval@plt>
  mov    %rax,%rsi
  test   %rax,%rax
  js     L15
  pxor   %xmm0,%xmm0
  cvtsi2sd %rax,%xmm0
L5:
  mulsd  D55(%rip),%xmm0
  lea    D59(%rip),%rdi
  mov    $0x1e8480,%ebx
  divsd  D17(%rip),%xmm0
  call   <printf@plt>
  xor    %esi,%esi
  mov    %r13,%rdi
  call   <gettimeofday@plt>
  nop
L18:
  mov    $0x48,%edx
  mov    %rbp,%rsi
  mov    %r12,%rdi
  call   <tea_decrypt@plt>
  sub    $0x1,%ebx
  jne    L18
  xor    %esi,%esi
  mov    %r14,%rdi
  call   <gettimeofday@plt>
  mov    %r14,%rsi
  mov    %r13,%rdi
  call   <delta_timeval@plt>
  mov    %rax,%rsi
  test   %rax,%rax
  js     L47
  pxor   %xmm0,%xmm0
  cvtsi2sd %rax,%xmm0
L49:
  mulsd  D55(%rip),%xmm0
  lea    D48(%rip),%rdi
  divsd  D17(%rip),%xmm0
  call   <printf@plt>
  mov    0x2b8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L59
  add    $0x2c0,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L15:
  mov    %rsi,%rdx
  shr    %rax
  pxor   %xmm0,%xmm0
  and    $0x1,%edx
  or     %rdx,%rax
  cvtsi2sd %rax,%xmm0
  addsd  %xmm0,%xmm0
  jmp    L5
L47:
  mov    %rsi,%rdx
  shr    %rax
  pxor   %xmm0,%xmm0
  and    $0x1,%edx
  or     %rdx,%rax
  cvtsi2sd %rax,%xmm0
  addsd  %xmm0,%xmm0
  jmp    L49
L59:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: extract_symbolic_data
arguments: label: D55
type_infered: f64
name: extract_symbolic_data
arguments: label: D59
type_infered: string
name: extract_symbolic_data
arguments: label: D17
type_infered: byte[8]
name: extract_symbolic_data
arguments: label: D48
type_infered: string

tool: D55: 1000

tool: D59: TEA Encrypt %luus  %.0fns


tool: {"D17": [0x00,0x00,0x00,0x00,0x80,0x84,0x3e,0x41]}

tool: D48: TEA Decrypt %luus  %.0fns


assistant: ```c
int main(int argc, char *argv[]) {
  uint8_t buf[72 + 4], expect[72 + 4];
  uint8_t key[16];
  unsigned long delta;
  struct timeval start, end;
  assert(tea_bag_size(66) == 72);
  memset(buf, 'X', sizeof(buf));
  memset(buf, 'a', 66);
  memset(expect, 'X', sizeof(expect));
  memset(expect, 0, 72);
  memset(expect, 'a', 66);
  tea_encrypt(key, buf, 66);
  tea_decrypt(key, buf, 72);
  tea_encrypt(key, buf, 66);
  tea_decrypt(key, buf, 72);
  assert(memcmp(buf, expect, sizeof(buf)) == 0);
  gettimeofday(&start, NULL);
  for (int i = 0; i < 2000000; ++i)
    tea_encrypt(key, buf, 66);
  gettimeofday(&end, NULL);
  delta = delta_timeval(&start, &end);
  printf("TEA Encrypt %luus  %.0fns\n", delta, (double)delta * 1000.0 / 2000000);
  gettimeofday(&start, NULL);
  for (int i = 0; i < 2000000; ++i)
    tea_decrypt(key, buf, 72);
  gettimeofday(&end, NULL);
  delta = delta_timeval(&start, &end);
  printf("TEA Decrypt %luus  %.0fns\n", delta, (double)delta * 1000.0 / 2000000);
  return 0;
}
```