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

```asm
<bitmap_decompress2>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  add    $0xffffffffffffff80,%rsp
  mov    %rdi,-0x68(%rbp)
  mov    %esi,-0x6c(%rbp)
  mov    %edx,-0x70(%rbp)
  mov    %rcx,-0x78(%rbp)
  mov    %r8d,-0x7c(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x7c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x78(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x18(%rbp)
  movq   $0x0,-0x28(%rbp)
  movq   $0x0,-0x20(%rbp)
  mov    -0x6c(%rbp),%eax
  mov    %eax,-0x44(%rbp)
  movl   $0xffffffff,-0x40(%rbp)
  movl   $0x0,-0x3c(%rbp)
  movl   $0x0,-0x38(%rbp)
  movb   $0x0,-0xe(%rbp)
  movb   $0x0,-0xd(%rbp)
  movb   $0x0,-0xc(%rbp)
  movb   $0x0,-0xb(%rbp)
  movb   $0xff,-0xa(%rbp)
  movb   $0xff,-0x9(%rbp)
  movl   $0x0,-0x54(%rbp)
  movl   $0x0,-0x34(%rbp)
  jmp    L845
L289:
  movl   $0x0,-0x34(%rbp)
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x30(%rbp),%eax
  sar    $0x4,%eax
  mov    %eax,-0x50(%rbp)
  cmpl   $0xe,-0x50(%rbp)
  jg     L43
  cmpl   $0xc,-0x50(%rbp)
  jge    L367
  jmp    L758
L43:
  cmpl   $0xf,-0x50(%rbp)
  je     L154
  jmp    L758
L367:
  subl   $0x6,-0x50(%rbp)
  mov    -0x30(%rbp),%eax
  and    $0xf,%eax
  mov    %eax,-0x4c(%rbp)
  movl   $0x10,-0x48(%rbp)
  jmp    L276
L154:
  mov    -0x30(%rbp),%eax
  and    $0xf,%eax
  mov    %eax,-0x50(%rbp)
  cmpl   $0x8,-0x50(%rbp)
  jg     L419
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0x4c(%rbp)
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%eax
  or     %eax,-0x4c(%rbp)
  jmp    L387
L419:
  cmpl   $0xa,-0x50(%rbp)
  jg     L384
  mov    $0x8,%eax
  jmp    L436
L384:
  mov    $0x1,%eax
L436:
  mov    %eax,-0x4c(%rbp)
L387:
  movl   $0x0,-0x48(%rbp)
  jmp    L276
L758:
  sarl   -0x50(%rbp)
  mov    -0x30(%rbp),%eax
  and    $0x1f,%eax
  mov    %eax,-0x4c(%rbp)
  movl   $0x20,-0x48(%rbp)
  nop
L276:
  cmpl   $0x0,-0x48(%rbp)
  je     L860
  cmpl   $0x2,-0x50(%rbp)
  je     L31
  cmpl   $0x7,-0x50(%rbp)
  jne    L653
L31:
  mov    $0x1,%eax
  jmp    L718
L653:
  mov    $0x0,%eax
L718:
  mov    %eax,-0x2c(%rbp)
  cmpl   $0x0,-0x4c(%rbp)
  jne    L174
  cmpl   $0x0,-0x2c(%rbp)
  je     L553
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    $0x1,%eax
  mov    %eax,-0x4c(%rbp)
  jmp    L860
L553:
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0x48(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x4c(%rbp)
  jmp    L860
L174:
  cmpl   $0x0,-0x2c(%rbp)
  je     L860
  shll   $0x3,-0x4c(%rbp)
L860:
  cmpl   $0xa,-0x50(%rbp)
  ja     L528
  mov    -0x50(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  lea    D8(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D8(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  mov    -0x40(%rbp),%eax
  cmp    -0x50(%rbp),%eax
  jne    L45
  mov    -0x44(%rbp),%eax
  cmp    -0x6c(%rbp),%eax
  jne    L164
  cmpq   $0x0,-0x28(%rbp)
  je     L45
L164:
  movl   $0x1,-0x3c(%rbp)
  jmp    L45
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movzbl (%rax),%eax
  mov    %al,-0xe(%rbp)
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movzbl (%rax),%eax
  mov    %al,-0xd(%rbp)
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movzbl (%rax),%eax
  mov    %al,-0xc(%rbp)
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movzbl (%rax),%eax
  mov    %al,-0xb(%rbp)
  jmp    L528
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movzbl (%rax),%eax
  mov    %al,-0xa(%rbp)
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movzbl (%rax),%eax
  mov    %al,-0x9(%rbp)
  subl   $0x5,-0x50(%rbp)
  jmp    L528
  movl   $0x3,-0x54(%rbp)
  movl   $0x2,-0x50(%rbp)
  movl   $0x3,-0x34(%rbp)
  jmp    L528
  movl   $0x5,-0x54(%rbp)
  movl   $0x2,-0x50(%rbp)
  movl   $0x5,-0x34(%rbp)
  jmp    L528
L45:
  nop
L528:
  mov    -0x50(%rbp),%eax
  mov    %eax,-0x40(%rbp)
  movl   $0x0,-0x58(%rbp)
  jmp    L806
L470:
  mov    -0x44(%rbp),%eax
  cmp    -0x6c(%rbp),%eax
  jl     L793
  cmpl   $0x0,-0x70(%rbp)
  jg     L234
  mov    $0x0,%eax
  jmp    L864
L234:
  movl   $0x0,-0x44(%rbp)
  subl   $0x1,-0x70(%rbp)
  mov    -0x20(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  mov    -0x6c(%rbp),%eax
  imul   -0x70(%rbp),%eax
  add    %eax,%eax
  movslq %eax,%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x20(%rbp)
L793:
  cmpl   $0xe,-0x50(%rbp)
  ja     L1
  mov    -0x50(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  lea    D33(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D33(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  cmpl   $0x0,-0x3c(%rbp)
  je     L409
  cmpq   $0x0,-0x28(%rbp)
  jne    L124
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  movslq %eax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  movzbl -0xa(%rbp),%eax
  mov    %al,(%rdx)
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x9(%rbp),%eax
  mov    %al,(%rdx)
  jmp    L697
L124:
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%ecx
  movzbl -0xa(%rbp),%edx
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  movslq %eax,%rsi
  mov    -0x20(%rbp),%rax
  add    %rsi,%rax
  xor    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%ecx
  movzbl -0x9(%rbp),%edx
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  cltq
  lea    0x1(%rax),%rsi
  mov    -0x20(%rbp),%rax
  add    %rsi,%rax
  xor    %ecx,%edx
  mov    %dl,(%rax)
L697:
  movl   $0x0,-0x3c(%rbp)
  subl   $0x1,-0x4c(%rbp)
  addl   $0x1,-0x44(%rbp)
L409:
  cmpq   $0x0,-0x28(%rbp)
  jne    L438
  jmp    L594
L210:
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  movslq %eax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  subl   $0x1,-0x4c(%rbp)
  addl   $0x1,-0x44(%rbp)
L594:
  cmpl   $0x0,-0x4c(%rbp)
  jle    L806
  mov    -0x44(%rbp),%eax
  cmp    -0x6c(%rbp),%eax
  jl     L210
  jmp    L806
L326:
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    -0x44(%rbp),%edx
  add    %edx,%edx
  movslq %edx,%rcx
  mov    -0x20(%rbp),%rdx
  add    %rcx,%rdx
  movzbl (%rax),%eax
  mov    %al,(%rdx)
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    -0x44(%rbp),%edx
  add    %edx,%edx
  movslq %edx,%rdx
  lea    0x1(%rdx),%rcx
  mov    -0x20(%rbp),%rdx
  add    %rcx,%rdx
  movzbl (%rax),%eax
  mov    %al,(%rdx)
  subl   $0x1,-0x4c(%rbp)
  addl   $0x1,-0x44(%rbp)
L438:
  cmpl   $0x0,-0x4c(%rbp)
  jle    L806
  mov    -0x44(%rbp),%eax
  cmp    -0x6c(%rbp),%eax
  jl     L326
  jmp    L806
  cmpq   $0x0,-0x28(%rbp)
  jne    L811
  jmp    L459
L450:
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  movslq %eax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  movzbl -0xa(%rbp),%eax
  mov    %al,(%rdx)
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x9(%rbp),%eax
  mov    %al,(%rdx)
  subl   $0x1,-0x4c(%rbp)
  addl   $0x1,-0x44(%rbp)
L459:
  cmpl   $0x0,-0x4c(%rbp)
  jle    L806
  mov    -0x44(%rbp),%eax
  cmp    -0x6c(%rbp),%eax
  jl     L450
  jmp    L806
L468:
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%ecx
  movzbl -0xa(%rbp),%edx
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  movslq %eax,%rsi
  mov    -0x20(%rbp),%rax
  add    %rsi,%rax
  xor    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%ecx
  movzbl -0x9(%rbp),%edx
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  cltq
  lea    0x1(%rax),%rsi
  mov    -0x20(%rbp),%rax
  add    %rsi,%rax
  xor    %ecx,%edx
  mov    %dl,(%rax)
  subl   $0x1,-0x4c(%rbp)
  addl   $0x1,-0x44(%rbp)
L811:
  cmpl   $0x0,-0x4c(%rbp)
  jle    L806
  mov    -0x44(%rbp),%eax
  cmp    -0x6c(%rbp),%eax
  jl     L468
  jmp    L806
  cmpq   $0x0,-0x28(%rbp)
  jne    L67
  jmp    L360
L18:
  shll   -0x58(%rbp)
  mov    -0x58(%rbp),%eax
  movzbl %al,%eax
  test   %eax,%eax
  jne    L359
  cmpl   $0x0,-0x34(%rbp)
  jne    L26
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  jmp    L397
L26:
  mov    -0x34(%rbp),%eax
L397:
  mov    %eax,-0x54(%rbp)
  movl   $0x1,-0x58(%rbp)
L359:
  mov    -0x54(%rbp),%eax
  and    -0x58(%rbp),%eax
  test   %eax,%eax
  je     L541
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  movslq %eax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  movzbl -0xa(%rbp),%eax
  mov    %al,(%rdx)
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x9(%rbp),%eax
  mov    %al,(%rdx)
  jmp    L709
L541:
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  movslq %eax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
L709:
  subl   $0x1,-0x4c(%rbp)
  addl   $0x1,-0x44(%rbp)
L360:
  cmpl   $0x0,-0x4c(%rbp)
  jle    L806
  mov    -0x44(%rbp),%eax
  cmp    -0x6c(%rbp),%eax
  jl     L18
  jmp    L806
L672:
  shll   -0x58(%rbp)
  mov    -0x58(%rbp),%eax
  movzbl %al,%eax
  test   %eax,%eax
  jne    L554
  cmpl   $0x0,-0x34(%rbp)
  jne    L21
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  jmp    L892
L21:
  mov    -0x34(%rbp),%eax
L892:
  mov    %eax,-0x54(%rbp)
  movl   $0x1,-0x58(%rbp)
L554:
  mov    -0x54(%rbp),%eax
  and    -0x58(%rbp),%eax
  test   %eax,%eax
  je     L584
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%ecx
  movzbl -0xa(%rbp),%edx
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  movslq %eax,%rsi
  mov    -0x20(%rbp),%rax
  add    %rsi,%rax
  xor    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%ecx
  movzbl -0x9(%rbp),%edx
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  cltq
  lea    0x1(%rax),%rsi
  mov    -0x20(%rbp),%rax
  add    %rsi,%rax
  xor    %ecx,%edx
  mov    %dl,(%rax)
  jmp    L466
L584:
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    -0x44(%rbp),%edx
  add    %edx,%edx
  movslq %edx,%rcx
  mov    -0x20(%rbp),%rdx
  add    %rcx,%rdx
  movzbl (%rax),%eax
  mov    %al,(%rdx)
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    -0x44(%rbp),%edx
  add    %edx,%edx
  movslq %edx,%rdx
  lea    0x1(%rdx),%rcx
  mov    -0x20(%rbp),%rdx
  add    %rcx,%rdx
  movzbl (%rax),%eax
  mov    %al,(%rdx)
L466:
  subl   $0x1,-0x4c(%rbp)
  addl   $0x1,-0x44(%rbp)
L67:
  cmpl   $0x0,-0x4c(%rbp)
  jle    L806
  mov    -0x44(%rbp),%eax
  cmp    -0x6c(%rbp),%eax
  jl     L672
  jmp    L806
L856:
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  movslq %eax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  movzbl -0xc(%rbp),%eax
  mov    %al,(%rdx)
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  movzbl -0xb(%rbp),%eax
  mov    %al,(%rdx)
  subl   $0x1,-0x4c(%rbp)
  addl   $0x1,-0x44(%rbp)
  cmpl   $0x0,-0x4c(%rbp)
  jle    L806
  mov    -0x44(%rbp),%eax
  cmp    -0x6c(%rbp),%eax
  jl     L856
  jmp    L806
L844:
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  mov    -0x44(%rbp),%edx
  add    %edx,%edx
  movslq %edx,%rcx
  mov    -0x20(%rbp),%rdx
  add    %rcx,%rdx
  movzbl (%rax),%eax
  mov    %al,(%rdx)
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  mov    -0x44(%rbp),%edx
  add    %edx,%edx
  movslq %edx,%rdx
  lea    0x1(%rdx),%rcx
  mov    -0x20(%rbp),%rdx
  add    %rcx,%rdx
  movzbl (%rax),%eax
  mov    %al,(%rdx)
  subl   $0x1,-0x4c(%rbp)
  addl   $0x1,-0x44(%rbp)
  cmpl   $0x0,-0x4c(%rbp)
  jle    L806
  mov    -0x44(%rbp),%eax
  cmp    -0x6c(%rbp),%eax
  jl     L844
  jmp    L806
L342:
  cmpl   $0x0,-0x38(%rbp)
  je     L125
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  movslq %eax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  movzbl -0xc(%rbp),%eax
  mov    %al,(%rdx)
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  movzbl -0xb(%rbp),%eax
  mov    %al,(%rdx)
  movl   $0x0,-0x38(%rbp)
  jmp    L508
L125:
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  movslq %eax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  movzbl -0xe(%rbp),%eax
  mov    %al,(%rdx)
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x20(%rbp),%rax
  add    %rax,%rdx
  movzbl -0xd(%rbp),%eax
  mov    %al,(%rdx)
  movl   $0x1,-0x38(%rbp)
  addl   $0x1,-0x4c(%rbp)
L508:
  subl   $0x1,-0x4c(%rbp)
  addl   $0x1,-0x44(%rbp)
  cmpl   $0x0,-0x4c(%rbp)
  jle    L806
  mov    -0x44(%rbp),%eax
  cmp    -0x6c(%rbp),%eax
  jl     L342
  jmp    L806
L171:
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  movslq %eax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movb   $0xff,(%rax)
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movb   $0xff,(%rax)
  subl   $0x1,-0x4c(%rbp)
  addl   $0x1,-0x44(%rbp)
  cmpl   $0x0,-0x4c(%rbp)
  jle    L806
  mov    -0x44(%rbp),%eax
  cmp    -0x6c(%rbp),%eax
  jl     L171
  jmp    L806
L274:
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  movslq %eax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  mov    -0x44(%rbp),%eax
  add    %eax,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  subl   $0x1,-0x4c(%rbp)
  addl   $0x1,-0x44(%rbp)
  cmpl   $0x0,-0x4c(%rbp)
  jle    L806
  mov    -0x44(%rbp),%eax
  cmp    -0x6c(%rbp),%eax
  jl     L274
  jmp    L806
L1:
  mov    $0x0,%eax
  jmp    L864
L806:
  cmpl   $0x0,-0x4c(%rbp)
  jg     L470
L845:
  mov    -0x78(%rbp),%rax
  cmp    -0x18(%rbp),%rax
  jb     L289
  mov    $0x1,%eax
L864:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L152
  call   <__stack_chk_fail@plt>
L152:
  leave
  ret
```

