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    $0x8,%rsp
  mov    $0x0,%eax
  call   <initialise_acl@plt>
  mov    %rax,%rbx
  mov    %eax,%edi
  call   <assert@plt>
  mov    $0x0,%edx
  lea    D215(%rip),%r12
  mov    %r12,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x1,%edx
  mov    %r12,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x2,%edx
  mov    %r12,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x4,%edx
  mov    %r12,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x7,%edx
  mov    %r12,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x0,%edx
  lea    D119(%rip),%rbp
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x1,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x2,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x4,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x7,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x1,%ecx
  mov    $0x1,%edx
  lea    D32(%rip),%rbp
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <add_acl@plt>
  mov    $0x1,%ecx
  mov    $0x2,%edx
  lea    D172(%rip),%r14
  mov    %r14,%rsi
  mov    %rbx,%rdi
  call   <add_acl@plt>
  mov    $0x1,%ecx
  mov    $0x4,%edx
  lea    D48(%rip),%r13
  mov    %r13,%rsi
  mov    %rbx,%rdi
  call   <add_acl@plt>
  mov    $0x1,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x2,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x4,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x1,%edx
  mov    %r14,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x2,%edx
  mov    %r14,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x4,%edx
  mov    %r14,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x1,%edx
  mov    %r13,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x2,%edx
  mov    %r13,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x4,%edx
  mov    %r13,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x1,%edx
  lea    D130(%rip),%r15
  mov    %r15,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x1,%edx
  lea    D169(%rip),%r14
  mov    %r14,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x1,%edx
  lea    D0(%rip),%r13
  mov    %r13,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x1,%edx
  lea    D132(%rip),%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x1,%ecx
  mov    $0x2,%edx
  lea    D199(%rip),%rsi
  mov    %rbx,%rdi
  call   <add_acl@plt>
  mov    $0x2,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x2,%edx
  mov    %r15,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x2,%edx
  mov    %r14,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x2,%edx
  mov    %r13,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x2,%edx
  lea    D132(%rip),%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x1,%ecx
  mov    $0x4,%edx
  mov    %r12,%rsi
  mov    %rbx,%rdi
  call   <add_acl@plt>
  mov    $0x4,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x4,%edx
  mov    %r15,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x4,%edx
  mov    %r14,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x4,%edx
  mov    %r13,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x4,%edx
  lea    D132(%rip),%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x0,%ecx
  mov    $0x4,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <add_acl@plt>
  mov    $0x4,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x4,%edx
  mov    %r15,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x4,%edx
  mov    %r14,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x4,%edx
  mov    %r13,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x4,%edx
  lea    D132(%rip),%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x0,%ecx
  mov    $0x4,%edx
  lea    D199(%rip),%rsi
  mov    %rbx,%rdi
  call   <add_acl@plt>
  mov    $0x4,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x4,%edx
  mov    %r15,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x4,%edx
  mov    %r14,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x4,%edx
  mov    %r13,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x4,%edx
  lea    D132(%rip),%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    %rbx,%rdi
  call   <free_acl@plt>
  mov    $0x0,%eax
  call   <initialise_acl@plt>
  mov    %rax,%rbx
  mov    $0x1,%ecx
  mov    $0x2,%edx
  lea    D58(%rip),%rbp
  mov    %rbp,%rsi
  mov    %rax,%rdi
  call   <add_acl@plt>
  mov    $0x2,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x2,%edx
  lea    D217(%rip),%r13
  mov    %r13,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x2,%edx
  lea    D209(%rip),%r12
  mov    %r12,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x1,%ecx
  mov    $0x2,%edx
  lea    D199(%rip),%rsi
  mov    %rbx,%rdi
  call   <add_acl@plt>
  mov    $0x2,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x2,%edx
  mov    %r13,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x2,%edx
  mov    %r12,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x0,%ecx
  mov    $0x2,%edx
  lea    D220(%rip),%rsi
  mov    %rbx,%rdi
  call   <add_acl@plt>
  mov    $0x2,%edx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x2,%edx
  mov    %r13,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x2,%edx
  mov    %r12,%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  cmp    $0x1,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x2,%edx
  lea    D85(%rip),%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x2,%edx
  lea    D112(%rip),%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x2,%edx
  lea    D191(%rip),%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    $0x2,%edx
  lea    D103(%rip),%rsi
  mov    %rbx,%rdi
  call   <get_acl@plt>
  test   %eax,%eax
  sete   %dil
  movzbl %dil,%edi
  call   <assert@plt>
  mov    %rbx,%rdi
  call   <free_acl@plt>
  mov    $0x0,%eax
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: read_data
arguments: tag: D215
type_infered: string
name: read_data
arguments: tag: D119
type_infered: string
name: read_data
arguments: tag: D32
type_infered: string
name: read_data
arguments: tag: D172
type_infered: string
name: read_data
arguments: tag: D48
type_infered: string
name: read_data
arguments: tag: D130
type_infered: string
name: read_data
arguments: tag: D169
type_infered: string
name: read_data
arguments: tag: D0
type_infered: string
name: read_data
arguments: tag: D132
type_infered: string
name: read_data
arguments: tag: D199
type_infered: string
name: read_data
arguments: tag: D58
type_infered: string
name: read_data
arguments: tag: D217
type_infered: string
name: read_data
arguments: tag: D209
type_infered: string
name: read_data
arguments: tag: D220
type_infered: string
name: read_data
arguments: tag: D85
type_infered: string
name: read_data
arguments: tag: D112
type_infered: string
name: read_data
arguments: tag: D191
type_infered: string
name: read_data
arguments: tag: D103
type_infered: string

