user: What would the C source look like for the assembly code provided here?

```asm
<pinValidationData>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x20,%rsp
  mov    %rdi,%r13
  mov    %esi,%ebp
  mov    %rdx,%rbx
  mov    %rcx,%r12
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  movq   $0x0,(%rdx)
  movq   $0x0,0x8(%rdx)
  movb   $0x0,0x10(%rdx)
  movq   $0x0,(%rcx)
  movq   $0x0,0x5d(%rcx)
  lea    0x8(%rcx),%rdi
  and    $0xfffffffffffffff8,%rdi
  sub    %rdi,%rcx
  add    $0x65,%ecx
  shr    $0x3,%ecx
  mov    %ecx,%ecx
  rep stos %rax,%es:(%rdi)
  movq   $0x0,0xb(%rsp)
  movl   $0x0,0x13(%rsp)
  movb   $0x0,0x17(%rsp)
  movl   $0x0,0x5(%rsp)
  movw   $0x0,0x9(%rsp)
  mov    %r12,%rsi
  mov    %r13,%rdi
  call   <validatePan@plt>
  cmp    $0xffffffff,%eax
  je     L20
  lea    -0x1(%rbp),%edx
  cmp    $0xb,%edx
  ja     L28
  movslq %eax,%r12
  lea    -0xd(%r13,%r12,1),%rsi
  lea    0xb(%rsp),%r14
  mov    $0xc,%edx
  mov    %r14,%rdi
  call   <strncpy@plt>
  lea    -0x6(%r13,%r12,1),%rsi
  lea    0x5(%rsp),%r12
  mov    $0x5,%edx
  mov    %r12,%rdi
  call   <strncpy@plt>
  lea    -0x1(%rbp),%edx
  movslq %edx,%rdx
  mov    %r14,%rsi
  mov    %rbx,%rdi
  call   <strncpy@plt>
  mov    %r12,%rsi
  mov    %rbx,%rdi
  call   <strcat@plt>
  mov    $0xc,%edx
  sub    %ebp,%edx
  movslq %edx,%rdx
  movslq %ebp,%rbp
  lea    (%r14,%rbp,1),%rsi
  mov    %rbx,%rdi
  call   <strncat@plt>
  movb   $0x0,0x11(%rbx)
  mov    $0x0,%eax
L20:
  mov    0x18(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L21
  add    $0x20,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L28:
  movabs $0x2064696c61766e49,%rax
  movabs $0x6e6f697469736f70,%rdx
  mov    %rax,(%r12)
  mov    %rdx,0x8(%r12)
  movabs $0x65736e69206f7420,%rax
  movabs $0x207473616c207472,%rdx
  mov    %rax,0x10(%r12)
  mov    %rdx,0x18(%r12)
  movabs $0x7374696769642035,%rax
  movabs $0x6f63636120666f20,%rdx
  mov    %rax,0x20(%r12)
  mov    %rdx,0x28(%r12)
  movabs $0x626d756e20746e75,%rax
  movabs $0x73756d202d207265,%rdx
  mov    %rax,0x30(%r12)
  mov    %rdx,0x38(%r12)
  movabs $0x7465622065622074,%rax
  movabs $0x742031206e656577,%rdx
  mov    %rax,0x40(%r12)
  mov    %rdx,0x48(%r12)
  movabs $0x2121203231206f,%rax
  mov    %rax,0x50(%r12)
  mov    $0xffffffff,%eax
  jmp    L20
L21:
  call   <__stack_chk_fail@plt>
```

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;
}
```