Sorry for the repeat thread name BUT the 'primes generator' thread is the theory (aka All Talk) thread and this one is (Hopefully) the practical Code and Optimizations thread.
Below is sourcecode that generates psuedo-Random 32bit and 16bit Prime numbers.
The IsPrimeNum function should be optimized further (If there were only an SSE2 opcode that performed integer modulus).
I BIT-Mapped all the primes from 0-65535(0xFFFF) so the Prime16 function is very fast because the IsPrimeNum function can check a 16bit number for primality in just a few instructions.
The random integer generator is just some old code I updated. The psuedo-random bit streams it creates should be extremely good.
format PE GUI 4.0
entry start
include '%fasminc%\win32a.inc'
section '.code' code readable executable
start:
call MakeSeed
.lp:
call Prime16
push eax
call Prime32
push eax
push fmt
push buffer
call [wsprintf]
add esp,12
push 4 ;yes/no yes continue / no end program
push buffer
push buffer
push 0
call [MessageBox]
sub eax,6
jnz .ending
jmp .lp
.ending:
push 0
call [ExitProcess]
Prime32:
push ebp
.again:
call Random32
mov ebp,eax
push eax
call IsPrimeNum
test eax,eax
jz .again
mov eax,ebp
pop ebp
ret 0
Prime16:
push ebp
.again:
call Random32
movzx ebp,ax
push ebp
call IsPrimeNum
test eax,eax
jz .again
mov eax,ebp
pop ebp
ret 0
Random32:
push ebp
push ebx
mov ebp,RandomSeed
mov eax,[ebp]
mov ebx,[ebp+4]
mov ecx,[ebp+8]
mov edx,[ebp+12]
shld ebx,eax,1
adc eax,0
ror eax,7
bswap eax
shld edx,ecx,1
adc ecx,0
rol ecx,5
mov [ebp],eax
mov [ebp+4],ebx
mov [ebp+8],ecx
mov [ebp+12],edx
xor eax,ecx
pop ebx
pop ebp
ret 0
SetSeed:
.seed equ esp+4 ;,+8,+12,+16
movdqu xmm0,[.seed]
movntdq dqword[RandomSeed],xmm0
ret 16
MakeSeed:
rdtsc
mov edx,eax
call [GetTickCount]
mov ecx,eax
mul edx
mov [RandomSeed],eax
xor edx,ecx
mov [RandomSeed+4],edx
bswap ecx
xor eax,ecx
mov [RandomSeed+8],eax
not edx
bswap edx
mul edx
mov [RandomSeed+12],eax
ret 0
IsPrimeNum: ;eax = 0 false, 1 true
.num equ esp+12
push ebp
push ebx
mov ebp,[.num]
mov edx,ebp
sub edx,2 ;if it's 2 its prime
jz .true
and edx,1 ;divisible by 2
jz .false
test ebp,0FFFF0000h
jnz .skip
mov ecx,ebp
mov edx,ecx
and ecx,111b ;bit offset
shr edx,3 ;byte offset
add ecx,1
movzx edx,byte[Primes9kb+edx]
xor eax,eax
shr edx,cl
adc eax,0
pop ebx
pop ebp
ret 4
.skip:
xor ebx,ebx
mov ecx,[PrimeList+ebx]
.testing:
xor edx,edx
mov eax,ebp
div ecx
test edx,edx
jz .false
add ebx,4
mov ecx,[PrimeList+ebx]
cmp ebx,4*192+4
jne .testing ;if no more primes to test then PROBABLY true
.true:
mov eax,1
pop ebx
pop ebp
ret 4
.false:
xor eax,eax
pop ebx
pop ebp
ret 4
section '.data' data readable writeable
fmt db '32Bit Prime: %lu 16Bit Prime: %lu',0
buffer rb 0ffh
align 16
RandomSeed dd 1318699, 1015727, 1235239, 412943
;first 192 primes
align 16 ;
PrimeList:
dd 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59
dd 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137
dd 39, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227
dd 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313
dd 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419
dd 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509
dd 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617
dd 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727
dd 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829
dd 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947
dd 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051
dd 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171
;etras needed to make sure numbers like 0xFFFFFFFD don't pass
dd 9241
align 16 ;true/false 1/0 primes from 0-65535 BIT masked (ie 2,3,5,7 = 172 = 10101100b)
Primes9kb: ; actually 8192 bytes
db 172, 40, 138, 160, 32, 138, 32, 40, 136, 130, 8, 2, 162, 40, 2, 128, 8
db 10, 160, 32, 136, 32, 40, 128, 162, 0, 8, 128, 40, 130, 2, 8, 130
db 160, 32, 10, 32, 0, 136, 34, 0, 8, 2, 40, 130, 128, 32, 136, 32
db 32, 2, 2, 40, 128, 130, 8, 2, 162, 8, 128, 128, 8, 136, 32, 0
db 10, 0, 32, 8, 32, 8, 10, 2, 8, 130, 130, 32, 10, 128, 0, 138
db 32, 40, 0, 34, 8, 8, 32, 32, 128, 128, 32, 136, 128, 32, 2, 34
db 0, 8, 32, 0, 10, 160, 40, 128, 0, 32, 138, 0, 32, 138, 0, 0
db 136, 128, 0, 2, 34, 8, 2, 128, 8, 130, 128, 32, 0, 34, 40, 128
db 130, 0, 10, 160, 32, 0, 128, 40, 130, 32, 32, 8, 2, 0, 128, 2
db 8, 8, 32, 8, 2, 2, 32, 130, 160, 32, 0, 2, 8, 0, 160, 8
db 10, 162, 8, 128, 130, 0, 0, 0, 0, 130, 32, 32, 0, 128, 0, 2
db 128, 40, 130, 128, 40, 8, 128, 0, 138, 34, 8, 128, 0, 8, 8, 128
db 32, 130, 128, 8, 136, 0, 32, 130, 34, 40, 8, 32, 0, 0, 130, 40
db 0, 0, 32, 10, 32, 0, 10, 32, 32, 8, 130, 0, 0, 130, 40, 0
db 2, 8, 128, 128, 0, 128, 0, 32, 136, 162, 0, 2, 32, 8, 2, 0
db 40, 0, 160, 0, 0, 32, 8, 8, 162, 8, 8, 2, 40, 128, 0, 32
db 128, 32, 0, 138, 2, 8, 128, 2, 0, 10, 162, 0, 2, 2, 0, 8
db 0, 0, 136, 32, 32, 0, 160, 8, 8, 0, 40, 2, 130, 32, 2, 160
db 0, 0, 32, 40, 136, 32, 0, 8, 162, 32, 130, 0, 8, 130, 0, 32
db 130, 0, 8, 8, 34, 0, 0, 128, 0, 0, 2, 8, 136, 160, 32, 0
db 0, 8, 128, 2, 0, 2, 34, 0, 2, 128, 0, 138, 128, 32, 136, 34
db 8, 136, 130, 0, 10, 32, 32, 2, 128, 0, 2, 160, 32, 10, 0, 8
db 0, 34, 8, 8, 34, 0, 128, 128, 0, 130, 32, 32, 128, 0, 8, 0
db 34, 8, 10, 0, 0, 128, 2, 8, 136, 0, 32, 2, 2, 32, 8, 128
db 8, 2, 0, 32, 128, 2, 0, 2, 0, 0, 136, 2, 32, 136, 0, 8
db 2, 34, 32, 0, 0, 40, 10, 128, 0, 0, 0, 40, 8, 130, 8, 10
db 128, 8, 128, 2, 40, 0, 160, 0, 128, 32, 0, 0, 2, 0, 2, 162
db 40, 0, 0, 8, 8, 128, 32, 128, 34, 40, 8, 160, 0, 8, 160, 0
db 2, 128, 32, 130, 128, 32, 8, 0, 8, 128, 34, 0, 8, 34, 32, 128
db 128, 32, 8, 0, 0, 130, 2, 8, 0, 34, 8, 0, 160, 0, 2, 128
db 40, 128, 0, 32, 2, 2, 0, 136, 160, 8, 10, 128, 8, 0, 128, 0
db 0, 32, 0, 138, 32, 40, 8, 0, 0, 10, 2, 0, 130, 0, 40, 8
db 128, 0, 128, 34, 8, 0, 162, 0, 0, 2, 0, 0, 2, 8, 10, 160
db 0, 10, 32, 40, 128, 2, 8, 2, 2, 0, 0, 128, 0, 10, 32, 32
db 8, 32, 0, 128, 32, 0, 2, 160, 0, 0, 130, 8, 130, 0, 0, 10
db 32, 0, 8, 162, 8, 0, 0, 40, 0, 130, 0, 128, 128, 32, 8, 0
db 32, 0, 160, 8, 10, 130, 0, 130, 0, 8, 128, 0, 0, 10, 34, 0
db 128, 128, 0, 0, 128, 40, 130, 2, 32, 2, 128, 0, 0, 0, 32, 128
db 32, 0, 2, 128, 32, 128, 0, 40, 130, 128, 32, 128, 34, 0, 8, 130
db 8, 10, 160, 0, 128, 0, 8, 8, 0, 32, 130, 0, 40, 8, 130, 0
db 0, 0, 8, 2, 128, 8, 8, 32, 32, 0, 2, 0, 136, 34, 0, 0
db 32, 0, 130, 2, 0, 130, 32, 0, 8, 32, 0, 136, 0, 0, 0, 32
db 8, 130, 128, 32, 10, 128, 32, 10, 2, 0, 128, 160, 8, 0, 160, 8
db 128, 130, 8, 0, 0, 32, 8, 34, 32, 128, 0, 0, 0, 128, 0, 128
db 130, 40, 10, 32, 0, 8, 34, 32, 128, 32, 0, 0, 162, 32, 0, 0
db 0, 136, 128, 0, 130, 32, 32, 8, 128, 8, 10, 34, 40, 128, 2, 0
db 130, 0, 0, 136, 0, 8, 0, 2, 0, 0, 32, 8, 0, 128, 8, 0
db 32, 32, 136, 32, 0, 8, 130, 0, 10, 32, 0, 2, 2, 40, 128, 128
db 0, 8, 32, 0, 0, 160, 8, 8, 34, 32, 0, 128, 0, 130, 160, 32
db 128, 0, 40, 128, 32, 8, 2, 130, 0, 130, 130, 32, 8, 32, 32, 0
db 0, 32, 8, 0, 0, 10, 0, 32, 2, 2, 8, 0, 0, 0, 2, 2
db 0, 136, 2, 8, 10, 34, 0, 128, 128, 0, 8, 0, 32, 0, 32, 40
db 0, 130, 0, 10, 160, 32, 128, 0, 32, 2, 0, 0, 10, 0, 40, 128
db 2, 8, 0, 128, 40, 2, 2, 0, 130, 160, 0, 8, 0, 8, 136, 32
db 0, 0, 0, 40, 128, 130, 8, 130, 128, 32, 2, 32, 8, 8, 128, 8
db 0, 2, 32, 128, 0, 0, 128, 32, 0, 130, 2, 0, 128, 128, 0, 0
db 2, 8, 2, 128, 40, 8, 32, 32, 136, 32, 0, 0, 0, 8, 0, 2
db 40, 0, 2, 40, 0, 160, 0, 0, 2, 0, 0, 2, 0, 8, 2, 0
db 2, 0, 8, 10, 0, 32, 130, 2, 8, 8, 32, 8, 2, 34, 40, 128
db 2, 32, 130, 160, 0, 136, 0, 32, 0, 128, 8, 2, 0, 32, 2, 130
db 8, 136, 0, 32, 136, 0, 32, 0, 162, 0, 0, 0, 32, 2, 0, 0
db 130, 32, 0, 2, 32, 0, 8, 162, 8, 0, 32, 8, 128, 128, 32, 2
db 160, 0, 8, 0, 0, 0, 2, 0, 10, 2, 0, 128, 0, 32, 8, 32
db 0, 130, 34, 32, 128, 32, 8, 0, 0, 8, 0, 130, 8, 8, 128, 0
db 0, 2, 40, 128, 34, 8, 0, 128, 32, 2, 128, 40, 2, 128, 32, 0
db 2, 0, 0, 2, 8, 2, 2, 40, 0, 0, 0, 136, 160, 0, 136, 0
db 32, 8, 0, 0, 0, 32, 0, 2, 130, 0, 138, 0, 0, 8, 32, 32
db 0, 160, 0, 2, 128, 40, 0, 130, 0, 128, 32, 32, 2, 34, 8, 8
db 130, 0, 8, 34, 8, 2, 2, 0, 136, 0, 0, 136, 0, 40, 128, 160
db 0, 2, 160, 8, 0, 128, 32, 0, 0, 0, 8, 34, 32, 128, 0, 8
db 10, 0, 0, 128, 130, 40, 0, 32, 0, 10, 2, 8, 8, 0, 0, 8
db 128, 32, 0, 128, 32, 2, 128, 32, 2, 32, 32, 8, 128, 8, 2, 32
db 8, 128, 2, 0, 2, 0, 32, 10, 32, 0, 128, 128, 8, 0, 162, 32
db 0, 0, 8, 2, 128, 32, 8, 32, 40, 128, 162, 0, 0, 160, 8, 130
db 0, 8, 2, 128, 0, 2, 32, 8, 136, 0, 0, 0, 0, 8, 0, 2
db 32, 136, 160, 0, 8, 2, 32, 0, 160, 0, 2, 2, 0, 128, 2, 32
db 136, 32, 0, 128, 2, 32, 136, 0, 8, 8, 2, 32, 130, 0, 8, 10
db 128, 0, 136, 0, 32, 8, 0, 8, 10, 32, 32, 0, 128, 32, 0, 0
db 0, 128, 2, 0, 0, 160, 0, 0, 32, 40, 128, 0, 40, 136, 128, 0
db 0, 32, 40, 128, 128, 8, 2, 34, 0, 2, 0, 8, 128, 0, 0, 136
db 32, 8, 136, 2, 0, 2, 160, 0, 2, 2, 40, 130, 0, 32, 0, 2
db 0, 128, 128, 0, 0, 0, 40, 2, 0, 32, 138, 0, 32, 128, 0, 40
db 0, 2, 0, 10, 0, 0, 128, 128, 0, 0, 32, 32, 130, 32, 0, 136
db 128, 0, 8, 130, 8, 0, 128, 8, 0, 160, 0, 8, 34, 8, 0, 2
db 0, 8, 32, 32, 128, 0, 0, 0, 128, 32, 128, 32, 40, 8, 0, 8
db 10, 128, 32, 0, 0, 0, 10, 32, 32, 0, 32, 8, 8, 2, 8, 0
db 0, 8, 0, 128, 0, 10, 160, 0, 136, 32, 0, 0, 162, 0, 8, 0
db 32, 128, 2, 40, 2, 0, 32, 0, 32, 0, 0, 128, 8, 8, 34, 0
db 130, 128, 0, 8, 128, 32, 2, 2, 0, 128, 2, 0, 2, 128, 0, 130
db 0, 8, 128, 0, 32, 136, 0, 0, 136, 0, 8, 10, 130, 0, 128, 128
db 0, 0, 160, 0, 0, 0, 8, 8, 34, 0, 0, 34, 0, 2, 0, 0
db 2, 0, 32, 2, 2, 40, 0, 160, 0, 8, 128, 0, 0, 0, 0, 138
db 32, 0, 130, 32, 32, 136, 130, 0, 0, 128, 8, 0, 128, 0, 130, 32
db 0, 136, 32, 40, 0, 130, 0, 10, 32, 8, 0, 128, 8, 0, 0, 32
db 10, 2, 0, 128, 2, 0, 0, 34, 40, 130, 0, 0, 128, 32, 32, 10
db 0, 0, 0, 32, 8, 8, 0, 8, 128, 2, 40, 128, 32, 32, 2, 2
db 32, 0, 0, 8, 2, 128, 8, 0, 0, 32, 10, 128, 0, 2, 34, 32
db 0, 34, 0, 8, 2, 0, 130, 128, 8, 130, 128, 32, 128, 0, 40, 8
db 2, 0, 2, 130, 32, 0, 2, 40, 8, 0, 32, 130, 32, 8, 128, 0
db 0, 2, 130, 0, 2, 2, 0, 136, 0, 32, 8, 0, 32, 128, 128, 0
db 2, 160, 32, 0, 2, 32, 0, 0, 0, 0, 34, 8, 136, 160, 8, 0
db 32, 0, 130, 128, 32, 136, 0, 0, 138, 2, 0, 0, 34, 8, 2, 128
db 0, 0, 0, 32, 136, 32, 0, 130, 0, 0, 136, 128, 8, 8, 130, 8
db 0, 0, 0, 10, 32, 0, 2, 2, 8, 8, 0, 0, 8, 2, 32, 2
db 128, 8, 10, 0, 0, 128, 0, 32, 0, 160, 0, 8, 34, 0, 0, 2
db 8, 130, 32, 32, 128, 0, 8, 0, 2, 8, 0, 2, 0, 2, 128, 0
db 2, 128, 32, 0, 32, 8, 8, 2, 0, 2, 0, 32, 128, 130, 40, 2
db 160, 0, 10, 2, 0, 128, 160, 8, 0, 32, 32, 128, 128, 0, 0, 160
db 0, 2, 0, 8, 0, 162, 8, 0, 160, 8, 2, 2, 40, 0, 0, 0
db 136, 0, 0, 0, 160, 0, 10, 0, 32, 2, 0, 8, 2, 128, 0, 138
db 0, 0, 8, 0, 0, 0, 128, 32, 130, 0, 32, 2, 0, 32, 128, 0
db 32, 0, 0, 8, 10, 0, 0, 0, 2, 32, 128, 0, 0, 138, 0, 32
db 8, 0, 0, 2, 0, 40, 0, 130, 8, 136, 128, 32, 128, 2, 32, 0
db 128, 0, 2, 128, 0, 128, 0, 32, 130, 160, 32, 10, 0, 0, 128, 2
db 0, 0, 32, 40, 130, 0, 32, 2, 32, 0, 8, 0, 8, 0, 34, 8
db 8, 34, 8, 130, 128, 8, 136, 0, 32, 0, 32, 32, 136, 0, 8, 8
db 0, 40, 128, 128, 8, 2, 0, 0, 8, 2, 8, 136, 32, 0, 2, 128
db 0, 0, 0, 32, 2, 128, 0, 0, 32, 32, 0, 34, 8, 8, 32, 8
db 0, 2, 8, 10, 32, 0, 2, 32, 0, 8, 130, 0, 0, 2, 8, 2
db 2, 0, 136, 160, 32, 128, 2, 8, 8, 130, 0, 10, 0, 32, 128, 2
db 32, 130, 128, 0, 2, 32, 0, 8, 128, 8, 8, 32, 8, 2, 0, 32
db 2, 128, 0, 128, 0, 32, 128, 128, 0, 2, 160, 0, 0, 130, 0, 8
db 32, 0, 138, 2, 32, 136, 128, 8, 0, 0, 0, 0, 128, 40, 10, 32
db 0, 130, 32, 0, 136, 32, 8, 2, 130, 0, 0, 0, 0, 8, 0, 32
db 130, 2, 32, 8, 130, 8, 0, 2, 0, 128, 0, 40, 0, 128, 0, 130
db 0, 0, 0, 2, 0, 0, 162, 40, 2, 128, 8, 130, 128, 0, 128, 0
db 40, 0, 0, 0, 0, 128, 40, 2, 0, 0, 130, 160, 0, 0, 34, 0
db 8, 2, 0, 0, 32, 0, 128, 0, 32, 8, 32, 0, 10, 2, 32, 0
db 0, 0, 8, 34, 8, 2, 128, 40, 0, 0, 32, 130, 32, 0, 0, 128
db 0, 2, 0, 8, 2, 130, 32, 0, 0, 0, 136, 0, 8, 128, 2, 0
db 10, 34, 0, 2, 0, 40, 136, 0, 0, 0, 2, 32, 8, 128, 8, 0
db 0, 8, 0, 0, 8, 128, 160, 0, 8, 0, 0, 128, 128, 8, 2, 160
db 0, 0, 130, 8, 130, 0, 0, 8, 0, 40, 8, 2, 0, 8, 32, 40
db 2, 130, 32, 0, 0, 32, 0, 32, 8, 8, 32, 8, 0, 2, 0, 128
db 128, 0, 128, 160, 0, 136, 2, 0, 128, 128, 0, 0, 2, 0, 0, 0
db 40, 8, 0, 32, 130, 32, 32, 128, 128, 0, 0, 130, 40, 2, 2, 0
db 10, 128, 0, 8, 2, 0, 136, 32, 8, 10, 2, 32, 128, 0, 0, 8
db 128, 0, 0, 34, 40, 0, 160, 0, 2, 128, 8, 0, 0, 0, 10, 32
db 0, 10, 0, 0, 8, 2, 0, 2, 2, 40, 0, 2, 0, 128, 160, 0
db 128, 0, 0, 8, 160, 0, 8, 128, 0, 0, 2, 8, 128, 160, 0, 10
db 2, 8, 0, 160, 0, 8, 34, 40, 0, 0, 32, 0, 0, 0, 138, 2
db 40, 0, 32, 0, 2, 2, 0, 128, 130, 40, 128, 32, 0, 0, 2, 32
db 128, 128, 0, 8, 130, 32, 2, 0, 40, 2, 32, 0, 128, 2, 32, 136
db 2, 0, 2, 32, 0, 2, 128, 8, 8, 0, 32, 2, 32, 0, 8, 130
db 8, 8, 34, 0, 0, 2, 32, 128, 0, 32, 10, 0, 40, 0, 2, 0
db 0, 128, 8, 2, 0, 0, 2, 0, 32, 0, 0, 32, 128, 128, 0, 8
db 32, 0, 130, 0, 8, 128, 32, 32, 0, 32, 0, 8, 34, 8, 0, 0
db 0, 128, 0, 0, 8, 32, 0, 0, 0, 8, 128, 162, 0, 0, 0, 8
db 128, 0, 32, 8, 0, 0, 2, 34, 0, 128, 32, 0, 8, 0, 32, 130
db 130, 0, 0, 0, 0, 2, 0, 40, 0, 32, 8, 0, 160, 0, 0, 128
db 40, 8, 128, 32, 0, 2, 8, 8, 2, 0, 2, 32, 32, 128, 0, 32
db 0, 0, 0, 0, 32, 40, 136, 0, 8, 0, 162, 40, 2, 130, 0, 130
db 160, 32, 8, 2, 32, 8, 0, 0, 8, 160, 0, 130, 0, 8, 130, 0
db 32, 8, 2, 0, 0, 0, 0, 0, 32, 0, 0, 130, 0, 10, 32, 32
db 128, 0, 8, 128, 130, 8, 0, 2, 0, 2, 2, 32, 8, 0, 0, 10
db 32, 32, 8, 0, 0, 10, 0, 0, 130, 128, 0, 2, 32, 0, 10, 32
db 8, 128, 34, 0, 8, 160, 32, 0, 128, 8, 128, 128, 0, 0, 2, 32
db 8, 34, 8, 2, 128, 40, 0, 2, 32, 130, 0, 0, 2, 0, 8, 128
db 2, 0, 2, 32, 32, 0, 128, 0, 2, 0, 0, 136, 32, 32, 8, 162
db 0, 2, 0, 32, 130, 128, 8, 0, 128, 0, 10, 0, 0, 0, 160, 8
db 0, 0, 40, 0, 2, 32, 128, 160, 0, 8, 0, 0, 0, 130, 0, 8
db 0, 8, 128, 2, 0, 128, 0, 0, 2, 32, 0, 8, 160, 0, 8, 128
db 40, 130, 0, 40, 0, 32, 0, 128, 2, 0, 0, 0, 0, 2, 2, 0
db 130, 128, 0, 138, 0, 0, 2, 2, 8, 8, 128, 8, 0, 160, 0, 0
db 2, 40, 138, 128, 0, 0, 0, 40, 8, 0, 0, 2, 32, 8, 0, 2
db 0, 136, 32, 32, 8, 2, 8, 136, 2, 0, 8, 32, 8, 0, 128, 0
db 0, 32, 32, 8, 0, 0, 0, 162, 8, 0, 32, 8, 0, 0, 0, 138
db 128, 32, 130, 0, 8, 0, 2, 0, 0, 0, 8, 0, 130, 40, 136, 0
db 32, 10, 2, 0, 0, 160, 8, 2, 2, 40, 128, 2, 40, 2, 0, 0
db 128, 2, 32, 0, 2, 8, 0, 32, 0, 2, 128, 0, 10, 128, 32, 128
db 32, 0, 8, 128, 8, 0, 34, 0, 128, 2, 8, 136, 128, 0, 2, 32
db 0, 128, 0, 0, 2, 130, 0, 0, 2, 0, 2, 128, 32, 8, 32, 0
db 136, 160, 0, 8, 128, 8, 130, 0, 40, 0, 160, 0, 8, 34, 0, 8
db 162, 0, 8, 0, 32, 2, 0, 0, 0, 32, 0, 128, 0, 8, 128, 162
db 8, 8, 128, 8, 0, 0, 0, 128, 32, 0, 128, 2, 32, 128, 32, 0
db 2, 0, 0, 2, 130, 32, 0, 32, 0, 10, 0, 32, 128, 0, 0, 8
db 160, 32, 0, 128, 40, 0, 0, 0, 0, 32, 40, 0, 160, 8, 8, 0
db 32, 128, 0, 8, 10, 32, 32, 130, 0, 40, 128, 0, 0, 2, 130, 8
db 0, 128, 8, 2, 0, 0, 0, 32, 40, 128, 32, 0, 0, 32, 8, 0
db 2, 0, 130, 0, 0, 10, 32, 0, 0, 2, 8, 8, 34, 40, 128, 2
db 32, 138, 128, 0, 130, 0, 8, 0, 32, 0, 8, 128, 0, 128, 128, 32
db 0, 32, 32, 10, 2, 0, 8, 0, 0, 8, 0, 32, 128, 0, 40, 2
db 128, 0, 130, 32, 8, 0, 32, 0, 10, 0, 0, 128, 0, 0, 2, 128
db 0, 128, 0, 8, 0, 2, 0, 0, 2, 32, 0, 0, 8, 10, 32, 32
db 138, 0, 32, 0, 130, 8, 2, 128, 40, 2, 0, 0, 128, 160, 32, 128
db 2, 0, 0, 128, 0, 0, 160, 8, 2, 130, 32, 0, 32, 0, 2, 32
db 8, 136, 2, 0, 0, 2, 32, 130, 128, 32, 8, 160, 32, 0, 2, 0
db 0, 32, 0, 8, 34, 0, 2, 130, 0, 136, 32, 0, 8, 2, 32, 128
db 32, 8, 8, 130, 40, 2, 2, 32, 2, 128, 0, 0, 2, 40, 0, 32
db 8, 0, 128, 32, 128, 128, 8, 0, 0, 0, 2, 0, 0, 0, 32, 0
db 2, 2, 0, 128, 0, 40, 8, 128, 0, 128, 32, 40, 0, 128, 8, 0
db 0, 32, 2, 2, 0, 8, 32, 32, 128, 32, 0, 136, 0, 0, 8, 0
db 0, 2, 0, 8, 128, 128, 0, 0, 0, 8, 128, 32, 8, 8, 2, 32
db 0, 0, 32, 0, 32, 0, 136, 0, 32, 0, 130, 0, 2, 32, 0, 0
db 130, 8, 8, 0, 32, 0, 2, 0, 8, 160, 8, 0, 128, 0, 2, 128
db 8, 10, 32, 0, 0, 32, 0, 128, 34, 0, 0, 2, 0, 2, 128, 0
db 2, 128, 32, 130, 0, 0, 8, 2, 8, 10, 128, 32, 0, 0, 0, 8
db 32, 32, 136, 32, 32, 0, 0, 0, 0, 160, 40, 0, 2, 0, 136, 32
db 32, 128, 32, 0, 128, 0, 0, 10, 128, 0, 128, 128, 32, 130, 160, 0
db 0, 0, 0, 0, 0, 8, 0, 34, 0, 0, 2, 0, 138, 32, 0, 10
db 2, 32, 0, 130, 8, 0, 2, 8, 130, 0, 32, 128, 0, 32, 0, 32
db 32, 8, 128, 8, 8, 0, 0, 130, 2, 0, 8, 0, 0, 130, 2, 0
db 8, 2, 0, 2, 128, 0, 130, 0, 40, 136, 128, 0, 0, 2, 32, 0
db 160, 8, 0, 34, 32, 0, 2, 32, 0, 0, 0, 8, 0, 8, 136, 130
db 0, 0, 32, 0, 2, 2, 8, 130, 32, 0, 8, 2, 0, 8, 32, 0
db 10, 160, 8, 0, 0, 32, 2, 32, 32, 2, 0, 8, 8, 32, 0, 8
db 0, 8, 130, 128, 0, 130, 128, 32, 0, 2, 8, 0, 128, 0, 2, 34
db 0, 2, 0, 0, 8, 0, 32, 2, 32, 0, 128, 32, 0, 0, 0, 8
db 2, 130, 0, 0, 32, 0, 138, 32, 40, 128, 34, 8, 10, 2, 0, 128
db 0, 0, 130, 0, 0, 2, 32, 32, 0, 130, 0, 2, 160, 0, 128, 2
db 40, 128, 0, 0, 130, 0, 0, 136, 130, 0, 0, 32, 8, 2, 0, 8
db 2, 128, 0, 8, 0, 40, 8, 34, 0, 8, 128, 40, 0, 128, 0, 128
db 0, 0, 0, 0, 8, 128, 32, 0, 8, 0, 0, 128, 2, 32, 8, 128
db 32, 10, 0, 8, 0, 0, 0, 2, 2, 0, 0, 130, 0, 0, 0, 32
db 128, 2, 0, 136, 32, 0, 2, 2, 0, 128, 130, 0, 0, 32, 0, 128
db 2, 40, 128, 0, 0, 0, 160, 0, 0, 0, 8, 2, 128, 0, 128, 32
db 0, 0, 2, 0, 10, 34, 0, 0, 0, 32, 138, 160, 0, 136, 32, 8
db 128, 130, 8, 2, 130, 8, 0, 128, 8, 0, 0, 0, 8, 32, 32, 0
db 160, 0, 0, 160, 8, 2, 130, 0, 128, 0, 32, 2, 0, 8, 136, 0
db 0, 8, 2, 32, 0, 130, 0, 10, 160, 0, 8, 0, 0, 128, 0, 8
db 0, 160, 0, 0, 2, 8, 8, 32, 0, 0, 0, 0, 0, 160, 8, 2
db 2, 40, 128, 0, 0, 0, 160, 0, 0, 0, 0, 8, 2, 8, 10, 0
db 32, 130, 128, 0, 128, 0, 32, 0, 32, 8, 0, 34, 0, 0, 34, 40
db 128, 0, 40, 8, 128, 32, 136, 0, 40, 136, 0, 8, 2, 162, 32, 0
db 128, 0, 130, 128, 0, 8, 2, 0, 128, 130, 0, 8, 0, 32, 2, 128
db 32, 2, 0, 32, 8, 0, 8, 136, 128, 0, 0, 32, 32, 0, 130, 32
db 0, 32, 0, 2, 0, 8, 0, 0, 0, 2, 162, 8, 2, 0, 0, 136
db 0, 32, 0, 0, 32, 0, 0, 8, 10, 2, 8, 2, 128, 32, 8, 128
db 0, 130, 2, 32, 128, 0, 8, 8, 0, 32, 0, 128, 0, 130, 128, 0
db 128, 32, 8, 8, 0, 8, 0, 128, 40, 128, 2, 8, 128, 32, 32, 8
db 32, 0, 0, 2, 8, 0, 32, 0, 0, 128, 8, 2, 0, 0, 128, 34
db 32, 8, 128, 0, 8, 0, 32, 2, 2, 0, 128, 160, 0, 8, 0, 0
db 0, 32, 8, 0, 32, 0, 130, 2, 0, 0, 32, 0, 8, 0, 8, 0
db 34, 0, 8, 128, 8, 130, 2, 0, 0, 0, 32, 130, 0, 0, 8, 128
db 0, 0, 128, 32, 0, 0, 40, 0, 32, 0, 128, 0, 8, 128, 0, 0
db 10, 130, 32, 130, 0, 32, 10, 0, 0, 2, 2, 32, 8, 32, 8, 8
db 128, 0, 0, 2, 32, 8, 160, 0, 0, 32, 0, 8, 130, 8, 0, 32
db 8, 0, 128, 0, 0, 160, 0, 8, 0, 0, 136, 0, 0, 2, 0, 40
db 0, 0, 40, 2, 32, 32, 0, 2, 8, 0, 162, 0, 0, 2, 0, 2
db 0, 0, 0, 128, 32, 8, 2, 32, 128, 32, 0, 2, 130, 8, 2, 128
db 0, 0, 0, 32, 8, 32, 32, 0, 0, 8, 2, 2, 32, 128, 2, 40
db 8, 160, 0, 2, 32, 0, 128, 0, 0, 8, 34, 32, 0, 0, 8, 130
db 0, 0, 0, 32, 8, 0, 130, 0, 8, 128, 32, 128, 2, 8, 0, 0
db 0, 10, 0, 8, 136, 130, 0, 0, 162, 32, 2, 0, 0, 136, 128, 32
db 128, 34, 8, 136, 32, 0, 0, 0, 8, 128, 130, 32, 2, 0, 32, 0
db 0, 8, 136, 34, 0, 0, 0, 0, 0, 0, 0, 0, 32, 32, 2, 2
db 0, 128, 34, 0, 8, 160, 8, 0, 128, 32, 128, 0, 0, 130, 0, 0
db 8, 0, 8, 2, 130, 8, 0, 128, 0, 8, 0, 0, 138, 2, 32, 128
db 0, 0, 10, 0, 0, 130, 0, 0, 2, 0, 0, 128, 2, 8, 0, 2
db 8, 8, 0, 8, 0, 0, 0, 0, 0, 32, 8, 32, 32, 128, 0, 8
db 2, 0, 40, 0, 0, 8, 138, 32, 32, 8, 2, 8, 0, 160, 0, 0
db 160, 0, 128, 0, 32, 128, 160, 0, 8, 32, 0, 0, 34, 0, 8, 34
db 0, 0, 0, 0, 138, 32, 0, 138, 0, 32, 0, 130, 8, 10, 34, 0
db 0, 2, 40, 128, 32, 0, 10, 0, 0, 8, 128, 0, 8, 130, 8, 0
db 0, 40, 2, 0, 0, 10, 34, 8, 8, 0, 8, 10, 32, 0, 2, 128
db 32, 0, 0, 0, 128, 32, 0, 8, 162, 0, 0, 0, 32, 0, 0, 8
db 136, 32, 32, 10, 0, 0, 128, 130, 8, 0, 0, 32, 0, 128, 0, 0
db 160, 32, 0, 32, 40, 0, 32, 0, 10, 128, 8, 130, 0, 32, 128, 32
db 32, 0, 34, 0, 128, 2, 8, 8, 0, 8, 130, 0, 0, 0, 160, 0
db 2, 0, 40, 128, 128, 8, 8, 128, 0, 0, 128, 0, 0, 0, 0, 128
db 2, 32, 128, 32, 0, 10, 128, 40, 130, 0, 0, 2, 128, 0, 8, 34
db 0, 8, 0, 0, 0, 34, 32, 128, 128, 32, 128, 0, 0, 2, 34, 0
db 8, 0, 8, 2, 34, 40, 128, 2, 32, 138, 32, 32, 130, 0, 0, 0
db 128, 0, 0, 128, 0, 2, 2, 0, 8, 160, 32, 128, 34, 0, 128, 32
db 0, 10, 0, 40, 0, 0, 8, 130, 128, 0, 0, 34, 0, 128, 0, 8
db 8, 34, 0, 0, 130, 0, 0, 0, 32, 0, 0, 8, 128, 130, 0, 0
db 34, 0, 0, 0, 0, 0, 0, 0, 136, 2, 32, 8, 160, 0, 8, 128
db 0, 0, 0, 40, 2, 128, 0, 0, 32, 40, 8, 2, 8, 0, 162, 0
db 130, 128, 0, 2, 128, 0, 130, 2, 32, 0, 0, 8, 0, 32, 32, 128
db 0, 0, 2, 160, 0, 136, 0, 40, 128, 130, 0, 0, 130, 32, 0, 0
db 0, 128, 160, 0, 136, 32, 0, 128, 0, 0, 10, 0, 8, 130, 128, 32
db 128, 0, 0, 2, 2, 8, 8, 160, 8, 0, 32, 0, 0, 128, 0, 8
db 0, 0, 138, 2, 0, 128, 32, 8, 0, 2, 0, 130, 0, 0, 8, 32
db 0, 10, 0, 32, 0, 0, 0, 0, 128, 8, 0, 0, 40, 8, 32, 0
db 10, 2, 8, 136, 32, 0, 2, 32, 32, 130, 0, 8, 0, 0, 0, 2
db 0, 32, 8, 0, 0, 8, 2, 8, 128, 2, 8, 0, 128, 32, 136, 0
db 8, 0, 2, 8, 0, 32, 0, 2, 130, 0, 136, 0, 32, 128, 2, 32
db 0, 0, 0, 8, 0, 40, 0, 130, 40, 130, 0, 0, 0, 34, 0, 128
db 34, 8, 0, 2, 0, 0, 0, 0, 0, 128, 32, 0, 0, 0, 0, 0
db 0, 10, 0, 8, 130, 0, 8, 0, 0, 32, 10, 2, 0, 128, 160, 0
db 8, 128, 32, 128, 0, 0, 10, 128, 0, 8, 32, 0, 128, 0, 8, 2
db 130, 0, 130, 128, 40, 2, 0, 32, 0, 0, 32, 8, 2, 8, 0, 2
db 40, 0, 0, 8, 2, 128, 0, 2, 0, 0, 136, 0, 0, 2, 2, 32
db 0, 2, 8, 128, 32, 32, 0, 32, 8, 8, 130, 0, 0, 160, 0, 2
db 0, 32, 128, 32, 0, 0, 0, 0, 0, 2, 0, 8, 2, 40, 130, 0
db 32, 2, 0, 0, 136, 2, 32, 128, 128, 8, 8, 128, 8, 128, 128, 0
db 0, 32, 32, 8, 32, 0, 128, 32, 8, 8, 2, 32, 2, 2, 0, 8
db 32, 0, 130, 0, 40, 136, 2, 0, 2, 32, 0, 2, 128, 0, 2, 128
db 32, 128, 0, 40, 0, 130, 8, 10, 128, 8, 0, 0, 32, 8, 0, 32
db 8, 32, 40, 0, 128, 0, 2, 34, 0, 0, 128, 0, 2, 0, 32, 8
db 0, 8, 0, 128, 0, 8, 32, 32, 128, 2, 0, 130, 0, 0, 8, 32
db 0, 0, 34, 0, 0, 0, 40, 2, 2, 0, 10, 0, 32, 10, 2, 8
db 0, 32, 0, 2, 128, 0, 0, 130, 0, 128, 0, 0, 8, 34, 32, 136
db 32, 0, 2, 2, 40, 0, 130, 40, 8, 160, 0, 128, 0, 8, 0, 2
db 8, 2, 130, 0, 0, 0, 40, 8, 0, 32, 0, 0, 0, 8, 0, 0
db 0, 160, 0, 128, 0, 40, 0, 128, 0, 128, 32, 32, 128, 128, 0, 2
db 2, 8, 0, 0, 0, 0, 128, 32, 136, 0, 0, 136, 34, 0, 8, 0
db 0, 128, 128, 32, 0, 32, 0, 8, 0, 0, 0, 130, 0, 0, 0, 32
db 2, 128, 0, 130, 32, 32, 2, 0, 8, 128, 160, 0, 0, 32, 0, 2
db 130, 0, 136, 0, 32, 130, 34, 0, 128, 0, 0, 8, 2, 0, 2, 0
db 0, 0, 128, 0, 128, 34, 40, 0, 0, 0, 0, 32, 0, 0, 0, 0
db 128, 0, 32, 130, 2, 0, 0, 2, 8, 10, 0, 32, 128, 0, 40, 0
db 160, 32, 0, 32, 8, 136, 2, 8, 2, 2, 40, 0, 128, 0, 128, 128
db 0, 8, 0, 32, 0, 130, 0, 8, 32, 8, 2, 0, 8, 128, 0, 32
db 10, 32, 0, 0, 130, 0, 8, 2, 0, 2, 0, 0, 136, 0, 0, 138
db 0, 0, 0, 128, 0, 2, 130, 8, 130, 0, 32, 8, 0, 32, 10, 0
db 32, 128, 128, 0, 2, 2, 40, 130, 2, 8, 0, 0, 0, 0, 32, 32
db 0, 34, 8, 0, 160, 0, 128, 128, 40, 128, 0, 32, 0, 2, 8, 0
db 128, 8, 8, 32, 0, 0, 0, 0, 136, 160, 0, 2, 0, 32, 128, 0
db 8, 2, 32, 0, 0, 128, 0, 136, 128, 0, 0, 0, 8, 136, 128, 0
db 0, 128, 32, 128, 128, 32, 0, 32, 0, 2, 2, 8, 128, 128, 0, 0
db 32, 40, 128, 130, 0, 130, 32, 32, 136, 0, 32, 0, 0, 0, 2, 2
db 0, 2, 0, 8, 136, 32, 0, 0, 34, 0, 128, 160, 0, 0, 128, 0
db 0, 128, 32, 8, 128, 0, 136, 2, 0, 128, 2, 8, 2, 2, 32, 2
db 0, 32, 0, 128, 32, 2, 32, 0, 0, 32, 8, 2, 0, 0, 0, 0
db 0, 128, 128, 32, 2, 0, 0, 8, 0, 0, 0, 128, 40, 2, 0, 0
db 8, 128, 0, 136, 32, 8, 8, 128, 0, 10, 128, 0, 128, 0, 0, 130
db 128, 32, 0, 2, 0, 8, 160, 0, 0, 0, 0, 0, 0, 32, 10, 32
db 0, 0, 0, 8, 128, 128, 8, 8, 0, 8, 0, 2, 32, 136, 32, 0
db 130, 34, 0, 8, 128, 8, 0, 130, 0, 0, 128, 32, 8, 32, 0, 2
db 32, 0, 0, 2, 0, 8, 130, 0, 128, 128, 8, 2, 0, 32, 2, 0
db 0, 0, 34, 0, 8, 160, 32, 0, 2, 0, 138, 32, 0, 10, 32, 32
db 136, 2, 8, 0, 130, 32, 0, 2, 0, 8, 0, 0, 0, 32, 32, 128
db 32, 0, 0, 32, 40, 128, 0, 40, 0, 0, 0, 8, 32, 0, 8, 128
db 0, 8, 0, 8, 130, 2, 0, 136, 32, 0, 0, 0, 8, 0, 34, 8
db 10, 34, 8, 0, 130, 8, 8, 32, 0, 130, 0, 0, 0, 128, 0, 2
db 2, 0, 128, 2, 8, 2, 0, 0, 2, 34, 0, 0, 0, 8, 10, 128
db 0, 128, 128, 32, 130, 128, 0, 128, 0, 32, 8, 162, 0, 2, 160, 0
db 128, 0, 32, 138, 0, 0, 8, 0, 32, 128, 2, 8, 2, 32, 0, 0
db 0, 8, 8, 0, 32, 0, 2, 40, 8, 34, 0, 2, 160, 8, 128, 0
db 0, 2, 0, 0, 10, 32, 8, 8, 0, 8, 8, 2, 32, 128, 0, 32
db 8, 128, 32, 136, 2, 0, 0, 34, 8, 8, 162, 8, 2, 128, 8, 8
db 32, 0, 0, 32, 0, 0, 32, 0, 10, 2, 32, 0, 0, 8, 0, 0
db 0, 10, 2, 0, 8, 32, 8, 2, 162, 32, 128, 128, 0, 130, 128, 0
db 128, 32, 0, 8, 34, 0, 0, 32, 32, 128, 2, 32, 136, 0, 0, 0
db 0, 40, 0, 0, 8, 2, 130, 0, 2, 130, 0, 8, 32, 0, 8, 32
db 8, 0, 32, 0, 10, 128, 8, 0, 0, 32, 128, 0, 32, 0, 32, 0
db 128, 128, 0, 0, 2, 32, 0, 130, 0, 128, 0, 32, 0, 0, 32, 128
db 0, 8, 8, 0, 0, 130, 2, 8, 0, 0, 0, 0, 0, 0, 128, 160
db 8, 8, 0, 8, 0, 2, 8, 2, 0, 0, 130, 0, 8, 0, 32, 0
db 0, 160, 0, 0, 0, 32, 10, 128, 32, 128, 34, 0, 8, 2, 0, 10
db 32, 32, 0, 0, 8, 0, 128, 32, 2, 0, 0, 0, 130, 0, 0, 162
db 40, 2, 2, 0, 0, 0, 0, 0, 32, 0, 8, 0, 0, 10, 0, 0
db 2, 0, 32, 128, 128, 0, 10, 34, 0, 136, 32, 0, 0, 34, 40, 0
db 2, 32, 8, 128, 0, 128, 2, 32, 128, 128, 8, 10, 0, 0, 128, 0
db 8, 8, 32, 0, 138, 0, 32, 0, 0, 0, 2, 130, 40, 130, 2, 32
db 0, 0, 0, 0, 0, 0, 128, 32, 0, 8, 160, 32, 0, 0, 0, 2
db 0, 0, 0, 34, 0, 0, 0, 8, 8, 34, 8, 128, 0, 40, 130, 32
db 0, 8, 0, 8, 8, 0, 0, 0, 162, 0, 2, 130, 8, 2, 0, 0
db 136, 0, 40, 128, 0, 0, 2, 32, 0, 2, 0, 40, 2, 32, 32, 0
db 2, 8, 0, 128, 8, 8, 0, 8, 128, 128, 32, 0, 32, 32, 128, 0
db 8, 0, 130, 8, 8, 128, 8, 0, 128, 32, 0, 0, 0, 0, 32, 32
db 0, 32, 8, 0, 0, 0, 128, 130, 8, 10, 0, 0, 2, 0, 40, 128
db 32, 0, 0, 0, 0, 2, 128, 0, 136, 0, 0, 2, 34, 0, 8, 160
db 0, 2, 162, 0, 0, 2, 0, 2, 32, 0, 8, 32, 0, 8, 130, 0
db 0, 0, 0, 0, 2, 8, 130, 0, 0, 8, 32, 32, 0, 34, 0, 2
db 0, 40, 128, 0, 32, 0, 128, 0, 2, 0, 8, 8, 34, 0, 8, 2
db 8, 0, 0, 0, 2, 128, 32, 136, 0, 8, 0, 0, 0, 0, 162, 8
db 2, 2, 32, 128, 32, 0, 128, 32, 0, 0, 0, 0, 0, 128, 32, 130
db 0, 8, 8, 32, 0, 0, 0, 32, 8, 0, 0, 10, 32, 0, 2, 0
db 40, 136, 0, 0, 0, 32, 32, 8, 2, 0, 8, 160, 8, 128, 0, 0
db 8, 32, 32, 0, 0, 32, 128, 130, 0, 0, 32, 40, 0, 128, 0, 2
db 160, 0, 0, 0, 32, 0, 128, 0, 8, 0, 0, 128, 130, 8, 2, 128
db 32, 0, 2, 8, 136, 0, 8, 0, 0, 32, 128, 128, 32, 0, 160, 0
db 2, 0, 8, 0, 130, 8, 2, 128, 0, 128, 130, 8, 128, 0, 0, 136
db 0, 0, 136, 32, 0, 10, 0, 0, 0, 128, 8, 10, 160, 0, 0, 32
db 32, 8, 32, 0, 2, 32, 0, 128, 0, 32, 0, 0, 32, 0, 0, 0
db 0, 34, 0, 0, 2, 0, 0, 2, 8, 10, 0, 0, 128, 32, 0, 128
db 128, 8, 2, 130, 40, 0, 2, 0, 0, 32, 0, 128, 0, 32, 0, 32
db 0, 8, 0, 32, 128, 128, 32, 130, 32, 32, 0, 0, 8, 128, 2, 8
db 0, 32, 40, 0, 128, 0, 10, 128, 0, 2, 0, 8, 0, 0, 0, 8
db 34, 8, 2, 130, 32, 128, 0, 0, 8, 2, 32, 128, 128, 0, 2, 128
db 32, 128, 0, 32, 10, 0, 0, 2, 0, 40, 128, 34, 0, 0, 162, 0
db 0, 0, 0, 10, 128, 32, 128, 2, 8, 0, 32, 8, 0, 2, 32, 0
db 2, 0, 128, 128, 32, 0, 32, 8, 136, 0, 8, 2, 34, 0, 0, 0
db 0, 130, 32, 0, 0, 2, 0, 0, 130, 0, 8, 0, 32, 128, 2, 8
db 0, 0, 32, 8, 0, 8, 8, 34, 0, 0, 32, 0, 128, 128, 0, 8
db 128, 0, 2, 0, 8, 128, 2, 0, 0, 34, 0, 2, 0, 8, 128, 0
db 32, 128, 34, 0, 0, 32, 0, 2, 128, 0, 130, 130, 8, 2, 0, 0
db 136, 32, 40, 0, 0, 8, 8, 0, 32, 2, 0, 8, 136, 0, 0, 128
db 2, 32, 0, 162, 0, 0, 0, 0, 0, 0, 40, 0, 128, 32, 130, 0
db 40, 8, 128, 0, 2, 162, 0, 0, 128, 0, 10, 160, 0, 8, 2, 0
db 8, 0, 0, 0, 0, 8, 2, 0, 32, 0, 160, 0, 8, 2, 8, 128
db 34, 8, 0, 2, 32, 0, 2, 0, 128, 32, 32, 10, 0, 8, 0, 32
db 0, 10, 2, 0, 130, 130, 8, 128, 0, 0, 0, 32, 32, 0, 160, 0
db 0, 2, 8, 0, 0, 40, 8, 0, 0, 136, 2, 0, 128, 2, 0, 10
db 2, 32, 2, 0, 8, 136, 0, 32, 2, 0, 8, 0, 0, 8, 10, 2
db 40, 128, 0, 0, 0, 0, 32, 8, 32, 0, 8, 130, 0, 0, 128, 40
db 0, 2, 0, 2, 128, 0, 128, 0, 40, 8, 32, 0, 0, 128, 40, 0
db 130, 8, 128, 128, 0, 8, 32, 0, 128, 32, 0, 8, 0, 0, 128, 130
db 0, 138, 0, 32, 0, 0, 0, 128, 130, 0, 0, 160, 0, 2, 128, 40
db 0, 32, 32, 128, 32, 32, 128, 128, 8, 10, 0, 8, 130, 0, 0, 2
db 0, 0, 128, 0, 32, 136, 0, 0, 0, 160, 0, 2, 128, 8, 0, 128
db 0, 2, 34, 32, 0, 128, 8, 0, 130, 8, 0, 0, 8, 130, 0, 0
db 2, 0, 40, 0, 0, 0, 0, 130, 0, 2, 128, 0, 136, 160, 0, 0
db 0, 32, 136, 130, 0, 0, 0, 8, 0, 128, 8, 0, 128, 0, 8, 0
db 0, 8, 0, 8, 0, 32, 0, 2, 128, 32, 2, 32, 0, 0, 0, 32
db 0, 130, 0, 2, 2, 8, 2, 0, 40, 0, 32, 0, 8, 2, 0, 128
db 32, 0, 10, 0, 32, 2, 2, 0, 0, 128, 0, 136, 0, 40, 128, 0
db 0, 0, 0, 32, 0, 0, 40, 2, 128, 32, 0, 2, 0, 0, 162, 8
db 0, 2, 32, 128, 2, 0, 130, 0, 0, 136, 0, 0, 8, 0, 0, 2
db 160, 40, 0, 2, 0, 128, 0, 0, 128, 32, 40, 136, 160, 0, 2, 32
db 0, 130, 130, 0, 128, 128, 32, 2, 0, 8, 128, 0, 8, 0, 34, 0
db 130, 128, 32, 0, 128, 32, 128, 0, 8, 0, 130, 8, 8, 0, 0, 130
db 2, 0, 0, 32, 0, 128, 2, 0, 8, 32, 8, 0, 2, 40, 128, 0
db 32, 8, 160, 0, 0, 32, 8, 8, 2, 0, 2, 32, 32, 0, 0, 40
db 2, 128, 0, 0, 2, 32, 8, 0, 0, 8, 2, 40, 0, 2, 0, 128
db 0, 0, 130, 0, 0, 8, 2, 8, 0, 162, 32, 0, 2, 0, 128, 0
db 32, 0, 34, 8, 8, 0, 0, 10, 32, 0, 2, 2, 0, 0, 0, 0
db 10, 2, 8, 136, 0, 0, 0, 0, 0, 2, 0, 32, 2, 0, 0, 0
db 2, 32, 128, 32, 0, 2, 160, 0, 2, 130, 8, 136, 0, 0, 0, 2
db 0, 136, 128, 0, 0, 0, 8, 2, 0, 8, 2, 160, 0, 130, 32, 0
db 8, 32, 0, 2, 128, 0, 0, 128, 32, 2, 0, 32, 0, 0, 40, 0
db 128, 8, 2, 160, 0, 128, 0, 0, 2, 128, 32, 136, 32, 32, 0, 128
db 8, 0, 2, 0, 0, 128, 8, 0, 32, 32, 128, 34, 32, 0, 34, 0
db 2, 0, 40, 0, 2, 40, 0, 32, 32, 2, 0, 0, 128, 130, 0, 0
db 0, 40, 128, 2, 0, 8, 32, 0, 136, 0, 0, 0, 130, 0, 0, 34
db 0, 0, 130, 8, 8, 0, 32, 2, 32, 0, 0, 128, 0, 0, 128, 8
db 0, 128, 0, 0, 160, 0, 0, 2, 0, 128, 34, 0, 10, 130, 32, 130
db 0, 32, 2, 0, 0, 2, 32, 8, 0, 160, 0, 8, 0, 0, 128, 0
db 32, 130, 128, 0, 0, 32, 8, 128, 0, 0, 2, 34, 0, 0, 130, 8
db 10, 0, 32, 136, 0, 8, 128, 128, 0, 0, 0, 8, 2, 2, 40, 0
db 0, 32, 0, 2, 8, 0, 0, 8, 8, 32, 0, 0, 2, 32, 8, 128
db 0, 136, 0, 32, 0, 2, 0, 0, 2, 0, 0, 0, 8, 0, 32, 32
db 128, 32, 0, 128, 128, 8, 8, 0, 8, 0, 130, 8, 2, 0, 0, 10
db 34, 40, 0, 32, 8, 2, 0, 32, 0, 0, 32, 138, 0, 32, 2, 0
db 40, 8, 128, 8, 0, 162, 0, 0, 2, 0, 130, 160, 0, 128, 0, 0
db 8, 130, 0, 0, 0, 32, 2, 130, 0, 0, 128, 0, 128, 32, 8, 8
db 128, 0, 0, 0, 32, 2, 0, 8, 0, 32, 32, 2, 0, 0, 8, 160
db 0, 0, 32, 32, 128, 0, 32, 136, 0, 0, 2, 2, 32, 0, 0, 0
db 10, 34, 0, 130, 0, 0, 128, 32, 32, 128, 0, 0, 8, 0, 8, 8
db 0, 0, 0, 130, 32, 10, 32, 0, 8, 2, 8, 0, 0, 0, 8, 0
db 0, 2, 0, 40, 138, 128, 0, 0, 32, 32, 0, 128, 0, 8, 0, 0
db 128, 2, 0, 2, 32, 0, 128, 0, 32, 128, 0, 0, 2, 32, 8, 0
db 0, 0, 8, 32, 0, 8, 2, 40, 128, 130, 0, 0, 160, 8, 2, 2
db 8, 2, 128, 32, 2, 32, 0, 0, 0, 8, 0, 0, 8, 130, 128, 32
db 138, 32, 32, 8, 2, 0, 128, 0, 0, 2, 162, 0, 0, 130, 40, 0
db 32, 0, 128, 0, 0, 8, 32, 8, 2, 0, 0, 128, 2, 32, 0, 0
db 0, 130, 32, 40, 0, 2, 8, 8, 0, 32, 0, 128, 8, 8, 0, 32
db 128, 2, 0, 0, 160, 0, 2, 128, 40, 0, 0, 0, 8, 128, 0, 0
db 32, 0, 0, 128, 0, 2, 130, 0, 2, 2, 0, 2, 128, 32, 8, 32
db 0, 8, 162, 0, 2, 160, 32, 128, 128, 40, 128, 0, 0, 0, 2, 0
db 128, 160, 0, 8, 0, 32, 2, 0, 0, 136, 128, 0, 130, 0, 32, 128
db 2, 0, 8, 2, 8, 0, 128, 32, 136, 0, 0, 128, 34, 32, 8, 0
db 8, 0, 2, 0, 2, 0, 40, 2, 160, 0, 10, 2, 32, 128, 32, 8
db 0, 128, 32, 130, 0, 0, 0, 0, 32, 130, 0, 8, 0, 34, 0, 2
db 2, 8, 128, 0, 8, 136, 32, 0, 8, 32, 8, 128, 2, 8, 0, 160
db 0, 0, 2, 8, 8, 160, 0, 136, 0, 32, 0, 0, 0, 10, 0, 40
db 0, 128, 32, 128, 32, 32, 0, 32, 0, 8, 0, 0, 0, 2, 8, 0
db 128, 32, 128, 0, 0, 128, 2, 0, 0, 160, 0, 8, 0, 8, 2, 2
db 0, 0, 0, 32, 2, 34, 0, 8, 128, 0, 2, 2, 32, 130, 128, 8
db 2, 128, 0, 0, 32, 32, 136, 2, 8, 2, 0, 32, 128, 128, 32, 8
db 0, 0, 2, 0, 40, 0, 32, 8, 0, 128, 8, 0, 0, 32, 2, 128
db 0, 0, 32, 0, 136, 0, 8, 2, 34, 8, 2, 0, 0, 8, 160, 0
db 0, 2, 0, 136, 2, 0, 10, 0, 32, 130, 128, 8, 2, 160, 32, 8
db 0, 0, 128, 0, 0, 0, 0, 32, 2, 2, 0, 2, 0, 0, 136, 2
db 8, 128, 2, 8, 8, 2, 8, 128, 2, 40, 0, 0, 32, 2, 0, 0
db 128, 0, 0, 0, 130, 32, 0, 128, 32, 8, 0, 0, 10, 32, 0, 128
db 0, 0, 0, 34, 0, 128, 128, 32, 8, 128, 0, 128, 32, 32, 0, 32
db 8, 8, 0, 40, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0
db 2, 34, 40, 2, 2, 0, 130, 0, 0, 136, 0, 8, 128, 32, 0, 10
db 160, 32, 0, 0, 40, 128, 32, 32, 8, 32, 0, 8, 130, 8, 0, 32
db 32, 128, 128, 0, 128, 0, 32, 128, 2, 40, 0, 130, 8, 0, 128, 0
db 2, 2, 0, 0, 0, 0, 0, 32, 32, 128, 160, 0, 2, 2, 8, 130
db 128, 0, 10, 0, 0, 138, 32, 0, 136, 2, 0, 0, 2, 32, 2, 0
db 0, 8, 0, 32, 130, 0, 32, 0, 0, 0, 8, 34, 40, 0, 0, 8
db 136, 160, 0, 0, 32, 8, 8, 0, 8, 2, 128, 8, 2, 0, 8, 8
db 128, 32, 0, 2, 0, 0, 2, 0, 0, 128, 0, 128, 128, 0, 0, 0
db 0, 2, 2, 0, 128, 32, 0, 8, 32, 0, 128, 0, 32, 2, 32, 32
db 2, 0, 0, 0, 32, 8, 10, 160, 8, 0, 128, 32, 8, 32, 0, 130
db 2, 0, 0, 0, 0, 2, 130, 0, 0, 0, 8, 10, 128, 0, 0, 34
db 0, 0, 32, 0, 8, 130, 0, 2, 0, 32, 128, 0, 32, 0, 32, 0
db 8, 0, 8, 2, 2, 0, 0, 0, 32, 2, 32, 0, 130, 0, 8, 0
db 0, 0, 0, 0, 32, 0, 130, 8, 130, 128, 32, 128, 2, 40, 0, 128
db 0, 2, 128, 0, 128, 128, 32, 2, 0, 32, 10, 32, 8, 0, 2, 0
db 8, 32, 0, 0, 0, 0, 8, 32, 0, 128, 2, 40, 0, 162, 8, 0
db 130, 0, 2, 2, 0, 0, 0, 0, 130, 0, 0, 136, 0, 8, 8, 2
db 0, 0, 0, 8, 8, 0, 0, 2, 2, 32, 128, 2, 0, 2, 0, 0
db 0, 0, 8, 128, 128, 0, 0, 32, 32, 0, 0, 8, 8, 2, 0, 0
db 0, 40, 136, 0, 32, 8, 0, 40, 0, 0, 8, 2, 2, 0, 0, 2
db 0, 128, 160, 0, 136, 32, 0, 136, 128, 0, 0, 128, 8, 130, 2, 0
db 128, 0, 0, 8, 34, 0, 136, 32, 8, 8, 2, 8, 2, 130, 0, 128
db 0, 32, 8, 2, 0, 128, 32, 0, 0, 32, 0, 0, 0, 32, 8, 0
db 32, 8, 0, 32, 128, 128, 0, 0, 0, 32, 0, 128, 32, 0, 32, 0
db 130, 0, 40, 136, 0, 8, 8, 2, 0, 128, 128, 32, 2, 128, 0, 2
db 0, 8, 0, 128, 0, 10, 162, 0, 0, 0, 8, 0, 160, 0, 130, 32
db 8, 0, 2, 0, 0, 0, 0, 2, 0, 0, 138, 128, 0, 136, 0, 0
db 136, 0, 0, 0, 128, 0, 0, 2, 0, 130, 0, 0, 0, 0, 8, 8
db 34, 8, 0, 34, 8, 0, 0, 32, 8, 32, 0, 8, 0, 32, 128, 32
db 8, 0, 2, 8, 130, 0, 32, 8, 0, 0, 136, 0, 32, 0, 0, 8
db 8, 128, 0, 2, 2, 32, 0, 128, 0, 2, 0, 8, 8, 0, 0, 8
db 32, 32, 2, 0, 0, 130, 0, 0, 130, 2, 8, 0, 0, 0, 10, 160
db 40, 0, 0, 0, 0, 160, 0, 0, 0, 8, 8, 130, 0, 0, 130, 0
db 2, 128, 8, 0, 32, 0, 0, 0, 8, 0, 160, 0, 8, 0, 0, 0
db 130, 0, 0, 0, 32, 2, 0, 8, 128, 34, 0, 8, 2, 8, 2, 130
db 0, 2, 160, 32, 0, 2, 40, 0, 128, 8, 0, 128, 8, 2, 128, 32
db 8, 0, 0, 130, 32, 32, 0, 128, 0, 0, 2, 40, 128, 130, 8, 2
db 32, 0, 128, 2, 8, 136, 0, 0, 10, 130, 32, 128, 128, 0, 130, 0
db 0, 2, 32, 32, 0, 130, 8, 2, 128, 0, 128, 2, 32, 130, 0, 0
db 0, 0, 32, 8, 2, 0, 2, 0, 32, 0, 0, 0, 2, 0, 32, 128
db 32, 8, 0, 34, 0, 0, 128, 8, 0, 2, 8, 0, 32, 0, 8, 0
db 0, 128, 34, 0, 8, 0, 40, 0, 0, 0, 130, 128, 32, 0, 0, 0
db 128, 128, 8, 0, 160, 0, 128, 128, 32, 0, 0, 0, 0, 32, 32, 0
db 128, 8, 0, 0, 0, 130, 0, 40, 0, 0, 0, 8, 2, 8, 0, 2
db 0, 0, 0, 0, 2, 128, 0, 10, 128, 0, 2, 34, 32, 8, 2, 0
db 0, 160, 8, 128, 0, 32, 0, 32, 32, 0, 0, 0, 8, 0, 8, 0
db 160, 0, 2, 0, 8, 2, 0, 0, 0, 34, 0, 128, 160, 0, 8, 32
db 0, 128, 130, 0, 2, 128, 0, 0, 2, 0, 0, 32, 8, 8, 0, 40
db 2, 0, 32, 128, 128, 0, 0, 2, 40, 128, 128, 8, 2, 32, 8, 0
db 128, 40, 136, 0, 0, 8, 32, 0, 0, 128, 0, 0, 2, 40, 0, 128
db 32, 0, 32, 0, 136, 0, 0, 0, 34, 0, 8, 32, 0, 2, 128, 32
db 136, 0, 32, 128, 2, 0, 0, 128, 0, 0, 2, 0, 128, 2, 0
section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL'
include "%fasminc%\apia\kernel32.inc"
include "%fasminc%\apia\user32.inc"
section '.reloc' fixups data discardable