assistant: ```c
int bitmap_decompress2(char *output, int width, int height, char *input, int size) {
  char *prevline;
  char *line;
  char *end;
  char color1[2];
  char color2[2];
  char mix[2];
  int code;
  int mixmask;
  int mask;
  int opcode;
  int count;
  int offset;
  int isfillormix;
  int x;
  int lastopcode;
  int insertmix;
  int bicolor;
  int fom_mask;
  end = input + size;
  prevline = 0;
  line = 0;
  x = width;
  lastopcode = -1;
  insertmix = 0;
  bicolor = 0;
  color1[0] = 0;
  color1[1] = 0;
  color2[0] = 0;
  color2[1] = 0;
  mix[0] = 0xff;
  mix[1] = 0xff;
  mask = 0;
  fom_mask = 0;
  while (input < end) {
    fom_mask = 0;
    code = ((unsigned char)(*(input++)));
    opcode = code >> 4;
    switch (opcode) {
    case 0xc:
    case 0xd:
    case 0xe:
      opcode -= 6;
      count = code & 0xf;
      offset = 16;
      break;
    case 0xf:
      opcode = code & 0xf;
      if (opcode < 9) {
        count = ((unsigned char)(*(input++)));
        count |= ((unsigned char)(*(input++))) << 8;
      } else {
        count = (opcode < 0xb) ? 8 : 1;
      }
      offset = 0;
      break;
    default:
      opcode >>= 1;
      count = code & 0x1f;
      offset = 32;
      break;
    }
    if (offset != 0) {
      isfillormix = ((opcode == 2) || (opcode == 7));
      if (count == 0) {
        if (isfillormix) {
          count = ((unsigned char)(*(input++))) + 1;
        } else {
          count = ((unsigned char)(*(input++))) + offset;
        }
      } else if (isfillormix) {
        count <<= 3;
      }
    }
    switch (opcode) {
    case 0:
      if ((lastopcode == opcode) && !((x == width) && (prevline == 0))) {
        insertmix = 1;
      }
      break;
    case 8:
      color1[0] = ((unsigned char)(*(input++)));
      color1[1] = ((unsigned char)(*(input++)));
    case 3:
      color2[0] = ((unsigned char)(*(input++)));
      color2[1] = ((unsigned char)(*(input++)));
      break;
    case 6:
    case 7:
      mix[0] = ((unsigned char)(*(input++)));
      mix[1] = ((unsigned char)(*(input++)));
      opcode -= 5;
      break;
    case 9:
      mask = 0x03;
      opcode = 0x02;
      fom_mask = 3;
      break;
    case 0x0a:
      mask = 0x05;
      opcode = 0x02;
      fom_mask = 5;
      break;
    }
    lastopcode = opcode;
    mixmask = 0;
    while (count > 0) {
      if (x >= width) {
        if (height <= 0) {
          return 0;
        }
        x = 0;
        height--;
        prevline = line;
        line = output + height * (width * 2);
      }
      switch (opcode) {
      case 0:
        if (insertmix) {
          if (prevline == 0) {
            line[x * 2 + 0] = mix[0];
            line[x * 2 + 1] = mix[1];
          } else {
            line[x * 2 + 0] = prevline[x * 2 + 0] ^ mix[0];
            line[x * 2 + 1] = prevline[x * 2 + 1] ^ mix[1];
          }
          insertmix = 0;
          count--;
          x++;
        }
        if (prevline == 0) {
          {
            while ((count > 0) && (x < width)) {
              line[x * 2 + 0] = 0;
              line[x * 2 + 1] = 0;
              ;
              count--;
              x++;
            }
          }
        } else {
          {
            while ((count > 0) && (x < width)) {
              line[x * 2 + 0] = prevline[x * 2 + 0];
              line[x * 2 + 1] = prevline[x * 2 + 1];
              ;
              count--;
              x++;
            }
          }
        }
        break;
      case 1:
        if (prevline == 0) {
          {
            while ((count > 0) && (x < width)) {
              line[x * 2 + 0] = mix[0];
              line[x * 2 + 1] = mix[1];
              ;
              count--;
              x++;
            }
          }
        } else {
          {
            while ((count > 0) && (x < width)) {
              line[x * 2 + 0] = prevline[x * 2 + 0] ^ mix[0];
              line[x * 2 + 1] = prevline[x * 2 + 1] ^ mix[1];
              ;
              count--;
              x++;
            }
          }
        }
        break;
      case 2:
        if (prevline == 0) {
          {
            while ((count > 0) && (x < width)) {
              {
                mixmask <<= 1;
                if ((mixmask & 0xff) == 0) {
                  mask = fom_mask ? fom_mask : ((unsigned char)(*(input++)));
                  mixmask = 1;
                }
              };
              if (mask & mixmask) {
                line[x * 2 + 0] = mix[0];
                line[x * 2 + 1] = mix[1];
              } else {
                line[x * 2 + 0] = 0;
                line[x * 2 + 1] = 0;
              };
              count--;
              x++;
            }
          }
        } else {
          {
            while ((count > 0) && (x < width)) {
              {
                mixmask <<= 1;
                if ((mixmask & 0xff) == 0) {
                  mask = fom_mask ? fom_mask : ((unsigned char)(*(input++)));
                  mixmask = 1;
                }
              };
              if (mask & mixmask) {
                line[x * 2 + 0] = prevline[x * 2 + 0] ^ mix[0];
                line[x * 2 + 1] = prevline[x * 2 + 1] ^ mix[1];
              } else {
                line[x * 2 + 0] = prevline[x * 2 + 0];
                line[x * 2 + 1] = prevline[x * 2 + 1];
              };
              count--;
              x++;
            }
          }
        }
        break;
      case 3: {
        while ((count > 0) && (x < width)) {
          line[x * 2 + 0] = color2[0];
          line[x * 2 + 1] = color2[1];
          ;
          count--;
          x++;
        }
      } break;
      case 4: {
        while ((count > 0) && (x < width)) {
          line[x * 2 + 0] = ((unsigned char)(*(input++)));
          line[x * 2 + 1] = ((unsigned char)(*(input++)));
          ;
          count--;
          x++;
        }
      } break;
      case 8: {
        while ((count > 0) && (x < width)) {
          if (bicolor) {
            line[x * 2 + 0] = color2[0];
            line[x * 2 + 1] = color2[1];
            bicolor = 0;
          } else {
            line[x * 2 + 0] = color1[0];
            line[x * 2 + 1] = color1[1];
            bicolor = 1;
            count++;
          };
          count--;
          x++;
        }
      } break;
      case 0xd: {
        while ((count > 0) && (x < width)) {
          line[x * 2 + 0] = 0xff;
          line[x * 2 + 1] = 0xff;
          ;
          count--;
          x++;
        }
      } break;
      case 0xe: {
        while ((count > 0) && (x < width)) {
          line[x * 2 + 0] = 0;
          line[x * 2 + 1] = 0;
          ;
          count--;
          x++;
        }
      } break;
      default:
        return 0;
        break;
      }
    }
  }
  return 1;
}
```