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

```asm
<metaparse>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x38(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  jmp    L109
L153:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x5c,%al
  jne    L130
  addq   $0x1,-0x20(%rbp)
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x78,%al
  jne    L192
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  sub    $0x1,%rax
  mov    %rax,-0x18(%rbp)
  movb   $0x0,-0x22(%rbp)
  jmp    L155
L24:
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  movzbl -0x22(%rbp),%edx
  mov    %edx,%ecx
  add    $0x1,%ecx
  mov    %cl,-0x22(%rbp)
  movsbl %dl,%ecx
  movzbl (%rax),%edx
  movslq %ecx,%rax
  mov    %dl,-0xb(%rbp,%rax,1)
L155:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isxdigit@plt>
  test   %eax,%eax
  je     L120
  movzbl -0x22(%rbp),%eax
  cmp    $0x1,%al
  jle    L24
L120:
  movzbl -0x22(%rbp),%eax
  test   %al,%al
  je     L55
  movzbl -0x22(%rbp),%eax
  movsbl %al,%eax
  cltq
  movb   $0x0,-0xb(%rbp,%rax,1)
  lea    -0x22(%rbp),%rdx
  lea    -0xb(%rbp),%rax
  lea    D19(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  movzbl -0x22(%rbp),%edx
  mov    -0x18(%rbp),%rax
  mov    %dl,(%rax)
  jmp    L147
L55:
  mov    -0x18(%rbp),%rax
  movb   $0x78,(%rax)
L147:
  addq   $0x1,-0x18(%rbp)
  mov    -0x20(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  mov    -0x18(%rbp),%rax
  sub    $0x1,%rax
  mov    %rax,-0x20(%rbp)
  jmp    L130
L192:
  movb   $0x1,-0x21(%rbp)
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x30,%eax
  cmp    $0x46,%eax
  ja     L135
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D28(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D28(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  subq   $0x1,-0x20(%rbp)
  mov    -0x20(%rbp),%rax
  movb   $0x0,(%rax)
  jmp    L53
  subq   $0x1,-0x20(%rbp)
  mov    -0x20(%rbp),%rax
  movb   $0x7,(%rax)
  jmp    L53
  subq   $0x1,-0x20(%rbp)
  mov    -0x20(%rbp),%rax
  movb   $0x8,(%rax)
  jmp    L53
  subq   $0x1,-0x20(%rbp)
  mov    -0x20(%rbp),%rax
  movb   $0x9,(%rax)
  jmp    L53
  subq   $0x1,-0x20(%rbp)
  mov    -0x20(%rbp),%rax
  movb   $0xa,(%rax)
  jmp    L53
  subq   $0x1,-0x20(%rbp)
  mov    -0x20(%rbp),%rax
  movb   $0xb,(%rax)
  jmp    L53
  subq   $0x1,-0x20(%rbp)
  mov    -0x20(%rbp),%rax
  movb   $0xc,(%rax)
  jmp    L53
  subq   $0x1,-0x20(%rbp)
  mov    -0x20(%rbp),%rax
  movb   $0xd,(%rax)
  jmp    L53
  subq   $0x1,-0x20(%rbp)
  mov    -0x20(%rbp),%rax
  movb   $0x1b,(%rax)
  jmp    L53
  subq   $0x1,-0x20(%rbp)
  jmp    L53
L135:
  movb   $0x0,-0x21(%rbp)
L53:
  cmpb   $0x0,-0x21(%rbp)
  je     L130
  mov    -0x20(%rbp),%rax
  lea    0x2(%rax),%rdx
  mov    -0x20(%rbp),%rax
  add    $0x1,%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
L130:
  addq   $0x1,-0x20(%rbp)
L109:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L153
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L139
  call   <__stack_chk_fail@plt>
L139:
  leave
  ret
```

tool_calls: name: unpack_data
arguments: tag: D19
type_infered: string

tool: D19: %x

assistant: ```c
void metaparse(s) char *s;
{
  char *t;
  char mod;
  for (t = s; *t; t++)
    if (*t == '\\') {
      t++;
      if (*t == 'x') {
        char num[3], i, *tt;
        tt = t++ - 1;
        i = 0;
        while (isxdigit(*t) && i < 2)
          num[i++] = *t++;
        if (i) {
          num[i] = 0;
          sscanf(num, "%x", &i);
          *tt = (char)i;
        } else
          *tt = 'x';
        strcpy(++tt, t);
        t = tt - 1;
      } else {
        mod = 1;
        switch (*t) {
        case '0':
          *(--t) = 0;
          break;
        case 'a':
          *(--t) = 7;
          break;
        case 'b':
          *(--t) = 8;
          break;
        case 't':
          *(--t) = 9;
          break;
        case 'n':
          *(--t) = 10;
          break;
        case 'v':
          *(--t) = 11;
          break;
        case 'f':
          *(--t) = 12;
          break;
        case 'r':
          *(--t) = 13;
          break;
        case 'E':
          *(--t) = 27;
          break;
        case '\\':
          --t;
          break;
        default:
          mod = 0;
        }
        if (mod)
          strcpy(t + 1, t + 2);
      }
    }
}
```