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

```asm
<print_array_dual>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0xd8,%rsp
  mov    %rdi,0x20(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0xc8(%rsp)
  xor    %eax,%eax
  movslq %esi,%rax
  shr    $0x2,%rax
  mov    %eax,0x10(%rsp)
  test   %eax,%eax
  jle    L68
  lea    0x40(%rsp),%rax
  movl   $0x3,0x14(%rsp)
  lea    0x3a(%rsp),%r13
  movq   $0x0,0x28(%rsp)
  mov    %rax,0x18(%rsp)
L75:
  pxor   %xmm0,%xmm0
  mov    0x28(%rsp),%rbp
  movaps %xmm0,0x40(%rsp)
  movaps %xmm0,0x50(%rsp)
  movaps %xmm0,0x60(%rsp)
  movaps %xmm0,0x70(%rsp)
  movaps %xmm0,0x80(%rsp)
  movaps %xmm0,0x90(%rsp)
  movaps %xmm0,0xa0(%rsp)
  movaps %xmm0,0xb0(%rsp)
  jmp    L66
  nopw   0x0(%rax,%rax,1)
L12:
  mov    $0xff,%r8d
  mov    $0xff,%ecx
  xor    %eax,%eax
  mov    $0xff,%edx
  mov    $0xff,%esi
  lea    D6(%rip),%rdi
  call   <print@plt>
  mov    $0xff,%edi
  call   <isascii@plt>
  mov    $0xff,%edi
  cmp    $0x1,%rax
  sbb    %r9d,%r9d
  and    $0x2f,%r9b
  add    $0xff,%r9d
  mov    %r9d,(%rsp)
  call   <isascii@plt>
  mov    (%rsp),%r9d
  test   %rax,%rax
  je     L34
  mov    $0xff,%edi
  mov    $0xff,%r12d
  call   <isascii@plt>
  mov    (%rsp),%r9d
  test   %rax,%rax
  jne    L27
  mov    $0xffffffff,%r11d
  mov    $0xff,%r15d
  nopl   0x0(%rax,%rax,1)
L165:
  mov    $0x2e,%r14d
L189:
  cmp    $0x1f,%r11b
  ja     L58
L132:
  mov    $0x2e,%r12d
L79:
  mov    %r15d,%r8d
  mov    %r14d,%ecx
  mov    %r12d,%edx
  mov    %r13,%rdi
  lea    D36(%rip),%rsi
  add    $0x1,%rbp
  call   <sprintf@plt>
  mov    0x18(%rsp),%rdi
  mov    %r13,%rsi
  call   <strcat@plt>
  cmp    %ebp,0x14(%rsp)
  jl     L164
L66:
  cmp    %ebp,0x10(%rsp)
  jle    L12
  mov    0x20(%rsp),%rax
  mov    (%rax,%rbp,4),%edi
  call   <ntoh32@plt>
  lea    D6(%rip),%rdi
  mov    %eax,%r10d
  mov    %eax,%ebx
  mov    %eax,%r9d
  sar    $0x8,%eax
  sar    $0x10,%r10d
  shr    $0x18,%r9d
  mov    %eax,(%rsp)
  movzbl %bl,%r12d
  movzbl %bh,%eax
  movzbl %r10b,%r15d
  mov    %bl,0x8(%rsp)
  mov    %r9d,%r8d
  mov    %eax,%edx
  mov    %eax,%r14d
  mov    %r15d,%ecx
  xor    %eax,%eax
  mov    %r12d,%esi
  sar    $0x18,%ebx
  mov    %r10d,0xc(%rsp)
  mov    %r9d,0x4(%rsp)
  call   <print@plt>
  cmp    $0x1f,%bl
  mov    0x4(%rsp),%r9d
  movzbl 0x8(%rsp),%r11d
  mov    0xc(%rsp),%r10d
  ja     L109
  mov    $0x2e,%r9d
L98:
  cmp    $0x1f,%r10b
  ja     L6
  mov    $0x2e,%r15d
L46:
  cmpb   $0x1f,(%rsp)
  jbe    L165
  jmp    L11
  nopl   0x0(%rax)
L27:
  mov    $0xff,%r15d
  mov    $0xff,%r14d
L58:
  mov    %r12d,%edi
  mov    %r9d,(%rsp)
  call   <isascii@plt>
  mov    (%rsp),%r9d
  test   %rax,%rax
  jne    L79
  jmp    L132
  nopw   0x0(%rax,%rax,1)
L34:
  mov    $0xff,%r12d
  mov    $0xff,%r14d
  mov    $0xffffffff,%r11d
  mov    $0x2e,%r15d
L11:
  mov    %r14d,%edi
  mov    %r9d,0x4(%rsp)
  mov    %r11b,(%rsp)
  call   <isascii@plt>
  movzbl (%rsp),%r11d
  mov    0x4(%rsp),%r9d
  test   %rax,%rax
  jne    L189
  jmp    L165
  nopl   0x0(%rax)
L164:
  mov    0x18(%rsp),%rsi
  lea    D15(%rip),%rdi
  xor    %eax,%eax
  call   <print@plt>
  addq   $0x4,0x28(%rsp)
  mov    0x28(%rsp),%rax
  addl   $0x4,0x14(%rsp)
  cmp    %eax,0x10(%rsp)
  jg     L75
L68:
  mov    0xc8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L111
  add    $0xd8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L109:
  mov    %r9d,%edi
  mov    %r11b,0xc(%rsp)
  mov    %r10d,0x8(%rsp)
  call   <isascii@plt>
  mov    0x4(%rsp),%r9d
  mov    0x8(%rsp),%r10d
  test   %rax,%rax
  mov    $0x2e,%eax
  movzbl 0xc(%rsp),%r11d
  cmove  %eax,%r9d
  jmp    L98
L111:
  call   <__stack_chk_fail@plt>
L6:
  mov    %r15d,%edi
  mov    %r9d,0x8(%rsp)
  mov    %r11b,0x4(%rsp)
  call   <isascii@plt>
  movzbl 0x4(%rsp),%r11d
  mov    0x8(%rsp),%r9d
  test   %rax,%rax
  mov    $0x2e,%eax
  cmove  %eax,%r15d
  jmp    L46
```

