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

```asm
<can_thin>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %rdi,-0x48(%rbp)
  mov    %esi,-0x4c(%rbp)
  mov    %edx,-0x50(%rbp)
  mov    %ecx,%eax
  mov    %ax,-0x54(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x1,-0x28(%rbp)
  movl   $0x0,-0x24(%rbp)
  movl   $0xffffffff,-0x3c(%rbp)
  jmp    L128
L9:
  movl   $0xffffffff,-0x38(%rbp)
  jmp    L105
L178:
  mov    -0x4c(%rbp),%edx
  mov    -0x3c(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x38(%rbp),%ecx
  mov    -0x50(%rbp),%eax
  add    %ecx,%eax
  cltq
  add    %rax,%rax
  add    %rdx,%rax
  mov    -0x3c(%rbp),%edx
  lea    0x1(%rdx),%ecx
  mov    -0x38(%rbp),%edx
  lea    0x1(%rdx),%esi
  movzwl (%rax),%edx
  movslq %esi,%rsi
  movslq %ecx,%rcx
  mov    %rcx,%rax
  add    %rax,%rax
  add    %rcx,%rax
  add    %rsi,%rax
  mov    %dx,-0x20(%rbp,%rax,2)
  addl   $0x1,-0x38(%rbp)
L105:
  cmpl   $0x1,-0x38(%rbp)
  jle    L178
  addl   $0x1,-0x3c(%rbp)
L128:
  cmpl   $0x1,-0x3c(%rbp)
  jle    L9
  movw   $0x0,-0x18(%rbp)
  movl   $0x0,-0x3c(%rbp)
  jmp    L150
L3:
  movl   $0x0,-0x38(%rbp)
  jmp    L20
L42:
  mov    -0x38(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x3c(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  add    %rcx,%rax
  movzwl -0x20(%rbp,%rax,2),%eax
  cmp    %ax,-0x54(%rbp)
  jne    L80
  mov    -0x38(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x3c(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  add    %rcx,%rax
  movw   $0x0,-0x20(%rbp,%rax,2)
  movl   $0x1,-0x2c(%rbp)
  movl   $0xffffffff,-0x34(%rbp)
  jmp    L61
L98:
  movl   $0xffffffff,-0x30(%rbp)
  jmp    L132
L186:
  mov    -0x3c(%rbp),%edx
  mov    -0x34(%rbp),%eax
  add    %edx,%eax
  test   %eax,%eax
  js     L75
  mov    -0x3c(%rbp),%edx
  mov    -0x34(%rbp),%eax
  add    %edx,%eax
  cmp    $0x2,%eax
  jg     L75
  mov    -0x38(%rbp),%edx
  mov    -0x30(%rbp),%eax
  add    %edx,%eax
  test   %eax,%eax
  js     L75
  mov    -0x38(%rbp),%edx
  mov    -0x30(%rbp),%eax
  add    %edx,%eax
  cmp    $0x2,%eax
  jg     L75
  mov    -0x3c(%rbp),%edx
  mov    -0x34(%rbp),%eax
  add    %edx,%eax
  mov    -0x38(%rbp),%ecx
  mov    -0x30(%rbp),%edx
  add    %ecx,%edx
  movslq %edx,%rcx
  movslq %eax,%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  add    %rcx,%rax
  movzwl -0x20(%rbp,%rax,2),%eax
  cmp    %ax,-0x54(%rbp)
  jne    L75
  movl   $0x0,-0x2c(%rbp)
L75:
  addl   $0x1,-0x30(%rbp)
L132:
  cmpl   $0x1,-0x30(%rbp)
  jle    L186
  addl   $0x1,-0x34(%rbp)
L61:
  cmpl   $0x1,-0x34(%rbp)
  jle    L98
  mov    -0x38(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x3c(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  lea    (%rax,%rcx,1),%rdx
  movzwl -0x54(%rbp),%eax
  mov    %ax,-0x20(%rbp,%rdx,2)
  cmpl   $0x0,-0x2c(%rbp)
  je     L80
  mov    -0x24(%rbp),%eax
  jmp    L117
L80:
  addl   $0x1,-0x38(%rbp)
L20:
  cmpl   $0x2,-0x38(%rbp)
  jle    L42
  addl   $0x1,-0x3c(%rbp)
L150:
  cmpl   $0x2,-0x3c(%rbp)
  jle    L3
  mov    -0x28(%rbp),%eax
L117:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L160
  call   <__stack_chk_fail@plt>
L160:
  leave
  ret
```

assistant: ```c
int can_thin(the_image, i, j, value)
int i, j;
short **the_image, value;
{
  int a, b, c, d, count, no_neighbor, one = 1, zero = 0;
  short temp[3][3];
  for (a = -1; a < 2; a++)
    for (b = -1; b < 2; b++)
      temp[a + 1][b + 1] = the_image[i + a][b + j];
  temp[1][1] = 0;
  for (a = 0; a < 3; a++) {
    for (b = 0; b < 3; b++) {
      if (temp[a][b] == value) {
        temp[a][b] = 0;
        no_neighbor = 1;
        for (c = -1; c < 2; c++) {
          for (d = -1; d < 2; d++) {
            if (((a + c) >= 0) && ((a + c) <= 2) && ((b + d) >= 0) && ((b + d) <= 2)) {
              if (temp[a + c][b + d] == value) {
                no_neighbor = 0;
              }
            }
          }
        }
        temp[a][b] = value;
        if (no_neighbor) {
          return (zero);
        }
      }
    }
  }
  return (one);
}
```