tool: D215: all

tool: D119: undefined

tool: D32: foo.amp.wand.net.nz

tool: D172: bar.amp.wand.net.nz

tool: D48: baz.amp.wand.net.nz

tool: D130: amp.wand.net.nz

tool: D169: wand.net.nz

tool: D0: net.nz

tool: D132: nz

tool: D199: .wand.net.nz

tool: D58: foo.bar.baz.wand.net.nz

tool: D217: bar.baz.wand.net.nz

tool: D209: baz.wand.net.nz

tool: D220: .nz

tool: D85: foo.net.nz

tool: D112: foo.bar.net.nz

tool: D191: foo.bar.baz.net.nz

tool: D103: foo.nz

assistant: ```c
int main(void) {
  struct acl_root *root;
  root = initialise_acl();
  assert(root);
  assert(get_acl(root, "all", 0x00) == 0);
  assert(get_acl(root, "all", 0x01) == 0);
  assert(get_acl(root, "all", 0x02) == 0);
  assert(get_acl(root, "all", 0x04) == 0);
  assert(get_acl(root, "all", (0x01 | 0x02 | 0x04)) == 0);
  assert(get_acl(root, "undefined", 0x00) == 0);
  assert(get_acl(root, "undefined", 0x01) == 0);
  assert(get_acl(root, "undefined", 0x02) == 0);
  assert(get_acl(root, "undefined", 0x04) == 0);
  assert(get_acl(root, "undefined", (0x01 | 0x02 | 0x04)) == 0);
  add_acl(root, "foo.amp.wand.net.nz", 0x01, 1);
  add_acl(root, "bar.amp.wand.net.nz", 0x02, 1);
  add_acl(root, "baz.amp.wand.net.nz", 0x04, 1);
  assert(get_acl(root, "foo.amp.wand.net.nz", 0x01) == 1);
  assert(get_acl(root, "foo.amp.wand.net.nz", 0x02) == 0);
  assert(get_acl(root, "foo.amp.wand.net.nz", 0x04) == 0);
  assert(get_acl(root, "bar.amp.wand.net.nz", 0x01) == 0);
  assert(get_acl(root, "bar.amp.wand.net.nz", 0x02) == 1);
  assert(get_acl(root, "bar.amp.wand.net.nz", 0x04) == 0);
  assert(get_acl(root, "baz.amp.wand.net.nz", 0x01) == 0);
  assert(get_acl(root, "baz.amp.wand.net.nz", 0x02) == 0);
  assert(get_acl(root, "baz.amp.wand.net.nz", 0x04) == 1);
  assert(get_acl(root, "amp.wand.net.nz", 0x01) == 0);
  assert(get_acl(root, "wand.net.nz", 0x01) == 0);
  assert(get_acl(root, "net.nz", 0x01) == 0);
  assert(get_acl(root, "nz", 0x01) == 0);
  add_acl(root, ".wand.net.nz", 0x02, 1);
  assert(get_acl(root, "foo.amp.wand.net.nz", 0x02) == 1);
  assert(get_acl(root, "amp.wand.net.nz", 0x02) == 1);
  assert(get_acl(root, "wand.net.nz", 0x02) == 0);
  assert(get_acl(root, "net.nz", 0x02) == 0);
  assert(get_acl(root, "nz", 0x02) == 0);
  add_acl(root, "all", 0x04, 1);
  assert(get_acl(root, "foo.amp.wand.net.nz", 0x04) == 1);
  assert(get_acl(root, "amp.wand.net.nz", 0x04) == 1);
  assert(get_acl(root, "wand.net.nz", 0x04) == 1);
  assert(get_acl(root, "net.nz", 0x04) == 1);
  assert(get_acl(root, "nz", 0x04) == 1);
  add_acl(root, "foo.amp.wand.net.nz", 0x04, 0);
  assert(get_acl(root, "foo.amp.wand.net.nz", 0x04) == 0);
  assert(get_acl(root, "amp.wand.net.nz", 0x04) == 1);
  assert(get_acl(root, "wand.net.nz", 0x04) == 1);
  assert(get_acl(root, "net.nz", 0x04) == 1);
  assert(get_acl(root, "nz", 0x04) == 1);
  add_acl(root, ".wand.net.nz", 0x04, 0);
  assert(get_acl(root, "foo.amp.wand.net.nz", 0x04) == 0);
  assert(get_acl(root, "amp.wand.net.nz", 0x04) == 0);
  assert(get_acl(root, "wand.net.nz", 0x04) == 1);
  assert(get_acl(root, "net.nz", 0x04) == 1);
  assert(get_acl(root, "nz", 0x04) == 1);
  free_acl(root);
  root = initialise_acl();
  add_acl(root, "foo.bar.baz.wand.net.nz", 0x02, 1);
  assert(get_acl(root, "foo.bar.baz.wand.net.nz", 0x02) == 1);
  assert(get_acl(root, "bar.baz.wand.net.nz", 0x02) == 0);
  assert(get_acl(root, "baz.wand.net.nz", 0x02) == 0);
  add_acl(root, ".wand.net.nz", 0x02, 1);
  assert(get_acl(root, "foo.bar.baz.wand.net.nz", 0x02) == 1);
  assert(get_acl(root, "bar.baz.wand.net.nz", 0x02) == 1);
  assert(get_acl(root, "baz.wand.net.nz", 0x02) == 1);
  add_acl(root, ".nz", 0x02, 0);
  assert(get_acl(root, "foo.bar.baz.wand.net.nz", 0x02) == 1);
  assert(get_acl(root, "bar.baz.wand.net.nz", 0x02) == 1);
  assert(get_acl(root, "baz.wand.net.nz", 0x02) == 1);
  assert(get_acl(root, "foo.net.nz", 0x02) == 0);
  assert(get_acl(root, "foo.bar.net.nz", 0x02) == 0);
  assert(get_acl(root, "foo.bar.baz.net.nz", 0x02) == 0);
  assert(get_acl(root, "foo.nz", 0x02) == 0);
  free_acl(root);
  return 0;
}
```