tool_calls: name: read_data
arguments: tag: D6
type_infered: string
name: read_data
arguments: tag: D36
type_infered: string
name: read_data
arguments: tag: D15
type_infered: string

tool: D6: %02x %02x %02x %02x - 

tool: D36: %c%c%c%c 

tool: D15: %s


assistant: ```c
void print_array_dual(const unsigned char *array, int size) {
  int idx;
  int block;
  size /= sizeof(u_int32_t);
  for (block = 0; block < size; block += 4) {
    char ascii4[6];
    char ascii[128] = {
        0,
    };
    for (idx = block; idx < block + 4; idx++) {
      u_int32_t v;
      if (idx < size)
        v = ntoh32(((u_int32_t *)array)[idx]);
      else
        v = 0xffffffff;
      print("%02x %02x %02x %02x - ", ((unsigned char)(v)), ((unsigned char)(v >> 8)), ((unsigned char)(v >> 16)), ((unsigned char)(v >> 24)));
      sprintf(ascii4, "%c%c%c%c ", ((((unsigned char)(v)) >= 32 && isascii((unsigned char)(v))) ? ((unsigned char)(v)) : '.'), ((((unsigned char)(v >> 8)) >= 32 && isascii((unsigned char)(v >> 8))) ? ((unsigned char)(v >> 8)) : '.'), ((((unsigned char)(v >> 16)) >= 32 && isascii((unsigned char)(v >> 16))) ? ((unsigned char)(v >> 16)) : '.'), ((((unsigned char)(v >> 24)) >= 32 && isascii((unsigned char)(v >> 24))) ? ((unsigned char)(v >> 24)) : '.'));
      strcat(ascii, ascii4);
    }
    print("%s\n", ascii);
  }
}
```