user: 请将以下的汇编代码转换成C语言代码：

```asm
<c_blit_write>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x58,%rsp
  mov    %rdi,0x8(%rsp)
  mov    %ecx,0x14(%rsp)
  mov    0x90(%rsp),%r14
  mov    0x98(%rsp),%r10d
  mov    0xa0(%rsp),%r11d
  mov    0xa8(%rsp),%esi
  mov    0xb0(%rsp),%edi
  mov    0xb8(%rsp),%ecx
  mov    0xc0(%rsp),%edx
  mov    0xd8(%rsp),%ebp
  mov    0xe0(%rsp),%r12d
  mov    0xe8(%rsp),%eax
  mov    0xf0(%rsp),%r13d
  mov    %r8w,0x20(%rsp)
  mov    %r9w,0x24(%rsp)
  mov    %si,0x1a(%rsp)
  movzbl 0xc8(%rsp),%r15d
  mov    %r15b,0x40(%rsp)
  mov    %bp,0x1c(%rsp)
  mov    %r12w,0x28(%rsp)
  mov    %ax,0x2c(%rsp)
  mov    %r13w,0x30(%rsp)
  lea    (%r10,%r8,1),%r15d
  mov    %r15w,0x18(%rsp)
  add    %r11d,%r9d
  movzbl %cl,%r8d
  movswl %si,%r15d
  imul   %r8d,%r15d
  test   %dl,%dl
  jne    L1586
  mov    %edi,%ebx
  cmp    %bp,%r10w
  jl     L1586
  lea    (%rdi,%r11,1),%edx
  cmp    %r13w,%dx
  setle  %dl
  cmp    %r12w,%r11w
  setge  %r11b
  test   %r11b,%dl
  je     L763
  add    %r10d,%esi
  cmp    %ax,%si
  jle    L2566
L763:
  cmp    $0x3,%cl
  je     L905
  cmp    $0x4,%cl
  je     L3619
  cmp    $0x2,%cl
  jne    L3035
  lea    (%r9,%rdi,1),%r8d
  mov    $0x0,%esi
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%r10d
  movswl 0x30(%rsp),%ebx
  add    %edx,%ebx
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%edi
  add    %eax,%edi
  movswl 0x2c(%rsp),%ebp
  add    %eax,%ebp
  jmp    L390
L2566:
  movswl %r9w,%r9d
  mov    0x14(%rsp),%r13d
  imul   %r13d,%r9d
  movswl 0x18(%rsp),%eax
  imul   %r8d,%eax
  lea    (%r9,%rax,1),%ebp
  add    0x8(%rsp),%rbp
  test   %di,%di
  jle    L3035
  mov    $0x0,%r12d
  mov    %r15d,%r15d
L2134:
  mov    %r15,%rdx
  mov    %r14,%rsi
  mov    %rbp,%rdi
  call   <memcpy@plt>
  add    %r15,%r14
  mov    %r13d,%eax
  add    %rax,%rbp
  add    $0x1,%r12d
  cmp    %bx,%r12w
  jne    L2134
L3035:
  add    $0x58,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L1586:
  cmp    $0xa,%dl
  ja     L3035
  movzbl %dl,%edx
  lea    D9(%rip),%rsi
  movslq (%rsi,%rdx,4),%rdx
  add    %rsi,%rdx
  notrack jmp *%rdx
L3619:
  lea    (%r9,%rdi,1),%r8d
  mov    $0x0,%esi
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%r10d
  movswl 0x30(%rsp),%ebx
  add    %edx,%ebx
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%edi
  add    %eax,%edi
  movswl 0x2c(%rsp),%ebp
  add    %eax,%ebp
  jmp    L3081
L905:
  lea    (%r9,%rdi,1),%r8d
  mov    $0x0,%esi
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%r10d
  movswl 0x30(%rsp),%ebx
  add    %edx,%ebx
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%edi
  add    %eax,%edi
  movswl 0x2c(%rsp),%r12d
  add    %eax,%r12d
  mov    %r15d,0x1c(%rsp)
  mov    0x8(%rsp),%r13
  jmp    L2767
L36:
  add    $0x1,%eax
  add    $0x4,%ecx
  cmp    %r11w,%ax
  je     L260
L670:
  movzwl %ax,%edx
  cmp    %edi,%edx
  jl     L36
  cmp    %ebp,%edx
  jg     L36
  mov    %ecx,%r13d
  mov    (%r14,%r13,1),%r13d
  lea    (%r12,%rdx,4),%edx
  mov    0x8(%rsp),%rsi
  mov    %r13d,(%rsi,%rdx,1)
  jmp    L36
L260:
  mov    0x1c(%rsp),%esi
L2167:
  add    $0x1,%r9d
  add    %r15d,%esi
  cmp    %r8w,%r9w
  je     L3035
L3081:
  movzwl %r9w,%eax
  cmp    %r10d,%eax
  jl     L2167
  cmp    %ebx,%eax
  jg     L2167
  movzwl 0x1a(%rsp),%eax
  test   %ax,%ax
  jle    L2167
  movzwl %r9w,%r12d
  imul   0x14(%rsp),%r12d
  mov    %eax,%r11d
  movzwl 0x18(%rsp),%eax
  add    %eax,%r11d
  mov    %esi,%ecx
  mov    %esi,0x1c(%rsp)
  jmp    L670
L3149:
  add    $0x1,%eax
  add    $0x3,%ecx
  cmp    %r11w,%ax
  je     L938
L3268:
  movzwl %ax,%edx
  cmp    %edi,%edx
  jl     L3149
  cmp    %r12d,%edx
  jg     L3149
  mov    %ecx,%ebp
  lea    (%rdx,%rdx,2),%edx
  lea    (%rdx,%r15,1),%edx
  movzbl (%r14,%rbp,1),%esi
  mov    %sil,0x0(%r13,%rdx,1)
  movzbl 0x1(%r14,%rbp,1),%esi
  mov    %sil,0x1(%r13,%rdx,1)
  movzbl 0x2(%r14,%rbp,1),%ebp
  mov    %bpl,0x2(%r13,%rdx,1)
  jmp    L3149
L938:
  mov    0x8(%rsp),%esi
L3494:
  add    $0x1,%r9d
  add    0x1c(%rsp),%esi
  cmp    %r8w,%r9w
  je     L3035
L2767:
  movzwl %r9w,%eax
  cmp    %r10d,%eax
  jl     L3494
  cmp    %ebx,%eax
  jg     L3494
  movzwl 0x1a(%rsp),%ecx
  test   %cx,%cx
  jle    L3494
  imul   0x14(%rsp),%eax
  mov    %eax,%r15d
  movzwl 0x18(%rsp),%eax
  add    %eax,%ecx
  mov    %ecx,%r11d
  mov    %esi,%ecx
  mov    %esi,0x8(%rsp)
  jmp    L3268
L2445:
  add    $0x1,%eax
  add    $0x2,%ecx
  cmp    %r11w,%ax
  je     L2065
L2476:
  movzwl %ax,%edx
  cmp    %edi,%edx
  jl     L2445
  cmp    %ebp,%edx
  jg     L2445
  mov    %ecx,%r13d
  movzwl (%r14,%r13,1),%r13d
  lea    (%r12,%rdx,2),%edx
  mov    0x8(%rsp),%rsi
  mov    %r13w,(%rsi,%rdx,1)
  jmp    L2445
L2065:
  mov    0x1c(%rsp),%esi
L3041:
  add    $0x1,%r9d
  add    %r15d,%esi
  cmp    %r8w,%r9w
  je     L3035
L390:
  movzwl %r9w,%eax
  cmp    %r10d,%eax
  jl     L3041
  cmp    %ebx,%eax
  jg     L3041
  movzwl 0x1a(%rsp),%eax
  test   %ax,%ax
  jle    L3041
  movzwl %r9w,%r12d
  imul   0x14(%rsp),%r12d
  mov    %eax,%r11d
  movzwl 0x18(%rsp),%eax
  add    %eax,%r11d
  mov    %esi,%ecx
  mov    %esi,0x1c(%rsp)
  jmp    L2476
  cmp    $0x3,%cl
  je     L1721
  cmp    $0x4,%cl
  je     L104
  cmp    $0x2,%cl
  jne    L3035
  lea    (%r9,%rdi,1),%r8d
  mov    $0x0,%ecx
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%edi
  movswl 0x30(%rsp),%ebx
  add    %edx,%ebx
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%esi
  add    %eax,%esi
  movswl 0x2c(%rsp),%r11d
  add    %eax,%r11d
  mov    %r15d,0x1c(%rsp)
  mov    0x8(%rsp),%r15
  jmp    L3335
L104:
  lea    (%r9,%rdi,1),%r8d
  mov    $0x0,%ecx
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%edi
  movswl 0x30(%rsp),%ebx
  add    %edx,%ebx
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%esi
  add    %eax,%esi
  movswl 0x2c(%rsp),%r11d
  add    %eax,%r11d
  mov    %r15d,0x1c(%rsp)
  mov    0x8(%rsp),%r15
  jmp    L2505
L1721:
  lea    (%r9,%rdi,1),%r8d
  mov    $0x0,%ecx
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%r10d
  movswl 0x30(%rsp),%ebx
  add    %edx,%ebx
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%edi
  add    %eax,%edi
  movswl 0x2c(%rsp),%r12d
  add    %eax,%r12d
  mov    %r15d,0x1c(%rsp)
  mov    0x8(%rsp),%r11
  jmp    L1194
L2894:
  add    $0x1,%eax
  add    $0x4,%edx
  cmp    %ax,%r10w
  je     L3946
L333:
  movzwl %ax,%ebp
  cmp    %esi,%ebp
  jl     L2894
  cmp    %r11d,%ebp
  jg     L2894
  lea    (%r12,%rbp,4),%ebp
  mov    %edx,%r13d
  mov    (%r14,%r13,1),%r13d
  xor    %r13d,(%r15,%rbp,1)
  jmp    L2894
L3946:
  add    $0x1,%r9d
  add    0x1c(%rsp),%ecx
  cmp    %r9w,%r8w
  je     L3035
L2505:
  movzwl %r9w,%eax
  cmp    %edi,%eax
  jl     L3946
  cmp    %ebx,%eax
  jg     L3946
  movzwl 0x1a(%rsp),%eax
  test   %ax,%ax
  jle    L3946
  movzwl %r9w,%r12d
  imul   0x14(%rsp),%r12d
  mov    %eax,%r10d
  movzwl 0x18(%rsp),%eax
  add    %eax,%r10d
  mov    %ecx,%edx
  jmp    L333
L3367:
  add    $0x1,%eax
  add    $0x3,%edx
  cmp    %bp,%ax
  je     L1422
L7:
  movzwl %ax,%esi
  cmp    %edi,%esi
  jl     L3367
  cmp    %r12d,%esi
  jg     L3367
  lea    (%rsi,%rsi,2),%esi
  lea    (%rsi,%r15,1),%esi
  mov    %edx,%r13d
  movzbl (%r14,%r13,1),%ecx
  xor    %cl,(%r11,%rsi,1)
  movzbl 0x1(%r14,%r13,1),%ecx
  xor    %cl,0x1(%r11,%rsi,1)
  movzbl 0x2(%r14,%r13,1),%r13d
  xor    %r13b,0x2(%r11,%rsi,1)
  jmp    L3367
L1422:
  mov    0x8(%rsp),%ecx
L487:
  add    $0x1,%r9d
  add    0x1c(%rsp),%ecx
  cmp    %r8w,%r9w
  je     L3035
L1194:
  movzwl %r9w,%eax
  cmp    %r10d,%eax
  jl     L487
  cmp    %ebx,%eax
  jg     L487
  movzwl 0x1a(%rsp),%esi
  test   %si,%si
  jle    L487
  imul   0x14(%rsp),%eax
  mov    %eax,%r15d
  movzwl 0x18(%rsp),%eax
  add    %eax,%esi
  mov    %esi,%ebp
  mov    %ecx,%edx
  mov    %ecx,0x8(%rsp)
  jmp    L7
L3028:
  add    $0x1,%eax
  add    $0x2,%edx
  cmp    %r10w,%ax
  je     L342
L3111:
  movzwl %ax,%ebp
  cmp    %esi,%ebp
  jl     L3028
  cmp    %r11d,%ebp
  jg     L3028
  lea    (%r12,%rbp,2),%ebp
  mov    %edx,%r13d
  movzwl (%r14,%r13,1),%r13d
  xor    %r13w,(%r15,%rbp,1)
  jmp    L3028
L342:
  add    $0x1,%r9d
  add    0x1c(%rsp),%ecx
  cmp    %r8w,%r9w
  je     L3035
L3335:
  movzwl %r9w,%eax
  cmp    %edi,%eax
  jl     L342
  cmp    %ebx,%eax
  jg     L342
  movzwl 0x1a(%rsp),%eax
  test   %ax,%ax
  jle    L342
  movzwl %r9w,%r12d
  imul   0x14(%rsp),%r12d
  mov    %eax,%r10d
  movzwl 0x18(%rsp),%eax
  add    %eax,%r10d
  mov    %ecx,%edx
  jmp    L3111
  cmp    $0x3,%cl
  je     L3039
  cmp    $0x4,%cl
  je     L2006
  cmp    $0x2,%cl
  jne    L3035
  lea    (%r9,%rdi,1),%r8d
  mov    $0x0,%ecx
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%edi
  movswl 0x30(%rsp),%ebx
  add    %edx,%ebx
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%esi
  add    %eax,%esi
  movswl 0x2c(%rsp),%r11d
  add    %eax,%r11d
  mov    %r15d,0x1c(%rsp)
  mov    0x8(%rsp),%r15
  jmp    L2614
L2006:
  lea    (%r9,%rdi,1),%r8d
  mov    $0x0,%ecx
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%edi
  movswl 0x30(%rsp),%ebx
  add    %edx,%ebx
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%esi
  add    %eax,%esi
  movswl 0x2c(%rsp),%r11d
  add    %eax,%r11d
  mov    %r15d,0x1c(%rsp)
  mov    0x8(%rsp),%r15
  jmp    L1965
L3039:
  lea    (%r9,%rdi,1),%r8d
  mov    $0x0,%ecx
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%r10d
  movswl 0x30(%rsp),%ebx
  add    %edx,%ebx
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%edi
  add    %eax,%edi
  movswl 0x2c(%rsp),%r12d
  add    %eax,%r12d
  mov    %r15d,0x1c(%rsp)
  mov    0x8(%rsp),%r11
  jmp    L1209
L2911:
  add    $0x1,%eax
  add    $0x4,%edx
  cmp    %ax,%r10w
  je     L3220
L268:
  movzwl %ax,%ebp
  cmp    %esi,%ebp
  jl     L2911
  cmp    %r11d,%ebp
  jg     L2911
  lea    (%r12,%rbp,4),%ebp
  mov    %edx,%r13d
  mov    (%r14,%r13,1),%r13d
  or     %r13d,(%r15,%rbp,1)
  jmp    L2911
L3220:
  add    $0x1,%r9d
  add    0x1c(%rsp),%ecx
  cmp    %r9w,%r8w
  je     L3035
L1965:
  movzwl %r9w,%eax
  cmp    %edi,%eax
  jl     L3220
  cmp    %ebx,%eax
  jg     L3220
  movzwl 0x1a(%rsp),%eax
  test   %ax,%ax
  jle    L3220
  movzwl %r9w,%r12d
  imul   0x14(%rsp),%r12d
  mov    %eax,%r10d
  movzwl 0x18(%rsp),%eax
  add    %eax,%r10d
  mov    %ecx,%edx
  jmp    L268
L2217:
  add    $0x1,%eax
  add    $0x3,%edx
  cmp    %ax,%bp
  je     L720
L2887:
  movzwl %ax,%esi
  cmp    %edi,%esi
  jl     L2217
  cmp    %r12d,%esi
  jg     L2217
  lea    (%rsi,%rsi,2),%esi
  lea    (%rsi,%r15,1),%esi
  mov    %edx,%r13d
  movzbl (%r14,%r13,1),%ecx
  or     %cl,(%r11,%rsi,1)
  movzbl 0x1(%r14,%r13,1),%ecx
  or     %cl,0x1(%r11,%rsi,1)
  movzbl 0x2(%r14,%r13,1),%r13d
  or     %r13b,0x2(%r11,%rsi,1)
  jmp    L2217
L720:
  mov    0x8(%rsp),%ecx
L49:
  add    $0x1,%r9d
  add    0x1c(%rsp),%ecx
  cmp    %r9w,%r8w
  je     L3035
L1209:
  movzwl %r9w,%eax
  cmp    %r10d,%eax
  jl     L49
  cmp    %ebx,%eax
  jg     L49
  movzwl 0x1a(%rsp),%esi
  test   %si,%si
  jle    L49
  imul   0x14(%rsp),%eax
  mov    %eax,%r15d
  movzwl 0x18(%rsp),%eax
  add    %eax,%esi
  mov    %esi,%ebp
  mov    %ecx,%edx
  mov    %ecx,0x8(%rsp)
  jmp    L2887
L2931:
  add    $0x1,%eax
  add    $0x2,%edx
  cmp    %ax,%r10w
  je     L2171
L4066:
  movzwl %ax,%ebp
  cmp    %esi,%ebp
  jl     L2931
  cmp    %r11d,%ebp
  jg     L2931
  lea    (%r12,%rbp,2),%ebp
  mov    %edx,%r13d
  movzwl (%r14,%r13,1),%r13d
  or     %r13w,(%r15,%rbp,1)
  jmp    L2931
L2171:
  add    $0x1,%r9d
  add    0x1c(%rsp),%ecx
  cmp    %r9w,%r8w
  je     L3035
L2614:
  movzwl %r9w,%eax
  cmp    %edi,%eax
  jl     L2171
  cmp    %ebx,%eax
  jg     L2171
  movzwl 0x1a(%rsp),%eax
  test   %ax,%ax
  jle    L2171
  movzwl %r9w,%r12d
  imul   0x14(%rsp),%r12d
  mov    %eax,%r10d
  movzwl 0x18(%rsp),%eax
  add    %eax,%r10d
  mov    %ecx,%edx
  jmp    L4066
  cmp    $0x3,%cl
  je     L1117
  cmp    $0x4,%cl
  je     L1426
  cmp    $0x2,%cl
  jne    L3035
  lea    (%r9,%rdi,1),%r8d
  mov    $0x0,%ecx
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%edi
  movswl 0x30(%rsp),%ebx
  add    %edx,%ebx
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%esi
  add    %eax,%esi
  movswl 0x2c(%rsp),%r11d
  add    %eax,%r11d
  mov    %r15d,0x1c(%rsp)
  mov    0x8(%rsp),%r15
  jmp    L4005
L1426:
  lea    (%r9,%rdi,1),%r8d
  mov    $0x0,%ecx
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%edi
  movswl 0x30(%rsp),%ebx
  add    %edx,%ebx
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%esi
  add    %eax,%esi
  movswl 0x2c(%rsp),%r11d
  add    %eax,%r11d
  mov    %r15d,0x1c(%rsp)
  mov    0x8(%rsp),%r15
  jmp    L2223
L1117:
  lea    (%r9,%rdi,1),%r8d
  mov    $0x0,%ecx
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%r10d
  movswl 0x30(%rsp),%ebx
  add    %edx,%ebx
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%edi
  add    %eax,%edi
  movswl 0x2c(%rsp),%r12d
  add    %eax,%r12d
  mov    %r15d,0x1c(%rsp)
  mov    0x8(%rsp),%r11
  jmp    L2507
L2416:
  add    $0x1,%eax
  add    $0x4,%edx
  cmp    %ax,%r10w
  je     L4043
L1332:
  movzwl %ax,%ebp
  cmp    %esi,%ebp
  jl     L2416
  cmp    %r11d,%ebp
  jg     L2416
  lea    (%r12,%rbp,4),%ebp
  mov    %edx,%r13d
  mov    (%r14,%r13,1),%r13d
  and    %r13d,(%r15,%rbp,1)
  jmp    L2416
L4043:
  add    $0x1,%r9d
  add    0x1c(%rsp),%ecx
  cmp    %r9w,%r8w
  je     L3035
L2223:
  movzwl %r9w,%eax
  cmp    %edi,%eax
  jl     L4043
  cmp    %ebx,%eax
  jg     L4043
  movzwl 0x1a(%rsp),%eax
  test   %ax,%ax
  jle    L4043
  movzwl %r9w,%r12d
  imul   0x14(%rsp),%r12d
  mov    %eax,%r10d
  movzwl 0x18(%rsp),%eax
  add    %eax,%r10d
  mov    %ecx,%edx
  jmp    L1332
L713:
  add    $0x1,%eax
  add    $0x3,%edx
  cmp    %ax,%bp
  je     L1802
L359:
  movzwl %ax,%esi
  cmp    %edi,%esi
  jl     L713
  cmp    %r12d,%esi
  jg     L713
  lea    (%rsi,%rsi,2),%esi
  lea    (%rsi,%r15,1),%esi
  mov    %edx,%r13d
  movzbl (%r14,%r13,1),%ecx
  and    %cl,(%r11,%rsi,1)
  movzbl 0x1(%r14,%r13,1),%ecx
  and    %cl,0x1(%r11,%rsi,1)
  movzbl 0x2(%r14,%r13,1),%r13d
  and    %r13b,0x2(%r11,%rsi,1)
  jmp    L713
L1802:
  mov    0x8(%rsp),%ecx
L1294:
  add    $0x1,%r9d
  add    0x1c(%rsp),%ecx
  cmp    %r9w,%r8w
  je     L3035
L2507:
  movzwl %r9w,%eax
  cmp    %r10d,%eax
  jl     L1294
  cmp    %ebx,%eax
  jg     L1294
  movzwl 0x1a(%rsp),%esi
  test   %si,%si
  jle    L1294
  imul   0x14(%rsp),%eax
  mov    %eax,%r15d
  movzwl 0x18(%rsp),%eax
  add    %eax,%esi
  mov    %esi,%ebp
  mov    %ecx,%edx
  mov    %ecx,0x8(%rsp)
  jmp    L359
L842:
  add    $0x1,%eax
  add    $0x2,%edx
  cmp    %ax,%r10w
  je     L1533
L1769:
  movzwl %ax,%ebp
  cmp    %esi,%ebp
  jl     L842
  cmp    %r11d,%ebp
  jg     L842
  lea    (%r12,%rbp,2),%ebp
  mov    %edx,%r13d
  movzwl (%r14,%r13,1),%r13d
  and    %r13w,(%r15,%rbp,1)
  jmp    L842
L1533:
  add    $0x1,%r9d
  add    0x1c(%rsp),%ecx
  cmp    %r9w,%r8w
  je     L3035
L4005:
  movzwl %r9w,%eax
  cmp    %edi,%eax
  jl     L1533
  cmp    %ebx,%eax
  jg     L1533
  movzwl 0x1a(%rsp),%eax
  test   %ax,%ax
  jle    L1533
  movzwl %r9w,%r12d
  imul   0x14(%rsp),%r12d
  mov    %eax,%r10d
  movzwl 0x18(%rsp),%eax
  add    %eax,%r10d
  mov    %ecx,%edx
  jmp    L1769
  cmp    $0x3,%cl
  je     L679
  cmp    $0x4,%cl
  je     L3785
  cmp    $0x2,%cl
  jne    L3035
  lea    (%r9,%rdi,1),%r10d
  mov    $0x0,%esi
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%r8d
  movswl 0x30(%rsp),%eax
  lea    (%rax,%rdx,1),%r12d
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%edi
  add    %eax,%edi
  movswl 0x2c(%rsp),%ebx
  add    %eax,%ebx
  mov    %r15d,0x1c(%rsp)
  jmp    L2528
L3785:
  lea    (%r9,%rdi,1),%r10d
  mov    $0x0,%esi
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%r8d
  movswl 0x30(%rsp),%ebp
  add    %edx,%ebp
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%edi
  add    %eax,%edi
  movswl 0x2c(%rsp),%ebx
  add    %eax,%ebx
  jmp    L3025
L679:
  lea    (%r9,%rdi,1),%r8d
  mov    $0x0,%esi
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%r10d
  movswl 0x30(%rsp),%eax
  add    %edx,%eax
  mov    %eax,0x24(%rsp)
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%edi
  add    %eax,%edi
  movswl 0x2c(%rsp),%edx
  lea    (%rdx,%rax,1),%r12d
  jmp    L1722
L3521:
  add    $0x1,%eax
  add    $0x4,%ecx
  cmp    %ax,%r11w
  je     L1363
L1459:
  movzwl %ax,%edx
  cmp    %edi,%edx
  jl     L3521
  cmp    %ebx,%edx
  jg     L3521
  mov    %ecx,%r12d
  mov    (%r14,%r12,1),%r12d
  mov    %r12d,%r13d
  xor    0xd0(%rsp),%r13d
  test   $0xffffff00,%r13d
  je     L3521
  mov    0x1c(%rsp),%r13d
  lea    0x0(%r13,%rdx,4),%edx
  mov    0x8(%rsp),%r13
  mov    %r12d,0x0(%r13,%rdx,1)
  jmp    L3521
L1363:
  add    $0x1,%r9d
  add    %r15d,%esi
  cmp    %r9w,%r10w
  je     L3035
L3025:
  movzwl %r9w,%eax
  cmp    %r8d,%eax
  jl     L1363
  cmp    %ebp,%eax
  jg     L1363
  movzwl 0x1a(%rsp),%ecx
  test   %cx,%cx
  jle    L1363
  imul   0x14(%rsp),%eax
  mov    %eax,0x1c(%rsp)
  movzwl 0x18(%rsp),%eax
  add    %eax,%ecx
  mov    %ecx,%r11d
  mov    %esi,%ecx
  jmp    L1459
L3664:
  add    $0x1,%eax
  add    $0x3,%ecx
  cmp    %ax,%r11w
  je     L3812
L1405:
  movzwl %ax,%edx
  cmp    %edi,%edx
  jl     L3664
  cmp    %r12d,%edx
  jg     L3664
  mov    %ecx,%ebx
  lea    (%r14,%rbx,1),%rbp
  mov    0xd0(%rsp),%r13d
  xor    0x0(%rbp),%r13d
  test   $0xffffff00,%r13d
  je     L3664
  lea    (%rdx,%rdx,2),%edx
  mov    0x1c(%rsp),%r13d
  lea    (%rdx,%r13,1),%edx
  movzbl 0x0(%rbp),%ebp
  mov    0x8(%rsp),%r13
  mov    %bpl,0x0(%r13,%rdx,1)
  movzbl 0x1(%r14,%rbx,1),%ebp
  mov    %bpl,0x1(%r13,%rdx,1)
  movzbl 0x2(%r14,%rbx,1),%ebx
  mov    %bl,0x2(%r13,%rdx,1)
  jmp    L3664
L3812:
  add    $0x1,%r9d
  add    %r15d,%esi
  cmp    %r9w,%r8w
  je     L3035
L1722:
  movzwl %r9w,%eax
  cmp    %r10d,%eax
  jl     L3812
  cmp    0x24(%rsp),%eax
  jg     L3812
  movzwl 0x1a(%rsp),%ebx
  test   %bx,%bx
  jle    L3812
  imul   0x14(%rsp),%eax
  mov    %eax,0x1c(%rsp)
  movzwl 0x18(%rsp),%eax
  add    %eax,%ebx
  mov    %ebx,%r11d
  mov    %esi,%ecx
  jmp    L1405
L624:
  add    $0x1,%eax
  add    $0x2,%ecx
  cmp    %ax,%r11w
  je     L2075
L2488:
  movzwl %ax,%edx
  cmp    %edi,%edx
  jl     L624
  cmp    %ebx,%edx
  jg     L624
  mov    %ecx,%ebp
  movzwl (%r14,%rbp,1),%ebp
  movzwl %bp,%r13d
  cmp    %r13d,%r15d
  je     L624
  mov    0x20(%rsp),%r13d
  lea    0x0(%r13,%rdx,2),%edx
  mov    0x8(%rsp),%r13
  mov    %bp,0x0(%r13,%rdx,1)
  jmp    L624
L2075:
  add    $0x1,%r9d
  add    0x1c(%rsp),%esi
  cmp    %r9w,%r10w
  je     L3035
L2528:
  movzwl %r9w,%eax
  cmp    %r8d,%eax
  jl     L2075
  cmp    %r12d,%eax
  jg     L2075
  movzwl 0x1a(%rsp),%ecx
  test   %cx,%cx
  jle    L2075
  imul   0x14(%rsp),%eax
  mov    %eax,0x20(%rsp)
  movzwl 0x18(%rsp),%eax
  add    %eax,%ecx
  mov    %ecx,%r11d
  mov    %esi,%ecx
  movzwl 0xd0(%rsp),%r15d
  jmp    L2488
  cmp    $0x3,%cl
  je     L406
  cmp    $0x4,%cl
  je     L2140
  cmp    $0x2,%cl
  jne    L3035
  lea    (%r9,%rdi,1),%r10d
  mov    $0x0,%esi
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%r8d
  movswl 0x30(%rsp),%eax
  add    %edx,%eax
  mov    %eax,0x24(%rsp)
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%edi
  add    %eax,%edi
  movswl 0x2c(%rsp),%edx
  lea    (%rdx,%rax,1),%r13d
  mov    %r14,0x90(%rsp)
  jmp    L1094
L2140:
  lea    (%r9,%rdi,1),%r8d
  mov    $0x0,%ecx
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%edi
  movswl 0x30(%rsp),%ebx
  add    %edx,%ebx
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%esi
  add    %eax,%esi
  movswl 0x2c(%rsp),%ebp
  add    %eax,%ebp
  jmp    L1394
L406:
  lea    (%r9,%rdi,1),%r10d
  mov    $0x0,%ecx
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%edi
  movswl 0x30(%rsp),%eax
  lea    (%rax,%rdx,1),%r12d
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%esi
  add    %eax,%esi
  movswl 0x2c(%rsp),%edx
  lea    (%rdx,%rax,1),%r13d
  mov    %r15d,0x1c(%rsp)
  jmp    L787
L23:
  add    $0x1,%eax
  add    $0x4,%edx
  cmp    %ax,%r11w
  je     L2611
L3258:
  movzwl %ax,%r10d
  cmp    %esi,%r10d
  jl     L23
  cmp    %ebp,%r10d
  jg     L23
  lea    (%r12,%r10,4),%r10d
  add    0x8(%rsp),%r10
  mov    0xd0(%rsp),%r13d
  xor    (%r10),%r13d
  test   $0xffffff00,%r13d
  jne    L23
  mov    %edx,%r13d
  mov    (%r14,%r13,1),%r13d
  mov    %r13d,(%r10)
  jmp    L23
L2611:
  add    $0x1,%r9d
  add    %r15d,%ecx
  cmp    %r9w,%r8w
  je     L3035
L1394:
  movzwl %r9w,%eax
  cmp    %edi,%eax
  jl     L2611
  cmp    %ebx,%eax
  jg     L2611
  movzwl 0x1a(%rsp),%eax
  test   %ax,%ax
  jle    L2611
  movzwl %r9w,%r12d
  imul   0x14(%rsp),%r12d
  mov    %eax,%r11d
  movzwl 0x18(%rsp),%eax
  add    %eax,%r11d
  mov    %ecx,%edx
  jmp    L3258
L3387:
  add    $0x1,%eax
  add    $0x3,%edx
  cmp    %r8w,%ax
  je     L1827
L66:
  movzwl %ax,%r11d
  cmp    %esi,%r11d
  jl     L3387
  cmp    %r13d,%r11d
  jg     L3387
  lea    (%r11,%r11,2),%ebp
  mov    %ebp,%ebx
  mov    %edx,%r11d
  add    0x8(%rsp),%rbx
  cmp    %r15d,(%rbx,%r11,1)
  jne    L3387
  mov    0x28(%rsp),%ebx
  lea    (%rbx,%rdx,1),%ebx
  mov    0x24(%rsp),%ecx
  lea    (%rcx,%rbp,1),%r11d
  movzbl (%r14,%rbx,1),%ebp
  mov    0x8(%rsp),%rcx
  mov    %bpl,(%rcx,%r11,1)
  movzbl 0x1(%r14,%rbx,1),%ebp
  mov    %bpl,0x1(%rcx,%r11,1)
  movzbl 0x2(%r14,%rbx,1),%ebx
  mov    %bl,0x2(%rcx,%r11,1)
  jmp    L3387
L1827:
  mov    0x20(%rsp),%ecx
L3720:
  add    $0x1,%r9d
  add    0x1c(%rsp),%ecx
  cmp    %r9w,%r10w
  je     L3035
L787:
  movzwl %r9w,%eax
  cmp    %edi,%eax
  jl     L3720
  cmp    %r12d,%eax
  jg     L3720
  movzwl 0x1a(%rsp),%edx
  test   %dx,%dx
  jle    L3720
  mov    %eax,%ebx
  imul   0x14(%rsp),%ebx
  mov    %ebx,0x24(%rsp)
  movzwl 0x18(%rsp),%eax
  add    %eax,%edx
  mov    %edx,%r8d
  mov    %ebx,%edx
  mov    0xd0(%rsp),%r15d
  mov    $0x0,%r15b
  mov    %ecx,%r11d
  sub    %ebx,%r11d
  mov    %r11d,0x28(%rsp)
  mov    %ecx,0x20(%rsp)
  jmp    L66
L2920:
  add    $0x1,%eax
  add    $0x2,%ecx
  cmp    %ax,%r11w
  je     L514
L1571:
  movzwl %ax,%edx
  cmp    %edi,%edx
  jl     L2920
  cmp    %r13d,%edx
  jg     L2920
  add    %edx,%edx
  mov    %edx,%ebp
  mov    %ecx,%ebx
  add    0x8(%rsp),%rbp
  movzwl 0x0(%rbp,%rbx,1),%ebx
  cmp    %r14d,%ebx
  jne    L2920
  mov    0x1c(%rsp),%ebx
  lea    (%rbx,%rcx,1),%ebx
  mov    0x90(%rsp),%rbp
  movzwl 0x0(%rbp,%rbx,1),%ebx
  lea    (%r12,%rdx,1),%edx
  mov    0x8(%rsp),%rbp
  mov    %bx,0x0(%rbp,%rdx,1)
  jmp    L2920
L514:
  add    $0x1,%r9d
  add    %r15d,%esi
  cmp    %r9w,%r10w
  je     L3035
L1094:
  movzwl %r9w,%eax
  cmp    %r8d,%eax
  jl     L514
  cmp    0x24(%rsp),%eax
  jg     L514
  movzwl 0x1a(%rsp),%eax
  test   %ax,%ax
  jle    L514
  movzwl %r9w,%r12d
  imul   0x14(%rsp),%r12d
  mov    %eax,%r11d
  movzwl 0x18(%rsp),%eax
  add    %eax,%r11d
  mov    %r12d,%ecx
  movzwl 0xd0(%rsp),%r14d
  mov    %esi,%ebx
  sub    %r12d,%ebx
  mov    %ebx,0x1c(%rsp)
  jmp    L1571
  cmp    $0x3,%cl
  je     L1268
  cmp    $0x4,%cl
  je     L251
  cmp    $0x2,%cl
  jne    L3035
  lea    (%r9,%rdi,1),%r12d
  mov    $0x0,%r13d
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%ebx
  mov    %ebx,0x34(%rsp)
  movswl 0x28(%rsp),%eax
  add    %ebx,%eax
  mov    %eax,%ebx
  movswl 0x30(%rsp),%eax
  mov    %eax,0x28(%rsp)
  movswl 0x20(%rsp),%edi
  mov    %edi,0x38(%rsp)
  movswl 0x2c(%rsp),%eax
  add    %edi,%eax
  mov    %eax,0x24(%rsp)
  movzbl 0x40(%rsp),%eax
  not    %eax
  movzbl %al,%eax
  mov    %eax,0x3c(%rsp)
  mov    %r15d,0x20(%rsp)
  mov    %r14,0x90(%rsp)
  mov    %ebx,%r14d
  jmp    L3029
L251:
  lea    (%r9,%rdi,1),%eax
  mov    %ax,0x40(%rsp)
  mov    $0x0,%r8d
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%ebx
  movswl 0x30(%rsp),%eax
  add    %edx,%eax
  mov    %eax,0x28(%rsp)
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%edx
  lea    (%rdx,%rax,1),%r13d
  movswl 0x2c(%rsp),%edx
  add    %edx,%eax
  mov    %eax,0x24(%rsp)
  mov    %r15d,0x1c(%rsp)
  mov    %r14,0x90(%rsp)
  mov    %ebx,%r15d
  jmp    L3285
L1268:
  lea    (%r9,%rdi,1),%ebp
  mov    $0x0,%r12d
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%ebx
  mov    %ebx,0x34(%rsp)
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rbx,1),%r11d
  movswl 0x30(%rsp),%eax
  mov    %eax,0x28(%rsp)
  movswl 0x20(%rsp),%ebx
  mov    %ebx,0x48(%rsp)
  movswl 0x2c(%rsp),%eax
  add    %ebx,%eax
  mov    %eax,0x24(%rsp)
  movzbl 0x40(%rsp),%eax
  not    %eax
  movzbl %al,%eax
  mov    %eax,0x4c(%rsp)
  mov    %r15d,0x20(%rsp)
  mov    %r14,%r13
  jmp    L82
L2784:
  add    $0x1,%edx
  add    $0x4,%edi
  cmp    %dx,%r12w
  je     L3080
L3062:
  movzwl %dx,%eax
  cmp    %r13d,%eax
  jl     L2784
  cmp    0x24(%rsp),%eax
  jg     L2784
  mov    0x2c(%rsp),%ebx
  lea    (%rbx,%rax,4),%ebx
  add    0x8(%rsp),%rbx
  mov    (%rbx),%esi
  mov    %edi,%eax
  mov    0x90(%rsp),%rcx
  mov    (%rcx,%rax,1),%eax
  mov    %eax,%ebp
  shr    $0x18,%ebp
  mov    %ebp,%r11d
  not    %r11d
  movzbl %r11b,%r11d
  movzbl %ah,%ecx
  mov    %ecx,%r10d
  imul   %ebp,%r10d
  mov    %esi,%ecx
  movzbl %ch,%esi
  imul   %r11d,%esi
  add    %esi,%r10d
  and    $0xff00,%r10d
  movzbl %al,%esi
  imul   %ebp,%esi
  mov    %ecx,0x20(%rsp)
  movzbl 0x20(%rsp),%r14d
  imul   %r11d,%r14d
  add    %r14d,%esi
  mov    %esi,%ecx
  movzbl %ch,%esi
  or     %r10d,%esi
  mov    %eax,%r10d
  and    $0xff000000,%r10d
  or     %esi,%r10d
  shr    $0x10,%eax
  movzbl %al,%eax
  imul   %ebp,%eax
  mov    0x20(%rsp),%ecx
  shr    $0x10,%ecx
  movzbl %cl,%ecx
  imul   %r11d,%ecx
  add    %ecx,%eax
  shl    $0x8,%eax
  and    $0xff0000,%eax
  or     %eax,%r10d
  mov    %r10d,(%rbx)
  jmp    L2784
L3080:
  add    $0x1,%r9d
  add    0x1c(%rsp),%r8d
  cmp    %r9w,0x40(%rsp)
  je     L3035
L3285:
  movzwl %r9w,%eax
  cmp    %r15d,%eax
  jl     L3080
  cmp    0x28(%rsp),%eax
  jg     L3080
  movzwl 0x1a(%rsp),%ebx
  test   %bx,%bx
  jle    L3080
  imul   0x14(%rsp),%eax
  mov    %eax,0x2c(%rsp)
  movzwl 0x18(%rsp),%edx
  add    %edx,%ebx
  mov    %ebx,%r12d
  mov    %r8d,%edi
  jmp    L3062
L867:
  add    $0x1,%eax
  add    $0x3,%edx
  cmp    %ax,%r8w
  je     L962
L3160:
  movzwl %ax,%ecx
  cmp    %edi,%ecx
  jl     L867
  cmp    0x24(%rsp),%ecx
  jg     L867
  lea    (%rcx,%rcx,2),%ecx
  mov    0x30(%rsp),%ebx
  lea    (%rcx,%rbx,1),%ecx
  lea    (%r9,%rcx,1),%r15
  lea    0x1(%r9,%rcx,1),%r14
  lea    0x2(%r9,%rcx,1),%rbp
  mov    %edx,%esi
  movzbl 0x1(%r13,%rsi,1),%ebx
  imul   %r11d,%ebx
  movzbl (%r14),%ecx
  imul   %r12d,%ecx
  add    %ecx,%ebx
  movzbl 0x2(%r13,%rsi,1),%ecx
  imul   %r11d,%ecx
  movzbl 0x0(%rbp),%r10d
  imul   %r12d,%r10d
  add    %r10d,%ecx
  mov    %ecx,0x2c(%rsp)
  movzbl 0x0(%r13,%rsi,1),%esi
  imul   %r11d,%esi
  movzbl (%r15),%r10d
  imul   %r12d,%r10d
  add    %r10d,%esi
  mov    %esi,%ecx
  movzbl %ch,%ecx
  mov    %cl,(%r15)
  movzbl %bh,%ebx
  mov    %bl,(%r14)
  mov    0x2c(%rsp),%ebx
  movzbl %bh,%ebx
  mov    %bl,0x0(%rbp)
  jmp    L867
L962:
  movzwl 0x38(%rsp),%ebp
  mov    0x3c(%rsp),%r12d
  movzwl 0x42(%rsp),%r9d
  mov    0x44(%rsp),%r11d
L2322:
  add    $0x1,%r9d
  add    0x20(%rsp),%r12d
  cmp    %r9w,%bp
  je     L3035
L82:
  movzwl %r9w,%eax
  cmp    %r11d,%eax
  jl     L2322
  mov    0x28(%rsp),%edx
  add    0x34(%rsp),%edx
  cmp    %edx,%eax
  jg     L2322
  movzwl 0x1a(%rsp),%ebx
  test   %bx,%bx
  jle    L2322
  imul   0x14(%rsp),%eax
  mov    %eax,0x30(%rsp)
  movzwl 0x18(%rsp),%eax
  add    %eax,%ebx
  mov    %ebx,%r8d
  mov    %r12d,%edx
  movswl 0x1c(%rsp),%edi
  add    0x48(%rsp),%edi
  movzbl 0x40(%rsp),%ebx
  mov    %bp,0x38(%rsp)
  mov    %r12d,0x3c(%rsp)
  mov    %r9w,0x42(%rsp)
  mov    0x8(%rsp),%r9
  mov    %r11d,0x44(%rsp)
  mov    %ebx,%r11d
  mov    0x4c(%rsp),%r12d
  jmp    L3160
L1096:
  add    $0x1,%eax
  add    $0x2,%r8d
  cmp    %ax,%bx
  je     L2496
L3918:
  movzwl %ax,%edx
  cmp    %r10d,%edx
  jl     L1096
  cmp    0x24(%rsp),%edx
  jg     L1096
  mov    0x2c(%rsp),%edi
  lea    (%rdi,%rdx,2),%r11d
  add    0x8(%rsp),%r11
  movzwl (%r11),%edi
  mov    %r8d,%edx
  mov    0x90(%rsp),%rcx
  movzwl (%rcx,%rdx,1),%edx
  mov    %edx,%ecx
  shr    $0xb,%cx
  movzwl %cx,%ecx
  imul   %r15d,%ecx
  mov    %edi,%esi
  shr    $0xb,%si
  movzwl %si,%esi
  imul   %r9d,%esi
  add    %ecx,%esi
  sar    $0x8,%esi
  shl    $0xb,%esi
  mov    %edx,%ecx
  and    $0x1f,%ecx
  imul   %r15d,%ecx
  mov    %edi,%ebp
  and    $0x1f,%ebp
  imul   %r9d,%ebp
  add    %ebp,%ecx
  sar    $0x8,%ecx
  or     %esi,%ecx
  shr    $0x5,%dx
  and    $0x3f,%edx
  imul   %r15d,%edx
  shr    $0x5,%di
  and    $0x3f,%edi
  imul   %r9d,%edi
  add    %edi,%edx
  sar    $0x8,%edx
  shl    $0x5,%edx
  or     %edx,%ecx
  mov    %cx,(%r11)
  jmp    L1096
L2496:
  movzwl 0x30(%rsp),%r9d
L3227:
  add    $0x1,%r9d
  add    0x20(%rsp),%r13d
  cmp    %r9w,%r12w
  je     L3035
L3029:
  movzwl %r9w,%eax
  cmp    %r14d,%eax
  jl     L3227
  mov    0x28(%rsp),%edx
  add    0x34(%rsp),%edx
  cmp    %edx,%eax
  jg     L3227
  movzwl 0x1a(%rsp),%ebx
  test   %bx,%bx
  jle    L3227
  imul   0x14(%rsp),%eax
  mov    %eax,0x2c(%rsp)
  movzwl 0x18(%rsp),%eax
  add    %eax,%ebx
  mov    %r13d,%r8d
  movswl 0x1c(%rsp),%r10d
  add    0x38(%rsp),%r10d
  movzbl 0x40(%rsp),%r15d
  mov    %r9w,0x30(%rsp)
  mov    0x3c(%rsp),%r9d
  jmp    L3918
  cmp    $0x3,%cl
  je     L1784
  cmp    $0x4,%cl
  je     L364
  cmp    $0x2,%cl
  jne    L3035
  lea    (%r9,%rdi,1),%r8d
  mov    $0x0,%ecx
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%edi
  movswl 0x30(%rsp),%ebx
  add    %edx,%ebx
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%esi
  add    %eax,%esi
  movswl 0x2c(%rsp),%r11d
  add    %eax,%r11d
  mov    %r15d,0x1c(%rsp)
  mov    0x8(%rsp),%r15
  jmp    L0
L364:
  lea    (%r9,%rdi,1),%r8d
  mov    $0x0,%ecx
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%edi
  movswl 0x30(%rsp),%ebx
  add    %edx,%ebx
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%esi
  add    %eax,%esi
  movswl 0x2c(%rsp),%r11d
  add    %eax,%r11d
  mov    %r15d,0x1c(%rsp)
  mov    0x8(%rsp),%r15
  jmp    L2338
L1784:
  lea    (%r9,%rdi,1),%r8d
  mov    $0x0,%ecx
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%r10d
  movswl 0x30(%rsp),%ebx
  add    %edx,%ebx
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%edi
  add    %eax,%edi
  movswl 0x2c(%rsp),%r12d
  add    %eax,%r12d
  mov    %r15d,0x1c(%rsp)
  mov    0x8(%rsp),%r11
  jmp    L1620
L473:
  add    $0x1,%eax
  add    $0x4,%edx
  cmp    %r10w,%ax
  je     L1343
L2335:
  movzwl %ax,%ebp
  cmp    %esi,%ebp
  jl     L473
  cmp    %r11d,%ebp
  jg     L473
  lea    (%r12,%rbp,4),%ebp
  mov    %edx,%r13d
  mov    (%r14,%r13,1),%r13d
  add    %r13d,(%r15,%rbp,1)
  jmp    L473
L1343:
  add    $0x1,%r9d
  add    0x1c(%rsp),%ecx
  cmp    %r8w,%r9w
  je     L3035
L2338:
  movzwl %r9w,%eax
  cmp    %edi,%eax
  jl     L1343
  cmp    %ebx,%eax
  jg     L1343
  movzwl 0x1a(%rsp),%eax
  test   %ax,%ax
  jle    L1343
  movzwl %r9w,%r12d
  imul   0x14(%rsp),%r12d
  mov    %eax,%r10d
  movzwl 0x18(%rsp),%eax
  add    %eax,%r10d
  mov    %ecx,%edx
  jmp    L2335
L1712:
  add    $0x1,%eax
  add    $0x3,%edx
  cmp    %bp,%ax
  je     L3431
L3364:
  movzwl %ax,%esi
  cmp    %edi,%esi
  jl     L1712
  cmp    %r12d,%esi
  jg     L1712
  lea    (%rsi,%rsi,2),%esi
  lea    (%rsi,%r15,1),%esi
  mov    %edx,%r13d
  movzbl (%r14,%r13,1),%ecx
  add    %cl,(%r11,%rsi,1)
  movzbl 0x1(%r14,%r13,1),%ecx
  add    %cl,0x1(%r11,%rsi,1)
  movzbl 0x2(%r14,%r13,1),%r13d
  add    %r13b,0x2(%r11,%rsi,1)
  jmp    L1712
L3431:
  mov    0x8(%rsp),%ecx
L2180:
  add    $0x1,%r9d
  add    0x1c(%rsp),%ecx
  cmp    %r8w,%r9w
  je     L3035
L1620:
  movzwl %r9w,%eax
  cmp    %r10d,%eax
  jl     L2180
  cmp    %ebx,%eax
  jg     L2180
  movzwl 0x1a(%rsp),%esi
  test   %si,%si
  jle    L2180
  imul   0x14(%rsp),%eax
  mov    %eax,%r15d
  movzwl 0x18(%rsp),%eax
  add    %eax,%esi
  mov    %esi,%ebp
  mov    %ecx,%edx
  mov    %ecx,0x8(%rsp)
  jmp    L3364
L1112:
  add    $0x1,%eax
  add    $0x2,%edx
  cmp    %ax,%r10w
  je     L2220
L2733:
  movzwl %ax,%ebp
  cmp    %esi,%ebp
  jl     L1112
  cmp    %r11d,%ebp
  jg     L1112
  lea    (%r12,%rbp,2),%ebp
  mov    %edx,%r13d
  movzwl (%r14,%r13,1),%r13d
  add    %r13w,(%r15,%rbp,1)
  jmp    L1112
L2220:
  add    $0x1,%r9d
  add    0x1c(%rsp),%ecx
  cmp    %r9w,%r8w
  je     L3035
L0:
  movzwl %r9w,%eax
  cmp    %edi,%eax
  jl     L2220
  cmp    %ebx,%eax
  jg     L2220
  movzwl 0x1a(%rsp),%eax
  test   %ax,%ax
  jle    L2220
  movzwl %r9w,%r12d
  imul   0x14(%rsp),%r12d
  mov    %eax,%r10d
  movzwl 0x18(%rsp),%eax
  add    %eax,%r10d
  mov    %ecx,%edx
  jmp    L2733
  cmp    $0x3,%cl
  je     L3956
  cmp    $0x4,%cl
  je     L1519
  cmp    $0x2,%cl
  jne    L3035
  lea    (%r9,%rdi,1),%r8d
  mov    $0x0,%ecx
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%edi
  movswl 0x30(%rsp),%ebx
  add    %edx,%ebx
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%esi
  add    %eax,%esi
  movswl 0x2c(%rsp),%r11d
  add    %eax,%r11d
  mov    %r15d,0x1c(%rsp)
  mov    0x8(%rsp),%r15
  jmp    L742
L1519:
  lea    (%r9,%rdi,1),%r8d
  mov    $0x0,%ecx
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%edi
  movswl 0x30(%rsp),%ebx
  add    %edx,%ebx
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%esi
  add    %eax,%esi
  movswl 0x2c(%rsp),%r11d
  add    %eax,%r11d
  mov    %r15d,0x1c(%rsp)
  mov    0x8(%rsp),%r15
  jmp    L1319
L3956:
  lea    (%r9,%rdi,1),%r8d
  mov    $0x0,%ecx
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%r10d
  movswl 0x30(%rsp),%ebx
  add    %edx,%ebx
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%edi
  add    %eax,%edi
  movswl 0x2c(%rsp),%r12d
  add    %eax,%r12d
  mov    %r15d,0x1c(%rsp)
  mov    0x8(%rsp),%r11
  jmp    L2680
L2810:
  add    $0x1,%eax
  add    $0x4,%edx
  cmp    %r10w,%ax
  je     L404
L1004:
  movzwl %ax,%ebp
  cmp    %esi,%ebp
  jl     L2810
  cmp    %r11d,%ebp
  jg     L2810
  lea    (%r12,%rbp,4),%ebp
  mov    %edx,%r13d
  mov    (%r14,%r13,1),%r13d
  sub    %r13d,(%r15,%rbp,1)
  jmp    L2810
L404:
  add    $0x1,%r9d
  add    0x1c(%rsp),%ecx
  cmp    %r8w,%r9w
  je     L3035
L1319:
  movzwl %r9w,%eax
  cmp    %edi,%eax
  jl     L404
  cmp    %ebx,%eax
  jg     L404
  movzwl 0x1a(%rsp),%eax
  test   %ax,%ax
  jle    L404
  movzwl %r9w,%r12d
  imul   0x14(%rsp),%r12d
  mov    %eax,%r10d
  movzwl 0x18(%rsp),%eax
  add    %eax,%r10d
  mov    %ecx,%edx
  jmp    L1004
L2873:
  add    $0x1,%eax
  add    $0x3,%edx
  cmp    %bp,%ax
  je     L2291
L752:
  movzwl %ax,%esi
  cmp    %edi,%esi
  jl     L2873
  cmp    %r12d,%esi
  jg     L2873
  lea    (%rsi,%rsi,2),%esi
  lea    (%rsi,%r15,1),%esi
  mov    %edx,%r13d
  movzbl (%r14,%r13,1),%ecx
  sub    %cl,(%r11,%rsi,1)
  movzbl 0x1(%r14,%r13,1),%ecx
  sub    %cl,0x1(%r11,%rsi,1)
  movzbl 0x2(%r14,%r13,1),%r13d
  sub    %r13b,0x2(%r11,%rsi,1)
  jmp    L2873
L2291:
  mov    0x8(%rsp),%ecx
L2782:
  add    $0x1,%r9d
  add    0x1c(%rsp),%ecx
  cmp    %r8w,%r9w
  je     L3035
L2680:
  movzwl %r9w,%eax
  cmp    %r10d,%eax
  jl     L2782
  cmp    %ebx,%eax
  jg     L2782
  movzwl 0x1a(%rsp),%esi
  test   %si,%si
  jle    L2782
  imul   0x14(%rsp),%eax
  mov    %eax,%r15d
  movzwl 0x18(%rsp),%eax
  add    %eax,%esi
  mov    %esi,%ebp
  mov    %ecx,%edx
  mov    %ecx,0x8(%rsp)
  jmp    L752
L3255:
  add    $0x1,%eax
  add    $0x2,%edx
  cmp    %r10w,%ax
  je     L3736
L2573:
  movzwl %ax,%ebp
  cmp    %esi,%ebp
  jl     L3255
  cmp    %r11d,%ebp
  jg     L3255
  lea    (%r12,%rbp,2),%ebp
  mov    %edx,%r13d
  movzwl (%r14,%r13,1),%r13d
  sub    %r13w,(%r15,%rbp,1)
  jmp    L3255
L3736:
  add    $0x1,%r9d
  add    0x1c(%rsp),%ecx
  cmp    %r8w,%r9w
  je     L3035
L742:
  movzwl %r9w,%eax
  cmp    %edi,%eax
  jl     L3736
  cmp    %ebx,%eax
  jg     L3736
  movzwl 0x1a(%rsp),%eax
  test   %ax,%ax
  jle    L3736
  movzwl %r9w,%r12d
  imul   0x14(%rsp),%r12d
  mov    %eax,%r10d
  movzwl 0x18(%rsp),%eax
  add    %eax,%r10d
  mov    %ecx,%edx
  jmp    L2573
  cmp    $0x3,%cl
  je     L1682
  cmp    $0x4,%cl
  je     L1285
  cmp    $0x2,%cl
  jne    L3035
  lea    (%r9,%rdi,1),%r8d
  mov    $0x0,%ecx
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%r10d
  movswl 0x30(%rsp),%ebx
  add    %edx,%ebx
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%esi
  add    %eax,%esi
  movswl 0x2c(%rsp),%r12d
  add    %eax,%r12d
  jmp    L2704
L1285:
  lea    (%r9,%rdi,1),%r8d
  mov    $0x0,%ecx
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%r10d
  movswl 0x30(%rsp),%ebx
  add    %edx,%ebx
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%esi
  add    %eax,%esi
  movswl 0x2c(%rsp),%r12d
  add    %eax,%r12d
  jmp    L1745
L1682:
  lea    (%r9,%rdi,1),%r8d
  mov    $0x0,%esi
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%r11d
  movswl 0x30(%rsp),%eax
  add    %edx,%eax
  mov    %eax,0x24(%rsp)
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%r10d
  add    %eax,%r10d
  movswl 0x2c(%rsp),%edx
  add    %edx,%eax
  mov    %eax,0x20(%rsp)
  mov    %r15d,0x1c(%rsp)
  mov    0x8(%rsp),%r12
  jmp    L2997
L930:
  add    $0x1,%eax
  add    $0x4,%edx
  cmp    %r11w,%ax
  je     L3350
L2739:
  movzwl %ax,%edi
  cmp    %esi,%edi
  jl     L930
  cmp    %r12d,%edi
  jg     L930
  lea    0x0(%r13,%rdi,4),%edi
  add    0x8(%rsp),%rdi
  mov    %edx,%ebp
  mov    (%rdi),%ecx
  imul   (%r14,%rbp,1),%ecx
  mov    %ecx,(%rdi)
  jmp    L930
L3350:
  mov    0x1c(%rsp),%ecx
L2467:
  add    $0x1,%r9d
  add    %r15d,%ecx
  cmp    %r8w,%r9w
  je     L3035
L1745:
  movzwl %r9w,%eax
  cmp    %r10d,%eax
  jl     L2467
  cmp    %ebx,%eax
  jg     L2467
  movzwl 0x1a(%rsp),%eax
  test   %ax,%ax
  jle    L2467
  movzwl %r9w,%r13d
  imul   0x14(%rsp),%r13d
  mov    %eax,%r11d
  movzwl 0x18(%rsp),%eax
  add    %eax,%r11d
  mov    %ecx,%edx
  mov    %ecx,0x1c(%rsp)
  jmp    L2739
L989:
  add    $0x1,%edx
  add    $0x3,%ecx
  cmp    %bx,%dx
  je     L1556
L2184:
  movzwl %dx,%eax
  cmp    %r10d,%eax
  jl     L989
  cmp    0x20(%rsp),%eax
  jg     L989
  lea    (%rax,%rax,2),%eax
  lea    (%rax,%r15,1),%ebp
  lea    (%r12,%rbp,1),%r13
  mov    %ecx,%edi
  movzbl 0x0(%r13),%eax
  mulb   (%r14,%rdi,1)
  mov    %al,0x0(%r13)
  lea    0x1(%r12,%rbp,1),%r13
  movzbl 0x0(%r13),%eax
  mulb   0x1(%r14,%rdi,1)
  mov    %al,0x0(%r13)
  lea    0x2(%r12,%rbp,1),%rbp
  movzbl 0x0(%rbp),%eax
  mulb   0x2(%r14,%rdi,1)
  mov    %al,0x0(%rbp)
  jmp    L989
L1556:
  add    $0x1,%r9d
  add    0x1c(%rsp),%esi
  cmp    %r8w,%r9w
  je     L3035
L2997:
  movzwl %r9w,%eax
  cmp    %r11d,%eax
  jl     L1556
  cmp    0x24(%rsp),%eax
  jg     L1556
  movzwl 0x1a(%rsp),%ebx
  test   %bx,%bx
  jle    L1556
  imul   0x14(%rsp),%eax
  mov    %eax,%r15d
  movzwl 0x18(%rsp),%edx
  add    %edx,%ebx
  mov    %esi,%ecx
  jmp    L2184
L3554:
  add    $0x1,%eax
  add    $0x2,%edx
  cmp    %r11w,%ax
  je     L3581
L3758:
  movzwl %ax,%edi
  cmp    %esi,%edi
  jl     L3554
  cmp    %r12d,%edi
  jg     L3554
  lea    0x0(%r13,%rdi,2),%edi
  add    0x8(%rsp),%rdi
  mov    %edx,%ebp
  movzwl (%rdi),%ecx
  imul   (%r14,%rbp,1),%cx
  mov    %cx,(%rdi)
  jmp    L3554
L3581:
  mov    0x1c(%rsp),%ecx
L12:
  add    $0x1,%r9d
  add    %r15d,%ecx
  cmp    %r8w,%r9w
  je     L3035
L2704:
  movzwl %r9w,%eax
  cmp    %r10d,%eax
  jl     L12
  cmp    %ebx,%eax
  jg     L12
  movzwl 0x1a(%rsp),%eax
  test   %ax,%ax
  jle    L12
  movzwl %r9w,%r13d
  imul   0x14(%rsp),%r13d
  mov    %eax,%r11d
  movzwl 0x18(%rsp),%eax
  add    %eax,%r11d
  mov    %ecx,%edx
  mov    %ecx,0x1c(%rsp)
  jmp    L3758
  cmp    $0x3,%cl
  je     L2675
  cmp    $0x4,%cl
  je     L2144
  cmp    $0x2,%cl
  jne    L3035
  lea    (%r9,%rdi,1),%r10d
  mov    $0x0,%r8d
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%esi
  movswl 0x30(%rsp),%eax
  add    %edx,%eax
  mov    %eax,0x24(%rsp)
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%ecx
  add    %eax,%ecx
  movswl 0x2c(%rsp),%edi
  add    %eax,%edi
  jmp    L2244
L2144:
  lea    (%r9,%rdi,1),%r10d
  mov    $0x0,%r8d
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%ebx
  movswl 0x30(%rsp),%eax
  add    %edx,%eax
  mov    %eax,0x24(%rsp)
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%edi
  add    %eax,%edi
  movswl 0x2c(%rsp),%r12d
  add    %eax,%r12d
  jmp    L1574
L2675:
  lea    (%r9,%rdi,1),%r10d
  mov    $0x0,%r8d
  test   %di,%di
  jle    L3035
  movswl 0x24(%rsp),%edx
  movswl 0x28(%rsp),%eax
  lea    (%rax,%rdx,1),%r12d
  movswl 0x30(%rsp),%eax
  add    %edx,%eax
  mov    %eax,0x24(%rsp)
  movswl 0x20(%rsp),%eax
  movswl 0x1c(%rsp),%r11d
  add    %eax,%r11d
  movswl 0x2c(%rsp),%edx
  add    %edx,%eax
  mov    %eax,0x20(%rsp)
  mov    %r15d,0x1c(%rsp)
  jmp    L337
L163:
  add    $0x1,%ecx
  add    $0x4,%esi
  cmp    %bp,%cx
  je     L2654
L3225:
  movzwl %cx,%eax
  cmp    %edi,%eax
  jl     L163
  cmp    %r12d,%eax
  jg     L163
  lea    0x0(%r13,%rax,4),%r11d
  add    0x8(%rsp),%r11
  mov    %esi,%edx
  mov    (%r11),%eax
  mov    %rdx,%r8
  mov    $0x0,%edx
  divl   (%r14,%r8,1)
  mov    %eax,(%r11)
  jmp    L163
L2654:
  mov    0x1c(%rsp),%r8d
L431:
  add    $0x1,%r9d
  add    %r15d,%r8d
  cmp    %r10w,%r9w
  je     L3035
L1574:
  movzwl %r9w,%eax
  cmp    %ebx,%eax
  jl     L431
  cmp    0x24(%rsp),%eax
  jg     L431
  movzwl 0x1a(%rsp),%eax
  test   %ax,%ax
  jle    L431
  movzwl %r9w,%r13d
  imul   0x14(%rsp),%r13d
  movzwl 0x18(%rsp),%ecx
  add    %ecx,%eax
  mov    %eax,%ebp
  mov    %r8d,%esi
  mov    %r8d,0x1c(%rsp)
  jmp    L3225
L880:
  add    $0x1,%ecx
  add    $0x3,%esi
  cmp    %bx,%cx
  je     L203
L2260:
  movzwl %cx,%eax
  cmp    %r11d,%eax
  jl     L880
  cmp    0x20(%rsp),%eax
  jg     L880
  lea    (%rax,%rax,2),%eax
  mov    0x28(%rsp),%edi
  lea    (%rax,%rdi,1),%ebp
  lea    (%r8,%rbp,1),%r13
  mov    %esi,%edi
  movsbl 0x0(%r13),%eax
  movsbl (%r14,%rdi,1),%r15d
  cltd
  idiv   %r15d
  mov    %al,0x0(%r13)
  lea    0x1(%r8,%rbp,1),%r13
  movsbl 0x0(%r13),%eax
  movsbl 0x1(%r14,%rdi,1),%r15d
  cltd
  idiv   %r15d
  mov    %al,0x0(%r13)
  lea    0x2(%r8,%rbp,1),%rbp
  movsbl 0x0(%rbp),%eax
  movsbl 0x2(%r14,%rdi,1),%edi
  cltd
  idiv   %edi
  mov    %al,0x0(%rbp)
  jmp    L880
L203:
  mov    0x2c(%rsp),%r8d
L781:
  add    $0x1,%r9d
  add    0x1c(%rsp),%r8d
  cmp    %r10w,%r9w
  je     L3035
L337:
  movzwl %r9w,%eax
  cmp    %r12d,%eax
  jl     L781
  cmp    0x24(%rsp),%eax
  jg     L781
  movzwl 0x1a(%rsp),%ebx
  test   %bx,%bx
  jle    L781
  imul   0x14(%rsp),%eax
  mov    %eax,0x28(%rsp)
  movzwl 0x18(%rsp),%ecx
  add    %ecx,%ebx
  mov    %r8d,%esi
  mov    %r8d,0x2c(%rsp)
  mov    0x8(%rsp),%r8
  jmp    L2260
L851:
  add    $0x1,%r11d
  add    $0x2,%ebx
  cmp    %r12w,%r11w
  je     L2412
L1673:
  movzwl %r11w,%eax
  cmp    %ecx,%eax
  jl     L851
  cmp    %edi,%eax
  jg     L851
  lea    0x0(%r13,%rax,2),%ebp
  add    0x8(%rsp),%rbp
  mov    %ebx,%edx
  movzwl 0x0(%rbp),%eax
  mov    %rdx,%rsi
  mov    $0x0,%edx
  divw   (%r14,%rsi,1)
  mov    %ax,0x0(%rbp)
  jmp    L851
L2412:
  mov    0x1c(%rsp),%esi
L3474:
  add    $0x1,%r9d
  add    %r15d,%r8d
  cmp    %r10w,%r9w
  je     L3035
L2244:
  movzwl %r9w,%eax
  cmp    %esi,%eax
  jl     L3474
  cmp    0x24(%rsp),%eax
  jg     L3474
  movzwl 0x1a(%rsp),%eax
  test   %ax,%ax
  jle    L3474
  movzwl %r9w,%r13d
  imul   0x14(%rsp),%r13d
  movzwl 0x18(%rsp),%r11d
  add    %r11d,%eax
  mov    %eax,%r12d
  mov    %r8d,%ebx
  mov    %esi,0x1c(%rsp)
  jmp    L1673
```

