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

```asm
<pinValidationData>:
  endbr64
  push   %r15
  pxor   %xmm0,%xmm0
  mov    %rcx,%r15
  push   %r14
  push   %r13
  push   %r12
  mov    %rdi,%r12
  lea    0x8(%rcx),%rdi
  push   %rbp
  and    $0xfffffffffffffff8,%rdi
  movslq %esi,%rbp
  mov    %r15,%rsi
  push   %rbx
  mov    %rdx,%rbx
  sub    $0x38,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x28(%rsp)
  xor    %eax,%eax
  movb   $0x0,0x10(%rdx)
  movups %xmm0,(%rdx)
  xor    %edx,%edx
  movq   $0x0,(%rcx)
  movq   $0x0,0x5d(%rcx)
  sub    %rdi,%rcx
  add    $0x65,%ecx
  shr    $0x3,%ecx
  rep stos %rax,%es:(%rdi)
  mov    %r12,%rdi
  movb   $0x0,0x27(%rsp)
  movq   $0x0,0x1b(%rsp)
  movl   $0x0,0x23(%rsp)
  movl   $0x0,0x15(%rsp)
  mov    %dx,0x19(%rsp)
  call   <validatePan@plt>
  cmp    $0xffffffff,%eax
  je     L3
  lea    -0x1(%rbp),%ecx
  cmp    $0xb,%ecx
  ja     L21
  lea    0x1b(%rsp),%r13
  movslq %eax,%r15
  lea    0x15(%rsp),%r14
  mov    $0xc,%edx
  lea    -0xd(%r12,%r15,1),%rsi
  mov    %r13,%rdi
  mov    %ecx,0xc(%rsp)
  call   <strncpy@plt>
  lea    -0x6(%r12,%r15,1),%rsi
  mov    $0x5,%edx
  mov    %r14,%rdi
  call   <strncpy@plt>
  movslq 0xc(%rsp),%rdx
  mov    %r13,%rsi
  mov    %rbx,%rdi
  call   <strncpy@plt>
  mov    %r14,%rsi
  mov    %rbx,%rdi
  call   <strcat@plt>
  mov    $0xc,%edx
  lea    0x0(%r13,%rbp,1),%rsi
  mov    %rbx,%rdi
  sub    %ebp,%edx
  movslq %edx,%rdx
  call   <strncat@plt>
  movb   $0x0,0x11(%rbx)
  xor    %eax,%eax
L3:
  mov    0x28(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L12
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L21:
  movdqa D17(%rip),%xmm0
  movabs $0x2121203231206f,%rax
  mov    %rax,0x50(%r15)
  mov    $0xffffffff,%eax
  movups %xmm0,(%r15)
  movdqa D11(%rip),%xmm0
  movups %xmm0,0x10(%r15)
  movdqa D45(%rip),%xmm0
  movups %xmm0,0x20(%r15)
  movdqa D44(%rip),%xmm0
  movups %xmm0,0x30(%r15)
  movdqa D33(%rip),%xmm0
  movups %xmm0,0x40(%r15)
  jmp    L3
L12:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: extract_symbolic_data
arguments: tag: D17
datatype: byte[16]
name: extract_symbolic_data
arguments: tag: D11
datatype: byte[16]
name: extract_symbolic_data
arguments: tag: D45
datatype: byte[16]
name: extract_symbolic_data
arguments: tag: D44
datatype: byte[16]
name: extract_symbolic_data
arguments: tag: D33
datatype: byte[16]

tool: {"D17": [0x49,0x6e,0x76,0x61,0x6c,0x69,0x64,0x20,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e]}

tool: {"D11": [0x20,0x74,0x6f,0x20,0x69,0x6e,0x73,0x65,0x72,0x74,0x20,0x6c,0x61,0x73,0x74,0x20]}

tool: {"D45": [0x35,0x20,0x64,0x69,0x67,0x69,0x74,0x73,0x20,0x6f,0x66,0x20,0x61,0x63,0x63,0x6f]}

tool: {"D44": [0x75,0x6e,0x74,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x2d,0x20,0x6d,0x75,0x73]}

tool: {"D33": [0x74,0x20,0x62,0x65,0x20,0x62,0x65,0x74,0x77,0x65,0x65,0x6e,0x20,0x31,0x20,0x74]}

assistant: ```c
int pinValidationData(unsigned const char *ipan, const int iposition, unsigned char *opinvaldat, char *errstatus) {
  memset(opinvaldat, '\0', 8 * 2 + 1);
  memset(errstatus, '\0', 100 + 1);
  unsigned char accountnumber[13];
  memset(accountnumber, '\0', 13);
  unsigned char last5digits[6];
  memset(last5digits, '\0', 6);
  int panlength = validatePan(ipan, errstatus);
  if (panlength == -1)
    return -1;
  if (iposition - 1 < 0 || iposition - 1 > 11) {
    strcpy(errstatus, "Invalid position to insert last 5 digits of account number - must be between 1 to 12 !!");
    return -1;
  }
  strncpy((char *)accountnumber, (const char *)(ipan + panlength - 12 - 1), 12);
  accountnumber[12] = '\0';
  strncpy((char *)last5digits, (const char *)(ipan + panlength - 5 - 1), 5);
  last5digits[5] = '\0';
  strncpy((char *)opinvaldat, (const char *)accountnumber, iposition - 1);
  strcat((char *)opinvaldat, (const char *)last5digits);
  strncat((char *)opinvaldat, (const char *)(accountnumber + iposition), 12 - iposition);
  opinvaldat[8 * 2 + 1] = '\0';
  return 0;
}
```