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

```asm
<main>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x1000,%rsp
  orq    $0x0,(%rsp)
  sub    $0x1000,%rsp
  orq    $0x0,(%rsp)
  sub    $0x2d8,%rsp
  mov    $0x1,%edi
  mov    %fs:0x28,%rax
  mov    %rax,0x22c8(%rsp)
  xor    %eax,%eax
  call   <mksfs@plt>
  test   %rax,%rax
  jne    L73
L18:
  lea    D411(%rip),%rdi
  lea    0x880(%rsp),%rbx
  call   <puts@plt>
  lea    D84(%rip),%rdi
  lea    D214(%rip),%r14
  call   <puts@plt>
  xor    %eax,%eax
  lea    D16(%rip),%r15
  call   <sfs_ls@plt>
  lea    0x60(%rsp),%r8
  mov    $0x102,%ecx
  movabs $0x6161616161616161,%rax
  mov    %r8,%rdi
  mov    $0x6262,%edx
  mov    %r8,0x8(%rsp)
  rep stos %rax,%es:(%rdi)
  mov    $0x6161,%eax
  mov    $0x146,%ecx
  mov    %ax,0x4(%rdi)
  movabs $0x6262626262626262,%rax
  movl   $0x61616161,(%rdi)
  movb   $0x61,0x6(%rdi)
  mov    %rbx,%rdi
  rep stos %rax,%es:(%rdi)
  mov    %dx,0x4(%rdi)
  movl   $0x62626262,(%rdi)
  movb   $0x62,0x6(%rdi)
  mov    %r14,%rdi
  call   <sfs_fopen@plt>
  mov    %r15,%rdi
  mov    %eax,%r12d
  call   <sfs_fopen@plt>
  lea    D48(%rip),%rdi
  mov    %eax,%ebp
  call   <sfs_fopen@plt>
  lea    D226(%rip),%rdi
  mov    %eax,%r13d
  call   <puts@plt>
  mov    %r13d,%ecx
  mov    %ebp,%edx
  mov    %r12d,%esi
  lea    D61(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  lea    D240(%rip),%rdi
  call   <puts@plt>
  xor    %eax,%eax
  call   <sfs_ls@plt>
  mov    $0x817,%esi
  lea    D405(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    0x8(%rsp),%rsi
  mov    $0x817,%edx
  mov    %ebp,%edi
  call   <sfs_fwrite@plt>
  lea    D21(%rip),%r8
  mov    %r8,%rdi
  mov    %eax,%esi
  xor    %eax,%eax
  call   <printf@plt>
  mov    $0xa37,%esi
  lea    D42(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    $0xa37,%edx
  mov    %rbx,%rsi
  mov    %r12d,%edi
  call   <sfs_fwrite@plt>
  lea    D21(%rip),%r8
  mov    %eax,%esi
  mov    %r8,%rdi
  xor    %eax,%eax
  call   <printf@plt>
  lea    D323(%rip),%rdi
  call   <puts@plt>
  xor    %eax,%eax
  call   <sfs_ls@plt>
  lea    D348(%rip),%rdi
  call   <puts@plt>
  mov    %r12d,%edi
  call   <sfs_fclose@plt>
  test   %eax,%eax
  je     L31
  lea    D11(%rip),%rdi
  call   <puts@plt>
L65:
  lea    D254(%rip),%rdi
  call   <puts@plt>
  xor    %eax,%eax
  call   <sfs_ls@plt>
  lea    D331(%rip),%rdi
  call   <puts@plt>
  mov    %r14,%rdi
  call   <sfs_fopen@plt>
  lea    D32(%rip),%rdi
  mov    %eax,%esi
  mov    %eax,%r12d
  xor    %eax,%eax
  call   <printf@plt>
  lea    D27(%rip),%rdi
  call   <puts@plt>
  mov    %ebp,%edi
  call   <sfs_fclose@plt>
  test   %eax,%eax
  je     L10
  lea    D11(%rip),%rdi
  call   <puts@plt>
L13:
  mov    %r15,%rdi
  call   <sfs_remove@plt>
  mov    %eax,%esi
  test   %eax,%eax
  je     L81
  lea    D77(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
L42:
  lea    D74(%rip),%rdi
  lea    0x12c0(%rsp),%rbp
  call   <puts@plt>
  xor    %eax,%eax
  lea    D350(%rip),%r15
  call   <sfs_ls@plt>
  lea    D410(%rip),%rdi
  call   <puts@plt>
  lea    D168(%rip),%rdi
  call   <puts@plt>
  lea    D341(%rip),%rdi
  call   <puts@plt>
  mov    $0x3e8,%edx
  mov    %r12d,%edi
  mov    %rbp,%rsi
  call   <sfs_fread@plt>
  mov    %r15,%rdi
  mov    %eax,%ebx
  mov    %eax,%esi
  xor    %eax,%eax
  call   <printf@plt>
  movslq %ebx,%rsi
  mov    $0x4b0,%edx
  mov    %r12d,%edi
  add    %rbp,%rsi
  call   <sfs_fread@plt>
  mov    %r15,%rdi
  mov    %eax,%esi
  mov    %eax,0x8(%rsp)
  xor    %eax,%eax
  call   <printf@plt>
  mov    0x8(%rsp),%edx
  mov    %r12d,%edi
  add    %edx,%ebx
  mov    $0x258,%edx
  movslq %ebx,%rsi
  add    %rbp,%rsi
  call   <sfs_fread@plt>
  mov    %r15,%rdi
  mov    %eax,%r12d
  mov    %eax,%esi
  xor    %eax,%eax
  call   <printf@plt>
  add    %ebx,%r12d
  mov    %rbp,%rsi
  lea    D183(%rip),%rdi
  movslq %r12d,%rax
  movb   $0x0,0x12c0(%rsp,%rax,1)
  xor    %eax,%eax
  call   <printf@plt>
  lea    D97(%rip),%rdi
  call   <puts@plt>
  lea    D278(%rip),%rdi
  call   <puts@plt>
  mov    %r12d,%edx
  mov    %rbp,%rsi
  mov    %r13d,%edi
  call   <sfs_fwrite@plt>
  lea    D417(%rip),%rdi
  call   <puts@plt>
  xor    %eax,%eax
  call   <sfs_ls@plt>
  lea    D268(%rip),%rdi
  call   <puts@plt>
  xor    %eax,%eax
  call   <sfs_clean@plt>
  lea    D117(%rip),%rdi
  call   <puts@plt>
  lea    D362(%rip),%rdi
  call   <puts@plt>
  xor    %edi,%edi
  call   <mksfs@plt>
  lea    D324(%rip),%rdi
  call   <puts@plt>
  xor    %eax,%eax
  call   <sfs_ls@plt>
  mov    %r14,%rdi
  call   <sfs_fopen@plt>
  mov    %eax,%r12d
  test   %eax,%eax
  js     L66
  mov    %eax,%esi
  lea    D20(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
L66:
  movdqa D100(%rip),%xmm0
  mov    $0x4f,%edx
  lea    0x10(%rsp),%rsi
  mov    %r12d,%edi
  movaps %xmm0,0x10(%rsp)
  movaps %xmm0,0x20(%rsp)
  movaps %xmm0,0x30(%rsp)
  movaps %xmm0,0x40(%rsp)
  movaps %xmm0,0x50(%rsp)
  call   <sfs_fwrite@plt>
  lea    D149(%rip),%rdi
  mov    %eax,%esi
  xor    %eax,%eax
  call   <printf@plt>
  xor    %eax,%eax
  call   <sfs_ls@plt>
  mov    $0xffe,%edx
  mov    %rbp,%rsi
  mov    %r12d,%edi
  call   <sfs_fread@plt>
  lea    D33(%rip),%rdi
  mov    %eax,%esi
  cltq
  movb   $0x0,0x12c0(%rsp,%rax,1)
  xor    %eax,%eax
  call   <printf@plt>
  mov    %rbp,%rdi
  call   <puts@plt>
  mov    0x22c8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L45
  add    $0x22d8,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L31:
  lea    D282(%rip),%rdi
  call   <puts@plt>
  jmp    L65
L81:
  lea    D279(%rip),%rdi
  call   <puts@plt>
  jmp    L42
L10:
  lea    D282(%rip),%rdi
  call   <puts@plt>
  jmp    L13
L73:
  lea    D308(%rip),%rdi
  call   <puts@plt>
  mov    $0x1,%edi
  call   <exit@plt>
  jmp    L18
L45:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: label: D411
type: string
name: retrieve_data
arguments: label: D84
type: string
name: retrieve_data
arguments: label: D214
type: string
name: retrieve_data
arguments: label: D16
type: string
name: retrieve_data
arguments: label: D48
type: string
name: retrieve_data
arguments: label: D226
type: string
name: retrieve_data
arguments: label: D61
type: string
name: retrieve_data
arguments: label: D240
type: string
name: retrieve_data
arguments: label: D405
type: string
name: retrieve_data
arguments: label: D21
type: string
name: retrieve_data
arguments: label: D42
type: string
name: retrieve_data
arguments: label: D323
type: string
name: retrieve_data
arguments: label: D348
type: string
name: retrieve_data
arguments: label: D11
type: string
name: retrieve_data
arguments: label: D254
type: string
name: retrieve_data
arguments: label: D331
type: string
name: retrieve_data
arguments: label: D32
type: string
name: retrieve_data
arguments: label: D27
type: string
name: retrieve_data
arguments: label: D77
type: string
name: retrieve_data
arguments: label: D74
type: string
name: retrieve_data
arguments: label: D350
type: string
name: retrieve_data
arguments: label: D410
type: string
name: retrieve_data
arguments: label: D168
type: string
name: retrieve_data
arguments: label: D341
type: string
name: retrieve_data
arguments: label: D183
type: string
name: retrieve_data
arguments: label: D97
type: string
name: retrieve_data
arguments: label: D278
type: string
name: retrieve_data
arguments: label: D417
type: string
name: retrieve_data
arguments: label: D268
type: string
name: retrieve_data
arguments: label: D117
type: string
name: retrieve_data
arguments: label: D362
type: string
name: retrieve_data
arguments: label: D324
type: string
name: retrieve_data
arguments: label: D20
type: string
name: retrieve_data
arguments: label: D100
type: byte[16]
name: retrieve_data
arguments: label: D149
type: string
name: retrieve_data
arguments: label: D33
type: string
name: retrieve_data
arguments: label: D282
type: string
name: retrieve_data
arguments: label: D279
type: string
name: retrieve_data
arguments: label: D308
type: string

tool: D411: Currently no files have been created.

tool: D84: We run ls() : 

tool: D214: File1

tool: D16: File2

tool: D48: big_file_number3.txt

tool: D226: Now, 3 files have been created.


tool: D61: The file descriptor ids are : %d %d %d


tool: D240: We run ls():


tool: D405: 
 Now we will write %d a's into the second file


tool: D21: Result : %d bytes written


tool: D42: And we will write %d b's into the 1st file


tool: D323: And now, ls() : 


tool: D348: Now, I will close file 'File1'. sfs_fclose returns -1 on error and 0 on success

tool: D11: Invalid filedescriptor

tool: D254: We do ls() : 


tool: D331: Now we open the file that we just closed.

tool: D32: The new file descriptor is %d 


tool: D27: Now we close and then remove File2 from the disk

tool: D77: %d Error in removal

tool: D74: 
Now we do ls() : 

tool: D350: %d bytes read.


tool: D410: Now it's time to read stuff that was copied inside File1

tool: D168: First let's read 1000 bytes, then 1200, and then 600

tool: D341: sfs_fread return the number of bytes that were read.

tool: D183: What we have read: 
%s


tool: D97: It doesn't read past EOF.

tool: D278: We will now write what we have read into big_file_number3.txt

tool: D417: And now, we ls() : 

tool: D268: Now we reset the filesystem

tool: D117: FileSystem Reset

tool: D362: We want to reload the disk

tool: D324: Filesystem reloaded. We do ls 

tool: D20: File File1 opened with success, fdesc id: %d


tool: {"D100": [0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30]}

tool: D149: %d bytes written to file File1.


tool: D33: Print what we have read : %d bytes


tool: D282: Success!

tool: D279: Success! file was removed

tool: D308: Error in initializing the disk

assistant: ```c
int main(void) {
  int i;
  char as[2048 + 23];
  char bs[2048 + 567];
  if (mksfs(1)) {
    printf("Error in initializing the disk\n");
    exit(1);
  }
  printf("Currently no files have been created.\n");
  printf("We run ls() : \n");
  sfs_ls();
  for (i = 0; i < 2048 + 23; i++) {
    as[i] = 'a';
  }
  for (i = 0; i < 2048 + 567; i++) {
    bs[i] = 'b';
  }
  int file1 = sfs_fopen("File1");
  int file2 = sfs_fopen("File2");
  int file3 = sfs_fopen("big_file_number3.txt");
  printf("Now, 3 files have been created.\n\n");
  printf("The file descriptor ids are : %d %d %d\n", file1, file2, file3);
  printf("We run ls():\n\n");
  sfs_ls();
  printf("\n Now we will write %d a's into the second file\n", 2048 + 23);
  int wr_result = sfs_fwrite(file2, &as[0], 2048 + 23);
  printf("Result : %d bytes written\n", wr_result);
  printf("And we will write %d b's into the 1st file\n", 2048 + 567);
  wr_result = sfs_fwrite(file1, &bs[0], 2048 + 567);
  printf("Result : %d bytes written\n", wr_result);
  printf("And now, ls() : \n\n");
  sfs_ls();
  printf("Now, I will close file 'File1'. sfs_fclose returns -1 on error and 0 on success\n");
  int fclosereturn = sfs_fclose(file1);
  if (fclosereturn) {
    printf("Invalid filedescriptor\n");
  } else {
    printf("Success!\n");
  }
  printf("We do ls() : \n\n");
  sfs_ls();
  printf("Now we open the file that we just closed.\n");
  file1 = sfs_fopen("File1");
  printf("The new file descriptor is %d \n", file1);
  printf("Now we close and then remove File2 from the disk\n");
  fclosereturn = sfs_fclose(file2);
  if (fclosereturn) {
    printf("Invalid filedescriptor\n");
  } else {
    printf("Success!\n");
  }
  int removeres = sfs_remove("File2");
  if (removeres) {
    printf("%d Error in removal", removeres);
  } else {
    printf("Success! file was removed\n");
  }
  printf("\nNow we do ls() : \n");
  sfs_ls();
  char scrap_book[2 * 2048];
  printf("Now it's time to read stuff that was copied inside File1\n");
  printf("First let's read 1000 bytes, then 1200, and then 600\n");
  printf("sfs_fread return the number of bytes that were read.\n");
  int pos;
  int read_res = sfs_fread(file1, &scrap_book[0], 1000);
  printf("%d bytes read.\n", read_res);
  pos = pos + read_res;
  read_res = sfs_fread(file1, &scrap_book[pos], 1200);
  printf("%d bytes read.\n", read_res);
  pos = pos + read_res;
  read_res = sfs_fread(file1, &scrap_book[pos], 600);
  printf("%d bytes read.\n", read_res);
  pos = pos + read_res;
  scrap_book[pos] = '\0';
  printf("What we have read: \n%s\n", &scrap_book[0]);
  printf("It doesn't read past EOF.\n");
  printf("We will now write what we have read into big_file_number3.txt\n");
  sfs_fwrite(file3, &scrap_book[0], pos);
  printf("And now, we ls() : \n");
  sfs_ls();
  printf("Now we reset the filesystem\n");
  sfs_clean();
  printf("FileSystem Reset\n");
  printf("We want to reload the disk\n");
  mksfs(0);
  printf("Filesystem reloaded. We do ls \n");
  sfs_ls();
  int open_result = sfs_fopen("File1");
  if (open_result >= 0) {
    printf("File File1 opened with success, fdesc id: %d\n", open_result);
  }
  char test5[80];
  for (i = 0; i < 80; i++) {
    test5[i] = '0';
  }
  wr_result = sfs_fwrite(open_result, &test5[0], 79);
  printf("%d bytes written to file File1.\n", wr_result);
  sfs_ls();
  read_res = sfs_fread(open_result, &scrap_book[0], 2 * 2048 - 2);
  scrap_book[read_res] = '\0';
  printf("Print what we have read : %d bytes\n", read_res);
  printf("%s\n", &scrap_book[0]);
}
```