assistant: ```c
void c_blit_write(char *framebuffer, short screen_width, short screen_height, unsigned int bytes_per_line, short xoffset, short yoffset, char *blit_data, short x, short y, short w, short h, unsigned char bytes_per_pixel, unsigned char draw_mode, unsigned char alpha, unsigned int bcolor, short x_clip, short y_clip, short xx_clip, short yy_clip) {
  short fb_x = xoffset + x;
  short fb_y = yoffset + y;
  short xx = x + w;
  short yy = y + h;
  short horizontal;
  short vertical;
  unsigned int bline = w * bytes_per_pixel;
  if (draw_mode == 0 && x >= x_clip && xx <= xx_clip && y >= y_clip && yy <= yy_clip) {
    unsigned char *source = blit_data;
    unsigned char *dest = &framebuffer[(fb_y * bytes_per_line) + (fb_x * bytes_per_pixel)];
    for (vertical = 0; vertical < h; vertical++) {
      memcpy(dest, source, bline);
      source += bline;
      dest += bytes_per_line;
    }
  } else {
    switch (draw_mode) {
    case 0:
      switch (bytes_per_pixel) {
      case 4:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                *((unsigned int *)(framebuffer + xhbp_yvbl)) = *((unsigned int *)(blit_data + vhz));
              }
            }
          }
        }
        break;
      case 3:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                *(framebuffer + xhbp_yvbl) = *(blit_data + vhz);
                *(framebuffer + xhbp_yvbl + 1) = *(blit_data + vhz + 1);
                *(framebuffer + xhbp_yvbl + 2) = *(blit_data + vhz + 2);
              }
            }
          }
        }
        break;
      case 2:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                *((unsigned short *)(framebuffer + xhbp_yvbl)) = *((unsigned short *)(blit_data + vhz));
              }
            }
          }
        }
        break;
      }
      break;
    case 1:
      switch (bytes_per_pixel) {
      case 4:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                *((unsigned int *)(framebuffer + xhbp_yvbl)) ^= *((unsigned int *)(blit_data + vhz));
              }
            }
          }
        }
        break;
      case 3:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                *(framebuffer + xhbp_yvbl) ^= *(blit_data + vhz);
                *(framebuffer + xhbp_yvbl + 1) ^= *(blit_data + vhz + 1);
                *(framebuffer + xhbp_yvbl + 2) ^= *(blit_data + vhz + 2);
              }
            }
          }
        }
        break;
      case 2:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                *((unsigned short *)(framebuffer + xhbp_yvbl)) ^= *((unsigned short *)(blit_data + vhz));
              }
            }
          }
        }
        break;
      }
      break;
    case 2:
      switch (bytes_per_pixel) {
      case 4:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                *((unsigned int *)(framebuffer + xhbp_yvbl)) |= *((unsigned int *)(blit_data + vhz));
              }
            }
          }
        }
        break;
      case 3:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                *(framebuffer + xhbp_yvbl) |= *(blit_data + vhz);
                *(framebuffer + xhbp_yvbl + 1) |= *(blit_data + vhz + 1);
                *(framebuffer + xhbp_yvbl + 2) |= *(blit_data + vhz + 2);
              }
            }
          }
        }
        break;
      case 2:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                *((unsigned short *)(framebuffer + xhbp_yvbl)) |= *((unsigned short *)(blit_data + vhz));
              }
            }
          }
        }
        break;
      }
      break;
    case 3:
      switch (bytes_per_pixel) {
      case 4:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                *((unsigned int *)(framebuffer + xhbp_yvbl)) &= *((unsigned int *)(blit_data + vhz));
              }
            }
          }
        }
        break;
      case 3:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                *(framebuffer + xhbp_yvbl) &= *(blit_data + vhz);
                *(framebuffer + xhbp_yvbl + 1) &= *(blit_data + vhz + 1);
                *(framebuffer + xhbp_yvbl + 2) &= *(blit_data + vhz + 2);
              }
            }
          }
        }
        break;
      case 2:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                *((unsigned short *)(framebuffer + xhbp_yvbl)) &= *((unsigned short *)(blit_data + vhz));
              }
            }
          }
        }
        break;
      }
      break;
    case 4:
      switch (bytes_per_pixel) {
      case 4:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                unsigned int rgb = *((unsigned int *)(blit_data + vhz));
                if ((rgb & 0xFFFFFF00) != (bcolor & 0xFFFFFF00)) {
                  *((unsigned int *)(framebuffer + xhbp_yvbl)) = rgb;
                }
              }
            }
          }
        }
        break;
      case 3:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                if ((*((unsigned int *)(blit_data + vhz)) & 0xFFFFFF00) != (bcolor & 0xFFFFFF00)) {
                  *(framebuffer + xhbp_yvbl) = *(blit_data + vhz);
                  *(framebuffer + xhbp_yvbl + 1) = *(blit_data + vhz + 1);
                  *(framebuffer + xhbp_yvbl + 2) = *(blit_data + vhz + 2);
                }
              }
            }
          }
        }
        break;
      case 2:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                unsigned int rgb = *((unsigned short *)(blit_data + vhz));
                if (rgb != (bcolor & 0xFFFF)) {
                  *((unsigned short *)(framebuffer + xhbp_yvbl)) = rgb;
                }
              }
            }
          }
        }
        break;
      }
      break;
    case 5:
      switch (bytes_per_pixel) {
      case 4:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                if ((*((unsigned int *)(framebuffer + xhbp_yvbl)) & 0xFFFFFF00) == (bcolor & 0xFFFFFF00)) {
                  *((unsigned int *)(framebuffer + xhbp_yvbl)) = *((unsigned int *)(blit_data + vhz));
                }
              }
            }
          }
        }
        break;
      case 3:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                if (*((unsigned int *)(framebuffer + xhbp + yvhz)) == (bcolor & 0xFFFFFF00)) {
                  *(framebuffer + xhbp_yvbl) = *(blit_data + vhz);
                  *(framebuffer + xhbp_yvbl + 1) = *(blit_data + vhz + 1);
                  *(framebuffer + xhbp_yvbl + 2) = *(blit_data + vhz + 2);
                }
              }
            }
          }
        }
        break;
      case 2:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                if (*((unsigned short *)(framebuffer + xhbp + yvhz)) == (bcolor & 0xFFFF)) {
                  *((unsigned short *)(framebuffer + xhbp_yvbl)) = *((unsigned short *)(blit_data + vhz));
                }
              }
            }
          }
        }
        break;
      }
      break;
    case 6:
      switch (bytes_per_pixel) {
      case 4:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                unsigned int fb_rgb = *((unsigned int *)(framebuffer + xhbp_yvbl));
                unsigned char fb_r = fb_rgb & 255;
                unsigned char fb_g = (fb_rgb >> 8) & 255;
                unsigned char fb_b = (fb_rgb >> 16) & 255;
                unsigned int blit_rgb = *((unsigned int *)(blit_data + vhz));
                unsigned char R = blit_rgb & 255;
                unsigned char G = (blit_rgb >> 8) & 255;
                unsigned char B = (blit_rgb >> 16) & 255;
                unsigned char A = (blit_rgb >> 24) & 255;
                unsigned char invA = (255 - A);
                fb_r = ((R * A) + (fb_r * invA)) >> 8;
                fb_g = ((G * A) + (fb_g * invA)) >> 8;
                fb_b = ((B * A) + (fb_b * invA)) >> 8;
                *((unsigned int *)(framebuffer + xhbp_yvbl)) = fb_r | (fb_g << 8) | (fb_b << 16) | (A << 24);
              }
            }
          }
        }
        break;
      case 3:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                unsigned char fb_r = *(framebuffer + xhbp_yvbl);
                unsigned char fb_g = *(framebuffer + xhbp_yvbl + 1);
                unsigned char fb_b = *(framebuffer + xhbp_yvbl + 2);
                unsigned char R = *(blit_data + vhz);
                unsigned char G = *(blit_data + vhz + 1);
                unsigned char B = *(blit_data + vhz + 2);
                unsigned char invA = (255 - alpha);
                fb_r = ((R * alpha) + (fb_r * invA)) >> 8;
                fb_g = ((G * alpha) + (fb_g * invA)) >> 8;
                fb_b = ((B * alpha) + (fb_b * invA)) >> 8;
                *(framebuffer + xhbp_yvbl) = fb_r;
                *(framebuffer + xhbp_yvbl + 1) = fb_g;
                *(framebuffer + xhbp_yvbl + 2) = fb_b;
              }
            }
          }
        }
        break;
      case 2:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                unsigned short rgb565 = *((unsigned short *)(framebuffer + xhbp_yvbl));
                unsigned short fb_r = rgb565 & 31;
                unsigned short fb_g = (rgb565 >> 5) & 63;
                unsigned short fb_b = (rgb565 >> 11) & 31;
                rgb565 = *((unsigned short *)(blit_data + vhz));
                unsigned short R = rgb565 & 31;
                unsigned short G = (rgb565 >> 5) & 63;
                unsigned short B = (rgb565 >> 11) & 31;
                unsigned char invA = (255 - alpha);
                fb_r = ((R * alpha) + (fb_r * invA)) >> 8;
                fb_g = ((G * alpha) + (fb_g * invA)) >> 8;
                fb_b = ((B * alpha) + (fb_b * invA)) >> 8;
                *((unsigned short *)(framebuffer + xhbp_yvbl)) = (fb_b << 11) | (fb_g << 5) | fb_r;
              }
            }
          }
        }
        break;
      }
      break;
    case 7:
      switch (bytes_per_pixel) {
      case 4:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                *((unsigned int *)(framebuffer + xhbp_yvbl)) += *((unsigned int *)(blit_data + vhz));
              }
            }
          }
        }
        break;
      case 3:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                *(framebuffer + xhbp_yvbl) += *(blit_data + vhz);
                *(framebuffer + xhbp_yvbl + 1) += *(blit_data + vhz + 1);
                *(framebuffer + xhbp_yvbl + 2) += *(blit_data + vhz + 2);
              }
            }
          }
        }
        break;
      case 2:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                *((unsigned short *)(framebuffer + xhbp_yvbl)) += *((unsigned short *)(blit_data + vhz));
              }
            }
          }
        }
        break;
      }
      break;
    case 8:
      switch (bytes_per_pixel) {
      case 4:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                *((unsigned int *)(framebuffer + xhbp_yvbl)) -= *((unsigned int *)(blit_data + vhz));
              }
            }
          }
        }
        break;
      case 3:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                *(framebuffer + xhbp_yvbl) -= *(blit_data + vhz);
                *(framebuffer + xhbp_yvbl + 1) -= *(blit_data + vhz + 1);
                *(framebuffer + xhbp_yvbl + 2) -= *(blit_data + vhz + 2);
              }
            }
          }
        }
        break;
      case 2:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                *((unsigned short *)(framebuffer + xhbp_yvbl)) -= *((unsigned short *)(blit_data + vhz));
              }
            }
          }
        }
        break;
      }
      break;
    case 9:
      switch (bytes_per_pixel) {
      case 4:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                *((unsigned int *)(framebuffer + xhbp_yvbl)) *= *((unsigned int *)(blit_data + vhz));
              }
            }
          }
        }
        break;
      case 3:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                *(framebuffer + xhbp_yvbl) *= *(blit_data + vhz);
                *(framebuffer + xhbp_yvbl + 1) *= *(blit_data + vhz + 1);
                *(framebuffer + xhbp_yvbl + 2) *= *(blit_data + vhz + 2);
              }
            }
          }
        }
        break;
      case 2:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                *((unsigned short *)(framebuffer + xhbp_yvbl)) *= *((unsigned short *)(blit_data + vhz));
              }
            }
          }
        }
        break;
      }
      break;
    case 10:
      switch (bytes_per_pixel) {
      case 4:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                *((unsigned int *)(framebuffer + xhbp_yvbl)) /= *((unsigned int *)(blit_data + vhz));
              }
            }
          }
        }
        break;
      case 3:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                *(framebuffer + xhbp_yvbl) /= *(blit_data + vhz);
                *(framebuffer + xhbp_yvbl + 1) /= *(blit_data + vhz + 1);
                *(framebuffer + xhbp_yvbl + 2) /= *(blit_data + vhz + 2);
              }
            }
          }
        }
        break;
      case 2:
        for (vertical = 0; vertical < h; vertical++) {
          unsigned int vbl = vertical * bline;
          unsigned short yv = fb_y + vertical;
          unsigned int yvbl = yv * bytes_per_line;
          if (yv >= (yoffset + y_clip) && yv <= (yoffset + yy_clip)) {
            for (horizontal = 0; horizontal < w; horizontal++) {
              unsigned short xh = fb_x + horizontal;
              unsigned int xhbp = xh * bytes_per_pixel;
              if (xh >= (xoffset + x_clip) && xh <= (xoffset + xx_clip)) {
                unsigned int hzpixel = horizontal * bytes_per_pixel;
                unsigned int vhz = vbl + hzpixel;
                unsigned int yvhz = yvbl + hzpixel;
                unsigned int xhbp_yvbl = xhbp + yvbl;
                *((unsigned short *)(framebuffer + xhbp_yvbl)) /= *((unsigned short *)(blit_data + vhz));
              }
            }
          }
        }
        break;
      }
      break;
    }
  }
}
```