xref: /sqlite-3.40.0/test/sessionfuzz.c (revision f94c1902)
1*f94c1902Sdrh /*
2*f94c1902Sdrh ** 2018-03-01
3*f94c1902Sdrh **
4*f94c1902Sdrh ** The author disclaims copyright to this source code.  In place of
5*f94c1902Sdrh ** a legal notice, here is a blessing:
6*f94c1902Sdrh **
7*f94c1902Sdrh **    May you do good and not evil.
8*f94c1902Sdrh **    May you find forgiveness for yourself and forgive others.
9*f94c1902Sdrh **    May you share freely, never taking more than you give.
10*f94c1902Sdrh **
11*f94c1902Sdrh *************************************************************************
12*f94c1902Sdrh **
13*f94c1902Sdrh ** This file implements a program used for fuzz-testing the session
14*f94c1902Sdrh ** module.
15*f94c1902Sdrh **
16*f94c1902Sdrh ** Usage:
17*f94c1902Sdrh **
18*f94c1902Sdrh **      sessionfuzz setup         -- Generate starter test cases
19*f94c1902Sdrh **      sessionfuzz run FILE ...  -- Run a test fuzz on FILE
20*f94c1902Sdrh **      sesssiofuzz run SQLAR ... -- Run all test cases in the SQL Archive
21*f94c1902Sdrh **
22*f94c1902Sdrh ** Compiling:
23*f94c1902Sdrh **
24*f94c1902Sdrh **    (1) Have a version of SQLite that supports SQLITE_ENABLE_MEMDB
25*f94c1902Sdrh **        in the local directory.
26*f94c1902Sdrh **    (2) Run:
27*f94c1902Sdrh **
28*f94c1902Sdrh **          gcc -Wall -O3 -o sessionfuzz sessionfuzz.c -lz
29*f94c1902Sdrh **
30*f94c1902Sdrh ** Use with AFL (American Fuzzy Lop - http://lcamtuf.coredump.cx/afl/)
31*f94c1902Sdrh **
32*f94c1902Sdrh **    (1) ./afl-gcc -O3 -o sessionfuzz sessionfuzz.c -lz
33*f94c1902Sdrh **    (2) mkdir session-init session-run session-cases
34*f94c1902Sdrh **    (3) cd session-init; ../sessionfuzz setup; cd ..
35*f94c1902Sdrh **    (4) ./afl -i session-init -o session-run -- ./sessionfuzz run @@
36*f94c1902Sdrh **    ... let the previous step run for a while.  Weeks, maybe.
37*f94c1902Sdrh **    (5) ./afl-cmin -i session-run -o session-cases
38*f94c1902Sdrh **
39*f94c1902Sdrh ** The afl-cmin command on step (5) writes a minimal set of test cases
40*f94c1902Sdrh ** for coverage into the session-cases directory.  Gather the cases written
41*f94c1902Sdrh ** there into an SQL Archive using a command like this:
42*f94c1902Sdrh **
43*f94c1902Sdrh **     sqlite3 session-cases.db -Ac session-cases
44*f94c1902Sdrh **
45*f94c1902Sdrh ** Then repeat the test using:
46*f94c1902Sdrh **
47*f94c1902Sdrh **     ./sessionfuzz run session-cases.db
48*f94c1902Sdrh */
49*f94c1902Sdrh 
50*f94c1902Sdrh /*
51*f94c1902Sdrh ** We will import the entire SQLite source file to make compiling easier
52*f94c1902Sdrh */
53*f94c1902Sdrh #define SQLITE_DEBUG 1
54*f94c1902Sdrh #define SQLITE_THREADSAFE 0
55*f94c1902Sdrh #define SQLITE_OMIT_LOAD_EXTENSION 0
56*f94c1902Sdrh #define SQLITE_ENABLE_SESSION 1
57*f94c1902Sdrh #define SQLITE_ENABLE_PREUPDATE_HOOK 1
58*f94c1902Sdrh #define SQLITE_ENABLE_DESERIALIZE 1
59*f94c1902Sdrh #include "sqlite3.c"
60*f94c1902Sdrh 
61*f94c1902Sdrh /* Create a test database.  This will be an in-memory database */
62*f94c1902Sdrh static const char zInitSql[] =
63*f94c1902Sdrh   "CREATE TABLE t1(a INTEGER PRIMARY KEY,b,c,d);\n"
64*f94c1902Sdrh   "CREATE TABLE t2(e TEXT PRIMARY KEY NOT NULL,f,g);\n"
65*f94c1902Sdrh   "CREATE TABLE t3(w REAL PRIMARY KEY NOT NULL,x,y);\n"
66*f94c1902Sdrh   "CREATE TABLE t4(z PRIMARY KEY) WITHOUT ROWID;\n"
67*f94c1902Sdrh ;
68*f94c1902Sdrh 
69*f94c1902Sdrh /* Code to populate the database */
70*f94c1902Sdrh static const char zFillSql[] =
71*f94c1902Sdrh   "INSERT INTO t1(a,b,c,d) VALUES\n"
72*f94c1902Sdrh   "  (1,2,3,4),\n"
73*f94c1902Sdrh   "  (2,3.5,'four',x'556677'),\n"
74*f94c1902Sdrh   "  (3,null,'xyz',15),\n"
75*f94c1902Sdrh   "  (4,'bubba',0x80000000,0.0);\n"
76*f94c1902Sdrh   "INSERT INTO t1 SELECT a+4,c,d,b FROM t1;\n"
77*f94c1902Sdrh   "INSERT INTO t1 SELECT a+8,d,b,c FROM t1;\n"
78*f94c1902Sdrh   "INSERT INTO t1 SELECT a+16,d,c,b FROM t1;\n"
79*f94c1902Sdrh   "INSERT INTO t1 SELECT a+32,b,d,c FROM t1;\n"
80*f94c1902Sdrh   "INSERT INTO t2 SELECT printf('x%dy',a),b,c FROM t1;\n"
81*f94c1902Sdrh   "INSERT INTO t3 SELECT a*1.1,b,c FROM t1;\n"
82*f94c1902Sdrh   "INSERT INTO t4 SELECT a||','||quote(b) FROM t1;\n"
83*f94c1902Sdrh ;
84*f94c1902Sdrh 
85*f94c1902Sdrh /* A database file created by running the two scripts above */
86*f94c1902Sdrh static const unsigned char aDbBytes[] = {
87*f94c1902Sdrh   83, 81, 76,105,116,101, 32,102,111,114,109, 97,116, 32, 51,  0,  2,  0,  1,
88*f94c1902Sdrh    1,  0, 64, 32, 32,  0,  0,  0, 13,  0,  0,  0, 22,  0,  0,  0,  0,  0,  0,
89*f94c1902Sdrh    0,  0,  0,  0,  0,  5,  0,  0,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,
90*f94c1902Sdrh    0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
91*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
92*f94c1902Sdrh   13,  0, 46, 32,152, 13,  1,186,  0,  6,  0,176,  0,  1,194,  1, 84,  1,150,
93*f94c1902Sdrh    0,238,  1, 48,  0,176,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
94*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
95*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
96*f94c1902Sdrh    0,  0,  0,  0,  0, 60,  6,  6, 23, 17, 17,  1,101,116, 97, 98,108,101,116,
97*f94c1902Sdrh   52,116, 52,  7, 67, 82, 69, 65, 84, 69, 32, 84, 65, 66, 76, 69, 32,116, 52,
98*f94c1902Sdrh   40,122, 32, 80, 82, 73, 77, 65, 82, 89, 32, 75, 69, 89, 41, 32, 87, 73, 84,
99*f94c1902Sdrh   72, 79, 85, 84, 32, 82, 79, 87, 73, 68, 64,  4,  6, 23, 17, 17,  1,109,116,
100*f94c1902Sdrh   97, 98,108,101,116, 51,116, 51,  5, 67, 82, 69, 65, 84, 69, 32, 84, 65, 66,
101*f94c1902Sdrh   76, 69, 32,116, 51, 40,119, 32, 82, 69, 65, 76, 32, 80, 82, 73, 77, 65, 82,
102*f94c1902Sdrh   89, 32, 75, 69, 89, 32, 78, 79, 84, 32, 78, 85, 76, 76, 44,120, 44,121, 41,
103*f94c1902Sdrh   34,  5,  5, 23, 55, 17,  1,105,110,100,101,120,115,113,108,105,116,101, 95,
104*f94c1902Sdrh   97,117,116,111,105,110,100,101,120, 95,116, 51, 95, 49,116, 51,  6, 64,  2,
105*f94c1902Sdrh    6, 23, 17, 17,  1,109,116, 97, 98,108,101,116, 50,116, 50,  3, 67, 82, 69,
106*f94c1902Sdrh   65, 84, 69, 32, 84, 65, 66, 76, 69, 32,116, 50, 40,101, 32, 84, 69, 88, 84,
107*f94c1902Sdrh   32, 80, 82, 73, 77, 65, 82, 89, 32, 75, 69, 89, 32, 78, 79, 84, 32, 78, 85,
108*f94c1902Sdrh   76, 76, 44,102, 44,103, 41, 34,  3,  5, 23, 55, 17,  1,105,110,100,101,120,
109*f94c1902Sdrh  115,113,108,105,116,101, 95, 97,117,116,111,105,110,100,101,120, 95,116, 50,
110*f94c1902Sdrh   95, 49,116, 50,  4,  0,  0,  0,  8,  0,  0,  0,  0, 60,  1,  6, 23, 17, 17,
111*f94c1902Sdrh    1,101,116, 97, 98,108,101,116, 49,116, 49,  2, 67, 82, 69, 65, 84, 69, 32,
112*f94c1902Sdrh   84, 65, 66, 76, 69, 32,116, 49, 40, 97, 32, 73, 78, 84, 69, 71, 69, 82, 32,
113*f94c1902Sdrh   80, 82, 73, 77, 65, 82, 89, 32, 75, 69, 89, 44, 98, 44, 99, 44,100, 41,  5,
114*f94c1902Sdrh    0,  0,  0,  2,  1,246,  0,  0,  0,  0, 10,  1,251,  1,246,  1,177,  1,155,
115*f94c1902Sdrh    1,145,  1,119,  1,109,  1, 87,  1, 76,  1, 50,  1, 40,  1, 18,  1,  7,  0,
116*f94c1902Sdrh  237,  0,227,  0,205,  0,195,  0,169,  0,159,  0,137,  0,126,  0,100,  0, 90,
117*f94c1902Sdrh    0, 68,  0,  0,  0,  0,  0,  0,  0,  0, 20, 26,  5,  0, 21,  7, 18,102,111,
118*f94c1902Sdrh  117,114, 64, 12,  0,  0,  0,  0,  0,  0, 85,102,119,  8, 25,  5,  0,  1,  1,
119*f94c1902Sdrh    1,  3,  2,  4, 24, 24,  5,  0, 23,  7,  5, 98,117, 98, 98, 97,  0,  0,  0,
120*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,128,  0,  0,  0,  9, 23,  5,  0,  0,  1, 19, 15,
121*f94c1902Sdrh  120,121,122, 20, 22,  5,  0,  7, 18, 21, 64, 12,  0,  0,  0,  0,  0,  0, 85,
122*f94c1902Sdrh  102,119,102,111,117,114,  8, 21,  5,  0,  1,  1,  1,  2,  4,  3, 24, 20,  5,
123*f94c1902Sdrh    0,  7,  5, 23,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,  0,  0,  0, 98,
124*f94c1902Sdrh  117, 98, 98, 97,  8, 19,  4,  0,  1, 19, 15,120,121,122, 20, 18,  5,  0, 18,
125*f94c1902Sdrh   21,  7, 85,102,119,102,111,117,114, 64, 12,  0,  0,  0,  0,  0,  0,  8, 17,
126*f94c1902Sdrh    5,  0,  1,  1,  1,  4,  3,  2, 24, 16,  5,  0, 23,  5,  7, 98,117, 98, 98,
127*f94c1902Sdrh   97,  0,  0,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9, 15,  5,  0,
128*f94c1902Sdrh    0, 19,  1,120,121,122, 15, 20, 14,  5,  0,  7, 21, 18, 64, 12,  0,  0,  0,
129*f94c1902Sdrh    0,  0,  0,102,111,117,114, 85,102,119,  8, 13,  5,  0,  1,  1,  1,  2,  3,
130*f94c1902Sdrh    4, 24, 12,  5,  0,  7, 23,  5,  0,  0,  0,  0,  0,  0,  0,  0, 98,117, 98,
131*f94c1902Sdrh   98, 97,  0,  0,128,  0,  0,  0,  9, 11,  5,  0,  1,  0, 19, 15,120,121,122,
132*f94c1902Sdrh   20, 10,  5,  0, 18,  7, 21, 85,102,119, 64, 12,  0,  0,  0,  0,  0,  0,102,
133*f94c1902Sdrh  111,117,114,  8,  9,  5,  0,  1,  1,  1,  4,  2,  3, 24,  8,  5,  0,  5,  7,
134*f94c1902Sdrh   23,  0,  0,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 98,117, 98, 98,
135*f94c1902Sdrh   97,  8,  7,  4,  0, 19,  1,120,121,122, 15, 20,  6,  5,  0, 21, 18,  7,102,
136*f94c1902Sdrh  111,117,114, 85,102,119, 64, 12,  0,  0,  0,  0,  0,  0,  8,  5,  5,  0,  1,
137*f94c1902Sdrh    1,  1,  3,  4,  2, 24,  4,  5,  0, 23,  5,  7, 98,117, 98, 98, 97,  0,  0,
138*f94c1902Sdrh  128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  3,  5,  0,  0, 19,  1,
139*f94c1902Sdrh  120,121,122, 15, 20,  2,  5,  0,  7, 21, 18, 64, 12,  0,  0,  0,  0,  0,  0,
140*f94c1902Sdrh  102,111,117,114, 85,102,119,  0,  0,  0,  9, 52,  0,  0,  0,  8, 26,  5,  0,
141*f94c1902Sdrh    0,  0,  2,  1,246,  0,  0,  0,  0, 13,  1,251,  1,246,  1,181,  1,165,  1,
142*f94c1902Sdrh  152,  1,129,  1,118,  1, 97,  1, 87,  1, 64,  1, 52,  1, 30,  1, 17,  0,252,
143*f94c1902Sdrh    0,240,  0,223,  0,209,  0,185,  0,173,  0,152,  0,141,  0,118,  0,106,  0,
144*f94c1902Sdrh   84,  0, 72,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 27,  3, 21, 19,120,
145*f94c1902Sdrh   50, 55,121,120,121,122, 20, 26,  4, 21, 21,  7,120, 50, 54,121,102,111,117,
146*f94c1902Sdrh  114, 64, 12,  0,  0,  0,  0,  0,  0, 10, 25,  4, 21,  1,  1,120, 50, 53,121,
147*f94c1902Sdrh    3,  2, 21, 24,  4, 21, 23,  7,120, 50, 52,121, 98,117, 98, 98, 97,  0,  0,
148*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  9, 23,  4, 21,  0,  1,120, 50, 51,121, 15, 19, 22,
149*f94c1902Sdrh    4, 21,  7, 18,120, 50, 50,121, 64, 12,  0,  0,  0,  0,  0,  0, 85,102,119,
150*f94c1902Sdrh   10, 21,  4, 21,  1,  1,120, 50, 49,121,  2,  4, 22, 20,  4, 21,  7,  5,120,
151*f94c1902Sdrh   50, 48,121,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,  0,  0,  0, 12, 19,
152*f94c1902Sdrh    4, 21,  1, 19,120, 49, 57,121, 15,120,121,122, 15, 18,  4, 21, 18, 21,120,
153*f94c1902Sdrh   49, 56,121, 85,102,119,102,111,117,114, 10, 17,  4, 21,  1,  1,120, 49, 55,
154*f94c1902Sdrh  121,  4,  3, 19, 16,  4, 21, 23,  5,120, 49, 54,121, 98,117, 98, 98, 97,  0,
155*f94c1902Sdrh    0,128,  0,  0,  0, 11, 15,  4, 21,  0, 19,120, 49, 53,121,120,121,122, 20,
156*f94c1902Sdrh   14,  4, 21,  7, 21,120, 49, 52,121, 64, 12,  0,  0,  0,  0,  0,  0,102,111,
157*f94c1902Sdrh  117,114, 10, 13,  4, 21,  1,  1,120, 49, 51,121,  2,  3, 21, 12,  4, 21,  7,
158*f94c1902Sdrh   23,120, 49, 50,121,  0,  0,  0,  0,  0,  0,  0,  0, 98,117, 98, 98, 97,  8,
159*f94c1902Sdrh   11,  3, 21,  1,120, 49, 49,121, 15, 19, 10,  4, 21, 18,  7,120, 49, 48,121,
160*f94c1902Sdrh   85,102,119, 64, 12,  0,  0,  0,  0,  0,  0,  9,  9,  4, 19,  1,  1,120, 57,
161*f94c1902Sdrh  121,  4,  2, 21,  8,  4, 19,  5,  7,120, 56,121,  0,  0,128,  0,  0,  0,  0,
162*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0, 11,  7,  4, 19, 19,  1,120, 55,121,120,121,122,
163*f94c1902Sdrh   15, 14,  6,  4, 19, 21, 18,120, 54,121,102,111,117,114, 85,102,119,  9,  5,
164*f94c1902Sdrh    4, 19,  1,  1,120, 53,121,  3,  4, 18,  4,  4, 19, 23,  5,120, 52,121, 98,
165*f94c1902Sdrh  117, 98, 98, 97,  0,  0,128,  0,  0,  0, 10,  3,  4, 19,  0, 19,120, 51,121,
166*f94c1902Sdrh  120,121,122, 19,  2,  4, 19,  7, 21,120, 50,121, 64, 12,  0,  0,  0,  0,  0,
167*f94c1902Sdrh    0,102,111,117,114,  9,  0,  0,  0, 12, 53,  0,  0,  0, 11, 27,  2,  0,  0,
168*f94c1902Sdrh    0,  1,  1,243,  0,  0,  0,  0, 15,  1,243,  1,220,  1,211,  1,202,  1,193,
169*f94c1902Sdrh    1,184,  1,175,  1,166,  1,159,  1,150,  1,141,  1,132,  1,123,  1,114,  1,
170*f94c1902Sdrh  105,  1, 96,  1, 87,  1, 78,  1, 69,  1, 61,  1, 52,  1, 43,  1, 34,  1, 25,
171*f94c1902Sdrh    1, 16,  1,  7,  0,254,  0,245,  0,236,  0,227,  0,219,  0,210,  0,201,  0,
172*f94c1902Sdrh  192,  0,183,  0,174,  0,165,  0,156,  0,147,  0,138,  0,129,  0,121,  0,112,
173*f94c1902Sdrh    0,103,  0,  0,  0,  8,  3, 21,  1,120, 53, 49,121, 51,  8,  3, 21,  1,120,
174*f94c1902Sdrh   53, 48,121, 50,  7,  3, 19,  1,120, 52,121,  4,  8,  3, 21,  1,120, 52, 57,
175*f94c1902Sdrh  121, 49,  8,  3, 21,  1,120, 52, 56,121, 48,  8,  3, 21,  1,120, 52, 55,121,
176*f94c1902Sdrh   47,  8,  3, 21,  1,120, 52, 54,121, 46,  8,  3, 21,  1,120, 52, 53,121, 45,
177*f94c1902Sdrh    8,  3, 21,  1,120, 52, 52,121, 44,  8,  3, 21,  1,120, 52, 51,121, 43,  8,
178*f94c1902Sdrh    3, 21,  1,120, 52, 50,121, 42,  8,  3, 21,  1,120, 52, 49,121, 41,  8,  3,
179*f94c1902Sdrh   21,  1,120, 52, 48,121, 40,  7,  3, 19,  1,120, 51,121,  3,  8,  3, 21,  1,
180*f94c1902Sdrh  120, 51, 57,121, 39,  8,  3, 21,  1,120, 51, 56,121, 38,  8,  3, 21,  1,120,
181*f94c1902Sdrh   51, 55,121, 37,  8,  3, 21,  1,120, 51, 54,121, 36,  8,  3, 21,  1,120, 51,
182*f94c1902Sdrh   53,121, 35,  8,  3, 21,  1,120, 51, 52,121, 34,  8,  3, 21,  1,120, 51, 51,
183*f94c1902Sdrh  121, 33,  8,  3, 21,  1,120, 51, 50,121, 32,  8,  3, 21,  1,120, 51, 49,121,
184*f94c1902Sdrh   31,  8,  3, 21,  1,120, 51, 48,121, 30,  7,  3, 19,  1,120, 50,121,  2,  8,
185*f94c1902Sdrh    3, 21,  1,120, 50, 57,121, 29,  8,  3, 21,  1,120, 50, 56,121, 28,  8,  3,
186*f94c1902Sdrh   21,  1,120, 50, 55,121, 27,  8,  3, 21,  1,120, 50, 54,121, 26,  8,  3, 21,
187*f94c1902Sdrh    1,120, 50, 53,121, 25,  8,  3, 21,  1,120, 50, 52,121, 24,  8,  3, 21,  1,
188*f94c1902Sdrh  120, 50, 51,121, 23,  8,  3, 21,  1,120, 50, 50,121, 22,  8,  3, 21,  1,120,
189*f94c1902Sdrh   50, 49,121, 21,  8,  3, 21,  1,120, 50, 48,121, 20,  6,  3, 19,  9,120, 49,
190*f94c1902Sdrh  121,  8,  3, 21,  1,120, 49, 57,121, 19,  8,  3, 21,  1,120, 49, 56,121, 18,
191*f94c1902Sdrh    8,  3, 21,  1,120, 49, 55,121, 17,  8,  3, 21,  1,120, 49, 54,121, 16,  8,
192*f94c1902Sdrh    3, 21,  1,120, 49, 53,121, 15,  8,  3, 21,  1,120, 49, 52,121, 14,  8,  3,
193*f94c1902Sdrh   21,  1,120, 49, 51,121, 13,  8,  3, 21,  1,120, 49, 50,121, 12,  8,  3, 21,
194*f94c1902Sdrh    1,120,  0,  0,  0, 14,  8,  3, 21,  1,120, 53, 49,121, 51,  5,  0,  0,  0,
195*f94c1902Sdrh    2,  1,246,  0,  0,  0,  0, 18,  1,251,  1,246,  1,156,  1,135,  1,117,  1,
196*f94c1902Sdrh   89,  1, 73,  1, 55,  1, 41,  1, 14,  0,254,  0,228,  0,211,  0,186,  0,170,
197*f94c1902Sdrh    0,149,  0,131,  0,110,  0, 94,  0, 69,  0, 54, 13, 23,  4,  7,  0,  1, 64,
198*f94c1902Sdrh   57, 76,204,204,204,204,205, 15, 23, 22,  4,  7,  7, 18, 64, 56, 51, 51, 51,
199*f94c1902Sdrh   51, 51, 52, 64, 12,  0,  0,  0,  0,  0,  0, 85,102,119, 14, 21,  4,  7,  1,
200*f94c1902Sdrh    1, 64, 55, 25,153,153,153,153,154,  2,  4, 19, 20,  4,  1,  7,  5, 22,  0,
201*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,128,  0,  0,  0, 16, 19,  4,  7,  1, 19,
202*f94c1902Sdrh   64, 52,230,102,102,102,102,103, 15,120,121,122, 19, 18,  4,  7, 18, 21, 64,
203*f94c1902Sdrh   51,204,204,204,204,204,205, 85,102,119,102,111,117,114, 14, 17,  4,  7,  1,
204*f94c1902Sdrh    1, 64, 50,179, 51, 51, 51, 51, 52,  4,  3, 23, 16,  4,  7, 23,  5, 64, 49,
205*f94c1902Sdrh  153,153,153,153,153,154, 98,117, 98, 98, 97,  0,  0,128,  0,  0,  0, 15, 15,
206*f94c1902Sdrh    4,  7,  0, 19, 64, 48,128,  0,  0,  0,  0,  0,120,121,122, 24, 14,  4,  7,
207*f94c1902Sdrh    7, 21, 64, 46,204,204,204,204,204,206, 64, 12,  0,  0,  0,  0,  0,  0,102,
208*f94c1902Sdrh  111,117,114, 14, 13,  4,  7,  1,  1, 64, 44,153,153,153,153,153,154,  2,  3,
209*f94c1902Sdrh   25, 12,  4,  7,  7, 23, 64, 42,102,102,102,102,102,103,  0,  0,  0,  0,  0,
210*f94c1902Sdrh    0,  0,  0, 98,117, 98, 98, 97, 12, 11,  3,  7,  1, 64, 40, 51, 51, 51, 51,
211*f94c1902Sdrh   51, 52, 15, 16, 10,  4,  1, 18,  7, 11, 85,102,119, 64, 12,  0,  0,  0,  0,
212*f94c1902Sdrh    0,  0, 14,  9,  4,  7,  1,  1, 64, 35,204,204,204,204,204,205,  4,  2, 26,
213*f94c1902Sdrh    8,  4,  7,  5,  7, 64, 33,153,153,153,153,153,154,  0,  0,128,  0,  0,  0,
214*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0, 16,  7,  4,  7, 19,  1, 64, 30,204,204,204,
215*f94c1902Sdrh  204,204,206,120,121,122, 15, 19,  6,  4,  7, 21, 18, 64, 26,102,102,102,102,
216*f94c1902Sdrh  102,103,102,111,117,114, 85,102,119, 14,  5,  4,  7,  1,  1, 64, 22,  0,  0,
217*f94c1902Sdrh    0,  0,  0,  0,  3,  4, 23,  4,  4,  7, 23,  5, 64, 17,153,153,153,153,153,
218*f94c1902Sdrh  154, 98,117, 98, 98, 97,  0,  0,128,  0,  0,  0, 15,  3,  4,  7,  0, 19, 64,
219*f94c1902Sdrh   10,102,102,102,102,102,103,120,121,122, 24,  2,  4,  7,  7, 21, 64,  1,153,
220*f94c1902Sdrh  153,153,153,153,154, 64, 12,  0,  0,  0,  0,  0,  0,102,111,117,114, 14,  1,
221*f94c1902Sdrh    4,  7,  1,  1,  0,  0,  0, 17, 45,  0,  0,  0, 16, 23,  2,  0,  0,  0,  1,
222*f94c1902Sdrh    1,239,  0,  0,  0,  0, 20,  1,239,  1,205,  1,192,  1,179,  1,166,  1,153,
223*f94c1902Sdrh    1,140,  1,134,  1,121,  1,108,  1, 95,  1, 82,  1, 69,  1, 56,  1, 43,  1,
224*f94c1902Sdrh   30,  1, 17,  1, 11,  0,254,  0,241,  0,228,  0,215,  0,202,  0,189,  0,176,
225*f94c1902Sdrh    0,163,  0,150,  0,144,  0,131,  0,118,  0,105,  0, 92,  0, 79,  0, 12,  3,
226*f94c1902Sdrh    7,  1, 64, 67, 64,  0,  0,  0,  0,  0, 35, 12,  3,  7,  1, 64, 66,179, 51,
227*f94c1902Sdrh   51, 51, 51, 52, 34, 12,  3,  7,  1, 64, 66, 38,102,102,102,102,103, 33, 12,
228*f94c1902Sdrh    3,  7,  1, 64, 65,153,153,153,153,153,154, 32, 12,  3,  7,  1, 64, 65, 12,
229*f94c1902Sdrh  204,204,204,204,205, 31,  5,  3,  1,  1, 33, 30, 12,  3,  7,  1, 64, 63,230,
230*f94c1902Sdrh  102,102,102,102,103, 29, 12,  3,  7,  1, 64, 62,204,204,204,204,204,206, 28,
231*f94c1902Sdrh   12,  3,  7,  1, 64, 61,179, 51, 51, 51, 51, 52, 27, 12,  3,  7,  1, 64, 60,
232*f94c1902Sdrh  153,153,153,153,153,154, 26, 12,  3,  7,  1, 64, 59,128,  0,  0,  0,  0,  1,
233*f94c1902Sdrh   25, 12,  3,  7,  1, 64, 58,102,102,102,102,102,103, 24, 12,  3,  7,  1, 64,
234*f94c1902Sdrh   57, 76,204,204,204,204,205, 23, 12,  3,  7,  1, 64, 56, 51, 51, 51, 51, 51,
235*f94c1902Sdrh   52, 22, 12,  3,  7,  1, 64, 55, 25,153,153,153,153,154, 21,  5,  3,  1,  1,
236*f94c1902Sdrh   22, 20, 12,  3,  7,  1, 64, 52,230,102,102,102,102,103, 19, 12,  3,  7,  1,
237*f94c1902Sdrh   64, 51,204,204,204,204,204,205, 18, 12,  3,  7,  1, 64, 50,179, 51, 51, 51,
238*f94c1902Sdrh   51, 52, 17, 12,  3,  7,  1, 64, 49,153,153,153,153,153,154, 16, 12,  3,  7,
239*f94c1902Sdrh    1, 64, 48,128,  0,  0,  0,  0,  0, 15, 12,  3,  7,  1, 64, 46,204,204,204,
240*f94c1902Sdrh  204,204,206, 14, 12,  3,  7,  1, 64, 44,153,153,153,153,153,154, 13, 12,  3,
241*f94c1902Sdrh    7,  1, 64, 42,102,102,102,102,102,103, 12, 12,  3,  7,  1, 64, 40, 51, 51,
242*f94c1902Sdrh   51, 51, 51, 52, 11,  5,  3,  1,  1, 11, 10, 12,  3,  7,  1, 64, 35,204,204,
243*f94c1902Sdrh  204,204,204,205,  9, 12,  3,  7,  1, 64, 33,153,153,153,153,153,154,  8, 12,
244*f94c1902Sdrh    3,  7,  1, 64, 30,204,204,204,204,204,206,  7, 12,  3,  7,  1, 64, 26,102,
245*f94c1902Sdrh  102,102,102,102,103,  6, 12,  3,  7,  1, 64, 22,  0,  0,  0,  0,  0,  0,  5,
246*f94c1902Sdrh   12,  3,  7,  1, 64, 17,153,153,153,153,153,154,  4, 12,  3,  7,  1, 64, 10,
247*f94c1902Sdrh  102,102,102,102,102,103,  3, 12,  3,  7,  1, 64,  1,153,153,  0,  0,  0, 19,
248*f94c1902Sdrh   12,  3,  7,  1, 64, 67, 64,  0,  0,  0,  0,  0, 35,  2,  0,  0,  0,  1,  1,
249*f94c1902Sdrh  242,  0,  0,  0,  0, 22,  1,242,  1,218,  1,211,  1,202,  1,192,  1,179,  1,
250*f94c1902Sdrh  172,  1,157,  1,149,  1,141,  1,132,  1,125,  1,116,  1,106,  1, 93,  1, 86,
251*f94c1902Sdrh    1, 74,  1, 63,  1, 47,  1, 40,  1, 31,  1, 16,  1,  8,  0,255,  0,248,  0,
252*f94c1902Sdrh  239,  0,229,  0,216,  0,209,  0,197,  0,186,  0,174,  0,158,  0,151,  0,136,
253*f94c1902Sdrh    0,128,  0,119,  0,112,  0,103,  0, 93,  0,  9,  2, 27, 52, 55, 44, 78, 85,
254*f94c1902Sdrh   76, 76,  8,  2, 25, 52, 54, 44, 51, 46, 53,  6,  2, 21, 52, 53, 44, 50,  8,
255*f94c1902Sdrh    2, 25, 52, 52, 44, 48, 46, 48,  7,  2, 23, 52, 51, 44, 49, 53, 14,  2, 37,
256*f94c1902Sdrh   52, 50, 44, 88, 39, 53, 53, 54, 54, 55, 55, 39,  6,  2, 21, 52, 49, 44, 52,
257*f94c1902Sdrh   15,  2, 39, 52, 48, 44, 50, 49, 52, 55, 52, 56, 51, 54, 52, 56, 11,  2, 31,
258*f94c1902Sdrh   52, 44, 39, 98,117, 98, 98, 97, 39, 10,  2, 29, 51, 57, 44, 39,120,121,122,
259*f94c1902Sdrh   39, 11,  2, 31, 51, 56, 44, 39,102,111,117,114, 39,  6,  2, 21, 51, 55, 44,
260*f94c1902Sdrh   51, 12,  2, 33, 51, 54, 44, 39, 98,117, 98, 98, 97, 39,  9,  2, 27, 51, 53,
261*f94c1902Sdrh   44, 78, 85, 76, 76,  8,  2, 25, 51, 52, 44, 51, 46, 53,  6,  2, 21, 51, 51,
262*f94c1902Sdrh   44, 50,  8,  2, 25, 51, 50, 44, 48, 46, 48,  7,  2, 23, 51, 49, 44, 49, 53,
263*f94c1902Sdrh   14,  2, 37, 51, 48, 44, 88, 39, 53, 53, 54, 54, 55, 55, 39,  8,  2, 25, 51,
264*f94c1902Sdrh   44, 78, 85, 76, 76,  6,  2, 21, 50, 57, 44, 52, 15,  2, 39, 50, 56, 44, 50,
265*f94c1902Sdrh   49, 52, 55, 52, 56, 51, 54, 52, 56, 10,  2, 29, 50, 55, 44, 39,120,121,122,
266*f94c1902Sdrh   39, 11,  2, 31, 50, 54, 44, 39,102,111,117,114, 39,  6,  2, 21, 50, 53, 44,
267*f94c1902Sdrh   51, 12,  2, 33, 50, 52, 44, 39, 98,117, 98, 98, 97, 39,  9,  2, 27, 50, 51,
268*f94c1902Sdrh   44, 78, 85, 76, 76,  8,  2, 25, 50, 50, 44, 51, 46, 53,  6,  2, 21, 50, 49,
269*f94c1902Sdrh   44, 50,  8,  2, 25, 50, 48, 44, 48, 46, 48,  7,  2, 23, 50, 44, 51, 46, 53,
270*f94c1902Sdrh    7,  2, 23, 49, 57, 44, 49, 53, 14,  2, 37, 49, 56, 44, 88, 39, 53, 53, 54,
271*f94c1902Sdrh   54, 55, 55, 39,  6,  2, 21, 49, 55, 44, 52, 12,  2, 33, 49, 54, 44, 39, 98,
272*f94c1902Sdrh  117, 98, 98, 97, 39,  9,  2, 27, 49, 53, 44, 78, 85, 76, 76,  8,  2, 25, 49,
273*f94c1902Sdrh   52, 44, 51, 46, 53,  6,  2, 21, 49, 51, 44, 50,  8,  2, 25, 49, 50, 44, 48,
274*f94c1902Sdrh   46, 48,  7,  2, 23, 49, 49, 44, 49, 53, 14,  2, 37, 49, 48, 44, 88,  0,  0,
275*f94c1902Sdrh    0, 21,  9,  2, 27, 52, 55, 44, 78, 85, 76, 76, 13,  0,  0,  0, 26,  0, 68,
276*f94c1902Sdrh    0,  1,246,  1,224,  1,213,  1,187,  1,177,  1,155,  1,145,  1,119,  1,109,
277*f94c1902Sdrh    1, 87,  1, 76,  1, 50,  1, 40,  1, 18,  1,  7,  0,237,  0,227,  0,205,  0,
278*f94c1902Sdrh  195,  0,169,  0,159,  0,137,  0,126,  0,100,  0, 90,  0, 68,  0,  0,  0,  0,
279*f94c1902Sdrh    0,  0,  0,  0, 20, 26,  5,  0, 21,  7, 18,102,111,117,114, 64, 12,  0,  0,
280*f94c1902Sdrh    0,  0,  0,  0, 85,102,119,  8, 25,  5,  0,  1,  1,  1,  3,  2,  4, 24, 24,
281*f94c1902Sdrh    5,  0, 23,  7,  5, 98,117, 98, 98, 97,  0,  0,  0,  0,  0,  0,  0,  0,  0,
282*f94c1902Sdrh    0,128,  0,  0,  0,  9, 23,  5,  0,  0,  1, 19, 15,120,121,122, 20, 22,  5,
283*f94c1902Sdrh    0,  7, 18, 21, 64, 12,  0,  0,  0,  0,  0,  0, 85,102,119,102,111,117,114,
284*f94c1902Sdrh    8, 21,  5,  0,  1,  1,  1,  2,  4,  3, 24, 20,  5,  0,  7,  5, 23,  0,  0,
285*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,128,  0,  0,  0, 98,117, 98, 98, 97,  8, 19,
286*f94c1902Sdrh    4,  0,  1, 19, 15,120,121,122, 20, 18,  5,  0, 18, 21,  7, 85,102,119,102,
287*f94c1902Sdrh  111,117,114, 64, 12,  0,  0,  0,  0,  0,  0,  8, 17,  5,  0,  1,  1,  1,  4,
288*f94c1902Sdrh    3,  2, 24, 16,  5,  0, 23,  5,  7, 98,117, 98, 98, 97,  0,  0,128,  0,  0,
289*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  9, 15,  5,  0,  0, 19,  1,120,121,122,
290*f94c1902Sdrh   15, 20, 14,  5,  0,  7, 21, 18, 64, 12,  0,  0,  0,  0,  0,  0,102,111,117,
291*f94c1902Sdrh  114, 85,102,119,  8, 13,  5,  0,  1,  1,  1,  2,  3,  4, 24, 12,  5,  0,  7,
292*f94c1902Sdrh   23,  5,  0,  0,  0,  0,  0,  0,  0,  0, 98,117, 98, 98, 97,  0,  0,128,  0,
293*f94c1902Sdrh    0,  0,  9, 11,  5,  0,  1,  0, 19, 15,120,121,122, 20, 10,  5,  0, 18,  7,
294*f94c1902Sdrh   21, 85,102,119, 64, 12,  0,  0,  0,  0,  0,  0,102,111,117,114,  8,  9,  5,
295*f94c1902Sdrh    0,  1,  1,  1,  4,  2,  3, 24,  8,  5,  0,  5,  7, 23,  0,  0,128,  0,  0,
296*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0, 98,117, 98, 98, 97,  8,  7,  4,  0, 19,
297*f94c1902Sdrh    1,120,121,122, 15, 20,  6,  5,  0, 21, 18,  7,102,111,117,114, 85,102,119,
298*f94c1902Sdrh   64, 12,  0,  0,  0,  0,  0,  0,  8,  5,  5,  0,  1,  1,  1,  3,  4,  2, 24,
299*f94c1902Sdrh    4,  5,  0, 23,  5,  7, 98,117, 98, 98, 97,  0,  0,128,  0,  0,  0,  0,  0,
300*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  9,  3,  5,  0,  0, 19,  1,120,121,122, 15, 20,  2,
301*f94c1902Sdrh    5,  0,  7, 21, 18, 64, 12,  0,  0,  0,  0,  0,  0,102,111,117,114, 85,102,
302*f94c1902Sdrh  119,  8,  1,  5,  0,  1,  1,  1,  2,  3,  4, 13,  0,  0,  0, 26,  0, 63,  0,
303*f94c1902Sdrh    1,245,  1,219,  1,209,  1,187,  1,177,  1,151,  1,141,  1,119,  1,108,  1,
304*f94c1902Sdrh   82,  1, 72,  1, 50,  1, 39,  1, 13,  1,  3,  0,237,  0,227,  0,201,  0,191,
305*f94c1902Sdrh    0,169,  0,158,  0,132,  0,122,  0,100,  0, 89,  0, 63,  0,  0,  0, 24, 52,
306*f94c1902Sdrh    5,  0,  7, 23,  5,  0,  0,  0,  0,  0,  0,  0,  0, 98,117, 98, 98, 97,  0,
307*f94c1902Sdrh    0,128,  0,  0,  0,  9, 51,  5,  0,  1,  0, 19, 15,120,121,122, 20, 50,  5,
308*f94c1902Sdrh    0, 18,  7, 21, 85,102,119, 64, 12,  0,  0,  0,  0,  0,  0,102,111,117,114,
309*f94c1902Sdrh    8, 49,  5,  0,  1,  1,  1,  4,  2,  3, 24, 48,  5,  0, 23,  7,  5, 98,117,
310*f94c1902Sdrh   98, 98, 97,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,  0,  0,  0,  9, 47,
311*f94c1902Sdrh    5,  0,  0,  1, 19, 15,120,121,122, 20, 46,  5,  0,  7, 18, 21, 64, 12,  0,
312*f94c1902Sdrh    0,  0,  0,  0,  0, 85,102,119,102,111,117,114,  8, 45,  5,  0,  1,  1,  1,
313*f94c1902Sdrh    2,  4,  3, 24, 44,  5,  0,  7,  5, 23,  0,  0,  0,  0,  0,  0,  0,  0,  0,
314*f94c1902Sdrh    0,128,  0,  0,  0, 98,117, 98, 98, 97,  8, 43,  4,  0,  1, 19, 15,120,121,
315*f94c1902Sdrh  122, 20, 42,  5,  0, 18, 21,  7, 85,102,119,102,111,117,114, 64, 12,  0,  0,
316*f94c1902Sdrh    0,  0,  0,  0,  8, 41,  5,  0,  1,  1,  1,  4,  3,  2, 24, 40,  5,  0,  5,
317*f94c1902Sdrh   23,  7,  0,  0,128,  0,  0,  0, 98,117, 98, 98, 97,  0,  0,  0,  0,  0,  0,
318*f94c1902Sdrh    0,  0,  9, 39,  5,  0, 19,  0,  1,120,121,122, 15, 20, 38,  5,  0, 21,  7,
319*f94c1902Sdrh   18,102,111,117,114, 64, 12,  0,  0,  0,  0,  0,  0, 85,102,119,  8, 37,  5,
320*f94c1902Sdrh    0,  1,  1,  1,  3,  2,  4, 24, 36,  5,  0, 23,  7,  5, 98,117, 98, 98, 97,
321*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,  0,  0,  0,  9, 35,  5,  0,  0,
322*f94c1902Sdrh    1, 19, 15,120,121,122, 20, 34,  5,  0,  7, 18, 21, 64, 12,  0,  0,  0,  0,
323*f94c1902Sdrh    0,  0, 85,102,119,102,111,117,114,  8, 33,  5,  0,  1,  1,  1,  2,  4,  3,
324*f94c1902Sdrh   24, 32,  5,  0,  7,  5, 23,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,  0,
325*f94c1902Sdrh    0,  0, 98,117, 98, 98, 97,  8, 31,  4,  0,  1, 19, 15,120,121,122, 20, 30,
326*f94c1902Sdrh    5,  0, 18, 21,  7, 85,102,119,102,111,117,114, 64, 12,  0,  0,  0,  0,  0,
327*f94c1902Sdrh    0,  8, 29,  5,  0,  1,  1,  1,  4,  3,  2, 24, 28,  5,  0,  5, 23,  7,  0,
328*f94c1902Sdrh    0,128,  0,  0,  0, 98,117, 98, 98, 97,  0,  0,  0,  0,  0,  0,  0,  0,  9,
329*f94c1902Sdrh   27,  5,  0, 19,  0,  1,120,121,122, 15, 13,  0,  0,  0, 12,  1, 50,  0,  1,
330*f94c1902Sdrh  246,  1,224,  1,213,  1,187,  1,177,  1,155,  1,145,  1,119,  1,109,  1, 87,
331*f94c1902Sdrh    1, 76,  1, 50,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
332*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
333*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
334*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
335*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
336*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
337*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
338*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
339*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
340*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
341*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
342*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
343*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
344*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
345*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24, 64,  5,  0,  7, 23,  5,
346*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0, 98,117, 98, 98, 97,  0,  0,128,  0,  0,  0,
347*f94c1902Sdrh    9, 63,  5,  0,  1,  0, 19, 15,120,121,122, 20, 62,  5,  0, 18,  7, 21, 85,
348*f94c1902Sdrh  102,119, 64, 12,  0,  0,  0,  0,  0,  0,102,111,117,114,  8, 61,  5,  0,  1,
349*f94c1902Sdrh    1,  1,  4,  2,  3, 24, 60,  5,  0,  5,  7, 23,  0,  0,128,  0,  0,  0,  0,
350*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0, 98,117, 98, 98, 97,  8, 59,  4,  0, 19,  1,120,
351*f94c1902Sdrh  121,122, 15, 20, 58,  5,  0, 21, 18,  7,102,111,117,114, 85,102,119, 64, 12,
352*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  8, 57,  5,  0,  1,  1,  1,  3,  4,  2, 24, 56,  5,
353*f94c1902Sdrh    0, 23,  5,  7, 98,117, 98, 98, 97,  0,  0,128,  0,  0,  0,  0,  0,  0,  0,
354*f94c1902Sdrh    0,  0,  0,  0,  9, 55,  5,  0,  0, 19,  1,120,121,122, 15, 20, 54,  5,  0,
355*f94c1902Sdrh    7, 21, 18, 64, 12,  0,  0,  0,  0,  0,  0,102,111,117,114, 85,102,119,  8,
356*f94c1902Sdrh   53,  5,  0,  1,  1,  1,  2,  3,  4, 13,  0,  0,  0, 27,  0, 72,  0,  1,245,
357*f94c1902Sdrh    1,224,  1,212,  1,192,  1,181,  1,165,  1,152,  1,129,  1,118,  1, 97,  1,
358*f94c1902Sdrh   87,  1, 64,  1, 52,  1, 30,  1, 17,  0,252,  0,240,  0,223,  0,209,  0,185,
359*f94c1902Sdrh    0,173,  0,152,  0,141,  0,118,  0,106,  0, 84,  0, 72,  0,  0,  0,  0,  0,
360*f94c1902Sdrh    0,  0,  0,  0,  0, 10, 27,  3, 21, 19,120, 50, 55,121,120,121,122, 20, 26,
361*f94c1902Sdrh    4, 21, 21,  7,120, 50, 54,121,102,111,117,114, 64, 12,  0,  0,  0,  0,  0,
362*f94c1902Sdrh    0, 10, 25,  4, 21,  1,  1,120, 50, 53,121,  3,  2, 21, 24,  4, 21, 23,  7,
363*f94c1902Sdrh  120, 50, 52,121, 98,117, 98, 98, 97,  0,  0,  0,  0,  0,  0,  0,  0,  9, 23,
364*f94c1902Sdrh    4, 21,  0,  1,120, 50, 51,121, 15, 19, 22,  4, 21,  7, 18,120, 50, 50,121,
365*f94c1902Sdrh   64, 12,  0,  0,  0,  0,  0,  0, 85,102,119, 10, 21,  4, 21,  1,  1,120, 50,
366*f94c1902Sdrh   49,121,  2,  4, 22, 20,  4, 21,  7,  5,120, 50, 48,121,  0,  0,  0,  0,  0,
367*f94c1902Sdrh    0,  0,  0,  0,  0,128,  0,  0,  0, 12, 19,  4, 21,  1, 19,120, 49, 57,121,
368*f94c1902Sdrh   15,120,121,122, 15, 18,  4, 21, 18, 21,120, 49, 56,121, 85,102,119,102,111,
369*f94c1902Sdrh  117,114, 10, 17,  4, 21,  1,  1,120, 49, 55,121,  4,  3, 19, 16,  4, 21, 23,
370*f94c1902Sdrh    5,120, 49, 54,121, 98,117, 98, 98, 97,  0,  0,128,  0,  0,  0, 11, 15,  4,
371*f94c1902Sdrh   21,  0, 19,120, 49, 53,121,120,121,122, 20, 14,  4, 21,  7, 21,120, 49, 52,
372*f94c1902Sdrh  121, 64, 12,  0,  0,  0,  0,  0,  0,102,111,117,114, 10, 13,  4, 21,  1,  1,
373*f94c1902Sdrh  120, 49, 51,121,  2,  3, 21, 12,  4, 21,  7, 23,120, 49, 50,121,  0,  0,  0,
374*f94c1902Sdrh    0,  0,  0,  0,  0, 98,117, 98, 98, 97,  8, 11,  3, 21,  1,120, 49, 49,121,
375*f94c1902Sdrh   15, 19, 10,  4, 21, 18,  7,120, 49, 48,121, 85,102,119, 64, 12,  0,  0,  0,
376*f94c1902Sdrh    0,  0,  0,  9,  9,  4, 19,  1,  1,120, 57,121,  4,  2, 21,  8,  4, 19,  5,
377*f94c1902Sdrh    7,120, 56,121,  0,  0,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 11,
378*f94c1902Sdrh    7,  4, 19, 19,  1,120, 55,121,120,121,122, 15, 14,  6,  4, 19, 21, 18,120,
379*f94c1902Sdrh   54,121,102,111,117,114, 85,102,119,  9,  5,  4, 19,  1,  1,120, 53,121,  3,
380*f94c1902Sdrh    4, 18,  4,  4, 19, 23,  5,120, 52,121, 98,117, 98, 98, 97,  0,  0,128,  0,
381*f94c1902Sdrh    0,  0, 10,  3,  4, 19,  0, 19,120, 51,121,120,121,122, 19,  2,  4, 19,  7,
382*f94c1902Sdrh   21,120, 50,121, 64, 12,  0,  0,  0,  0,  0,  0,102,111,117,114,  9,  1,  4,
383*f94c1902Sdrh   19,  1,  1,120, 49,121,  2,  3, 13,  0,  0,  0, 26,  0, 78,  0,  1,235,  1,
384*f94c1902Sdrh  223,  1,206,  1,192,  1,168,  1,156,  1,135,  1,124,  1,101,  1, 89,  1, 67,
385*f94c1902Sdrh    1, 55,  1, 34,  1, 22,  1,  5,  0,247,  0,223,  0,211,  0,190,  0,179,  0,
386*f94c1902Sdrh  156,  0,144,  0,123,  0,113,  0, 90,  0, 78,  0,  0,  0,  0,  0,  0,  0,  0,
387*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 53,  4, 21,  1,  1,120, 53, 51,
388*f94c1902Sdrh  121,  2,  3, 21, 52,  4, 21,  7, 23,120, 53, 50,121,  0,  0,  0,  0,  0,  0,
389*f94c1902Sdrh    0,  0, 98,117, 98, 98, 97,  8, 51,  3, 21,  1,120, 53, 49,121, 15, 19, 50,
390*f94c1902Sdrh    4, 21, 18,  7,120, 53, 48,121, 85,102,119, 64, 12,  0,  0,  0,  0,  0,  0,
391*f94c1902Sdrh   10, 49,  4, 21,  1,  1,120, 52, 57,121,  4,  2, 21, 48,  4, 21, 23,  7,120,
392*f94c1902Sdrh   52, 56,121, 98,117, 98, 98, 97,  0,  0,  0,  0,  0,  0,  0,  0,  9, 47,  4,
393*f94c1902Sdrh   21,  0,  1,120, 52, 55,121, 15, 19, 46,  4, 21,  7, 18,120, 52, 54,121, 64,
394*f94c1902Sdrh   12,  0,  0,  0,  0,  0,  0, 85,102,119, 10, 45,  4, 21,  1,  1,120, 52, 53,
395*f94c1902Sdrh  121,  2,  4, 22, 44,  4, 21,  7,  5,120, 52, 52,121,  0,  0,  0,  0,  0,  0,
396*f94c1902Sdrh    0,  0,  0,  0,128,  0,  0,  0, 12, 43,  4, 21,  1, 19,120, 52, 51,121, 15,
397*f94c1902Sdrh  120,121,122, 15, 42,  4, 21, 18, 21,120, 52, 50,121, 85,102,119,102,111,117,
398*f94c1902Sdrh  114, 10, 41,  4, 21,  1,  1,120, 52, 49,121,  4,  3, 19, 40,  4, 21,  5, 23,
399*f94c1902Sdrh  120, 52, 48,121,  0,  0,128,  0,  0,  0, 98,117, 98, 98, 97, 10, 39,  3, 21,
400*f94c1902Sdrh   19,120, 51, 57,121,120,121,122, 20, 38,  4, 21, 21,  7,120, 51, 56,121,102,
401*f94c1902Sdrh  111,117,114, 64, 12,  0,  0,  0,  0,  0,  0, 10, 37,  4, 21,  1,  1,120, 51,
402*f94c1902Sdrh   55,121,  3,  2, 21, 36,  4, 21, 23,  7,120, 51, 54,121, 98,117, 98, 98, 97,
403*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  9, 35,  4, 21,  0,  1,120, 51, 53,121, 15,
404*f94c1902Sdrh   19, 34,  4, 21,  7, 18,120, 51, 52,121, 64, 12,  0,  0,  0,  0,  0,  0, 85,
405*f94c1902Sdrh  102,119, 10, 33,  4, 21,  1,  1,120, 51, 51,121,  2,  4, 22, 32,  4, 21,  7,
406*f94c1902Sdrh    5,120, 51, 50,121,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,  0,  0,  0,
407*f94c1902Sdrh   12, 31,  4, 21,  1, 19,120, 51, 49,121, 15,120,121,122, 15, 30,  4, 21, 18,
408*f94c1902Sdrh   21,120, 51, 48,121, 85,102,119,102,111,117,114, 10, 29,  4, 21,  1,  1,120,
409*f94c1902Sdrh   50, 57,121,  4,  3, 19, 28,  4, 21,  5, 23,120, 50, 56,121,  0,  0,128,  0,
410*f94c1902Sdrh    0,  0, 98,117, 98, 98, 97, 13,  0,  0,  0, 11,  1, 67,  0,  1,234,  1,221,
411*f94c1902Sdrh    1,200,  1,188,  1,171,  1,157,  1,133,  1,121,  1,100,  1, 90,  1, 67,  0,
412*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
413*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
414*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
415*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
416*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
417*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
418*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
419*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
420*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
421*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
422*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
423*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
424*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
425*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
426*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
427*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0, 21, 64,  4, 21,  7, 23,120, 54, 52,121,  0,  0,
428*f94c1902Sdrh    0,  0,  0,  0,  0,  0, 98,117, 98, 98, 97,  8, 63,  3, 21,  1,120, 54, 51,
429*f94c1902Sdrh  121, 15, 19, 62,  4, 21, 18,  7,120, 54, 50,121, 85,102,119, 64, 12,  0,  0,
430*f94c1902Sdrh    0,  0,  0,  0, 10, 61,  4, 21,  1,  1,120, 54, 49,121,  4,  2, 22, 60,  4,
431*f94c1902Sdrh   21,  5,  7,120, 54, 48,121,  0,  0,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,
432*f94c1902Sdrh    0,  0, 12, 59,  4, 21, 19,  1,120, 53, 57,121,120,121,122, 15, 15, 58,  4,
433*f94c1902Sdrh   21, 21, 18,120, 53, 56,121,102,111,117,114, 85,102,119, 10, 57,  4, 21,  1,
434*f94c1902Sdrh    1,120, 53, 55,121,  3,  4, 19, 56,  4, 21, 23,  5,120, 53, 54,121, 98,117,
435*f94c1902Sdrh   98, 98, 97,  0,  0,128,  0,  0,  0, 11, 55,  4, 21,  0, 19,120, 53, 53,121,
436*f94c1902Sdrh  120,121,122, 20, 54,  4, 21,  7, 21,120, 53, 52,121, 64, 12,  0,  0,  0,  0,
437*f94c1902Sdrh    0,  0,102,111,117,114, 10,  0,  0,  0, 45,  0,112,  0,  1,247,  1,238,  1,
438*f94c1902Sdrh  229,  1,220,  1,211,  1,202,  1,193,  1,184,  1,175,  1,166,  1,159,  1,150,
439*f94c1902Sdrh    1,141,  1,132,  1,123,  1,114,  1,105,  1, 96,  1, 87,  1, 78,  1, 69,  1,
440*f94c1902Sdrh   61,  1, 52,  1, 43,  1, 34,  1, 25,  1, 16,  1,  7,  0,254,  0,245,  0,236,
441*f94c1902Sdrh    0,227,  0,219,  0,210,  0,201,  0,192,  0,183,  0,174,  0,165,  0,156,  0,
442*f94c1902Sdrh  147,  0,138,  0,129,  0,121,  0,112,  0,103,  0,  0,  0,  0,  0,  0,  9,120,
443*f94c1902Sdrh   53, 49,121, 51,  8,  3, 21,  1,120, 53, 48,121, 50,  7,  3, 19,  1,120, 52,
444*f94c1902Sdrh  121,  4,  8,  3, 21,  1,120, 52, 57,121, 49,  8,  3, 21,  1,120, 52, 56,121,
445*f94c1902Sdrh   48,  8,  3, 21,  1,120, 52, 55,121, 47,  8,  3, 21,  1,120, 52, 54,121, 46,
446*f94c1902Sdrh    8,  3, 21,  1,120, 52, 53,121, 45,  8,  3, 21,  1,120, 52, 52,121, 44,  8,
447*f94c1902Sdrh    3, 21,  1,120, 52, 51,121, 43,  8,  3, 21,  1,120, 52, 50,121, 42,  8,  3,
448*f94c1902Sdrh   21,  1,120, 52, 49,121, 41,  8,  3, 21,  1,120, 52, 48,121, 40,  7,  3, 19,
449*f94c1902Sdrh    1,120, 51,121,  3,  8,  3, 21,  1,120, 51, 57,121, 39,  8,  3, 21,  1,120,
450*f94c1902Sdrh   51, 56,121, 38,  8,  3, 21,  1,120, 51, 55,121, 37,  8,  3, 21,  1,120, 51,
451*f94c1902Sdrh   54,121, 36,  8,  3, 21,  1,120, 51, 53,121, 35,  8,  3, 21,  1,120, 51, 52,
452*f94c1902Sdrh  121, 34,  8,  3, 21,  1,120, 51, 51,121, 33,  8,  3, 21,  1,120, 51, 50,121,
453*f94c1902Sdrh   32,  8,  3, 21,  1,120, 51, 49,121, 31,  8,  3, 21,  1,120, 51, 48,121, 30,
454*f94c1902Sdrh    7,  3, 19,  1,120, 50,121,  2,  8,  3, 21,  1,120, 50, 57,121, 29,  8,  3,
455*f94c1902Sdrh   21,  1,120, 50, 56,121, 28,  8,  3, 21,  1,120, 50, 55,121, 27,  8,  3, 21,
456*f94c1902Sdrh    1,120, 50, 54,121, 26,  8,  3, 21,  1,120, 50, 53,121, 25,  8,  3, 21,  1,
457*f94c1902Sdrh  120, 50, 52,121, 24,  8,  3, 21,  1,120, 50, 51,121, 23,  8,  3, 21,  1,120,
458*f94c1902Sdrh   50, 50,121, 22,  8,  3, 21,  1,120, 50, 49,121, 21,  8,  3, 21,  1,120, 50,
459*f94c1902Sdrh   48,121, 20,  6,  3, 19,  9,120, 49,121,  8,  3, 21,  1,120, 49, 57,121, 19,
460*f94c1902Sdrh    8,  3, 21,  1,120, 49, 56,121, 18,  8,  3, 21,  1,120, 49, 55,121, 17,  8,
461*f94c1902Sdrh    3, 21,  1,120, 49, 54,121, 16,  8,  3, 21,  1,120, 49, 53,121, 15,  8,  3,
462*f94c1902Sdrh   21,  1,120, 49, 52,121, 14,  8,  3, 21,  1,120, 49, 51,121, 13,  8,  3, 21,
463*f94c1902Sdrh    1,120, 49, 50,121, 12,  8,  3, 21,  1,120, 49, 49,121, 11,  8,  3, 21,  1,
464*f94c1902Sdrh  120, 49, 48,121, 10, 10,  0,  0,  0, 18,  1, 99,  0,  1,247,  1,238,  1,229,
465*f94c1902Sdrh    1,220,  1,211,  1,202,  1,193,  1,184,  1,176,  1,167,  1,158,  1,149,  1,
466*f94c1902Sdrh  140,  1,131,  1,123,  1,115,  1,107,  1, 99,  0,  0,  0,  0,  0,  0,  0,  0,
467*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
468*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
469*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
470*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
471*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
472*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
473*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
474*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
475*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
476*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
477*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
478*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
479*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
480*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
481*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
482*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,
483*f94c1902Sdrh    3, 19,  1,120, 57,121,  9,  7,  3, 19,  1,120, 56,121,  8,  7,  3, 19,  1,
484*f94c1902Sdrh  120, 55,121,  7,  7,  3, 19,  1,120, 54,121,  6,  8,  3, 21,  1,120, 54, 52,
485*f94c1902Sdrh  121, 64,  8,  3, 21,  1,120, 54, 51,121, 63,  8,  3, 21,  1,120, 54, 50,121,
486*f94c1902Sdrh   62,  8,  3, 21,  1,120, 54, 49,121, 61,  8,  3, 21,  1,120, 54, 48,121, 60,
487*f94c1902Sdrh    7,  3, 19,  1,120, 53,121,  5,  8,  3, 21,  1,120, 53, 57,121, 59,  8,  3,
488*f94c1902Sdrh   21,  1,120, 53, 56,121, 58,  8,  3, 21,  1,120, 53, 55,121, 57,  8,  3, 21,
489*f94c1902Sdrh    1,120, 53, 54,121, 56,  8,  3, 21,  1,120, 53, 53,121, 55,  8,  3, 21,  1,
490*f94c1902Sdrh  120, 53, 52,121, 54,  8,  3, 21,  1,120, 53, 51,121, 53,  8,  3, 21,  1,120,
491*f94c1902Sdrh   53, 50,121, 52, 13,  0,  0,  0, 23,  0, 54,  0,  1,240,  1,214,  1,197,  1,
492*f94c1902Sdrh  172,  1,156,  1,135,  1,117,  1, 89,  1, 73,  1, 55,  1, 41,  1, 14,  0,254,
493*f94c1902Sdrh    0,228,  0,211,  0,186,  0,170,  0,149,  0,131,  0,110,  0, 94,  0, 69,  0,
494*f94c1902Sdrh   54, 13, 23,  4,  7,  0,  1, 64, 57, 76,204,204,204,204,205, 15, 23, 22,  4,
495*f94c1902Sdrh    7,  7, 18, 64, 56, 51, 51, 51, 51, 51, 52, 64, 12,  0,  0,  0,  0,  0,  0,
496*f94c1902Sdrh   85,102,119, 14, 21,  4,  7,  1,  1, 64, 55, 25,153,153,153,153,154,  2,  4,
497*f94c1902Sdrh   19, 20,  4,  1,  7,  5, 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,  0,
498*f94c1902Sdrh    0,  0, 16, 19,  4,  7,  1, 19, 64, 52,230,102,102,102,102,103, 15,120,121,
499*f94c1902Sdrh  122, 19, 18,  4,  7, 18, 21, 64, 51,204,204,204,204,204,205, 85,102,119,102,
500*f94c1902Sdrh  111,117,114, 14, 17,  4,  7,  1,  1, 64, 50,179, 51, 51, 51, 51, 52,  4,  3,
501*f94c1902Sdrh   23, 16,  4,  7, 23,  5, 64, 49,153,153,153,153,153,154, 98,117, 98, 98, 97,
502*f94c1902Sdrh    0,  0,128,  0,  0,  0, 15, 15,  4,  7,  0, 19, 64, 48,128,  0,  0,  0,  0,
503*f94c1902Sdrh    0,120,121,122, 24, 14,  4,  7,  7, 21, 64, 46,204,204,204,204,204,206, 64,
504*f94c1902Sdrh   12,  0,  0,  0,  0,  0,  0,102,111,117,114, 14, 13,  4,  7,  1,  1, 64, 44,
505*f94c1902Sdrh  153,153,153,153,153,154,  2,  3, 25, 12,  4,  7,  7, 23, 64, 42,102,102,102,
506*f94c1902Sdrh  102,102,103,  0,  0,  0,  0,  0,  0,  0,  0, 98,117, 98, 98, 97, 12, 11,  3,
507*f94c1902Sdrh    7,  1, 64, 40, 51, 51, 51, 51, 51, 52, 15, 16, 10,  4,  1, 18,  7, 11, 85,
508*f94c1902Sdrh  102,119, 64, 12,  0,  0,  0,  0,  0,  0, 14,  9,  4,  7,  1,  1, 64, 35,204,
509*f94c1902Sdrh  204,204,204,204,205,  4,  2, 26,  8,  4,  7,  5,  7, 64, 33,153,153,153,153,
510*f94c1902Sdrh  153,154,  0,  0,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 16,  7,  4,
511*f94c1902Sdrh    7, 19,  1, 64, 30,204,204,204,204,204,206,120,121,122, 15, 19,  6,  4,  7,
512*f94c1902Sdrh   21, 18, 64, 26,102,102,102,102,102,103,102,111,117,114, 85,102,119, 14,  5,
513*f94c1902Sdrh    4,  7,  1,  1, 64, 22,  0,  0,  0,  0,  0,  0,  3,  4, 23,  4,  4,  7, 23,
514*f94c1902Sdrh    5, 64, 17,153,153,153,153,153,154, 98,117, 98, 98, 97,  0,  0,128,  0,  0,
515*f94c1902Sdrh    0, 15,  3,  4,  7,  0, 19, 64, 10,102,102,102,102,102,103,120,121,122, 24,
516*f94c1902Sdrh    2,  4,  7,  7, 21, 64,  1,153,153,153,153,153,154, 64, 12,  0,  0,  0,  0,
517*f94c1902Sdrh    0,  0,102,111,117,114, 14,  1,  4,  7,  1,  1, 63,241,153,153,153,153,153,
518*f94c1902Sdrh  154,  2,  3, 13,  0,  0,  0, 22,  0, 68,  0,  1,229,  1,213,  1,187,  1,171,
519*f94c1902Sdrh    1,146,  1,130,  1,116,  1, 98,  1, 70,  1, 54,  1, 29,  1, 14,  0,243,  0,
520*f94c1902Sdrh  227,  0,201,  0,185,  0,167,  0,151,  0,130,  0,112,  0, 84,  0, 68,  0,  0,
521*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 45,  4,  7,  1,
522*f94c1902Sdrh    1, 64, 72,192,  0,  0,  0,  0,  1,  2,  4, 26, 44,  4,  7,  7,  5, 64, 72,
523*f94c1902Sdrh   51, 51, 51, 51, 51, 52,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,  0,  0,
524*f94c1902Sdrh    0, 16, 43,  4,  7,  1, 19, 64, 71,166,102,102,102,102,103, 15,120,121,122,
525*f94c1902Sdrh   19, 42,  4,  7, 18, 21, 64, 71, 25,153,153,153,153,154, 85,102,119,102,111,
526*f94c1902Sdrh  117,114, 14, 41,  4,  7,  1,  1, 64, 70,140,204,204,204,204,205,  4,  3, 16,
527*f94c1902Sdrh   40,  4,  1,  5, 23, 44,  0,  0,128,  0,  0,  0, 98,117, 98, 98, 97, 14, 39,
528*f94c1902Sdrh    3,  7, 19, 64, 69,115, 51, 51, 51, 51, 52,120,121,122, 24, 38,  4,  7, 21,
529*f94c1902Sdrh    7, 64, 68,230,102,102,102,102,103,102,111,117,114, 64, 12,  0,  0,  0,  0,
530*f94c1902Sdrh    0,  0, 14, 37,  4,  7,  1,  1, 64, 68, 89,153,153,153,153,154,  3,  2, 25,
531*f94c1902Sdrh   36,  4,  7, 23,  7, 64, 67,204,204,204,204,204,205, 98,117, 98, 98, 97,  0,
532*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0, 13, 35,  4,  7,  0,  1, 64, 67, 64,  0,  0,  0,
533*f94c1902Sdrh    0,  0, 15, 23, 34,  4,  7,  7, 18, 64, 66,179, 51, 51, 51, 51, 52, 64, 12,
534*f94c1902Sdrh    0,  0,  0,  0,  0,  0, 85,102,119, 14, 33,  4,  7,  1,  1, 64, 66, 38,102,
535*f94c1902Sdrh  102,102,102,103,  2,  4, 26, 32,  4,  7,  7,  5, 64, 65,153,153,153,153,153,
536*f94c1902Sdrh  154,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,  0,  0,  0, 16, 31,  4,  7,
537*f94c1902Sdrh    1, 19, 64, 65, 12,204,204,204,204,205, 15,120,121,122, 12, 30,  4,  1, 18,
538*f94c1902Sdrh   21, 33, 85,102,119,102,111,117,114, 14, 29,  4,  7,  1,  1, 64, 63,230,102,
539*f94c1902Sdrh  102,102,102,103,  4,  3, 23, 28,  4,  7,  5, 23, 64, 62,204,204,204,204,204,
540*f94c1902Sdrh  206,  0,  0,128,  0,  0,  0, 98,117, 98, 98, 97, 14, 27,  3,  7, 19, 64, 61,
541*f94c1902Sdrh  179, 51, 51, 51, 51, 52,120,121,122, 24, 26,  4,  7, 21,  7, 64, 60,153,153,
542*f94c1902Sdrh  153,153,153,154,102,111,117,114, 64, 12,  0,  0,  0,  0,  0,  0, 14, 25,  4,
543*f94c1902Sdrh    7,  1,  1, 64, 59,128,  0,  0,  0,  0,  1,  3,  2, 25, 24,  4,  7, 23,  7,
544*f94c1902Sdrh   64, 58,102,102,102,102,102,103, 98,117, 98, 98, 97,  0,  0,  0,  0,  0,  0,
545*f94c1902Sdrh    0,  0, 13,  0,  0,  0, 19,  0,121,  0,  1,231,  1,216,  1,189,  1,173,  1,
546*f94c1902Sdrh  148,  1,134,  1,107,  1, 91,  1, 65,  1, 48,  1, 23,  1,  7,  0,242,  0,224,
547*f94c1902Sdrh    0,203,  0,187,  0,162,  0,148,  0,121,  0,  0,  0,  0,  0,  0,  0,  0,  0,
548*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
549*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
550*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
551*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0, 25, 64,  4,  7,  7, 23, 64, 81,153,153,
552*f94c1902Sdrh  153,153,153,154,  0,  0,  0,  0,  0,  0,  0,  0, 98,117, 98, 98, 97, 12, 63,
553*f94c1902Sdrh    3,  7,  1, 64, 81, 83, 51, 51, 51, 51, 52, 15, 23, 62,  4,  7, 18,  7, 64,
554*f94c1902Sdrh   81, 12,204,204,204,204,205, 85,102,119, 64, 12,  0,  0,  0,  0,  0,  0, 14,
555*f94c1902Sdrh   61,  4,  7,  1,  1, 64, 80,198,102,102,102,102,103,  4,  2, 19, 60,  4,  1,
556*f94c1902Sdrh    5,  7, 66,  0,  0,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 16, 59,
557*f94c1902Sdrh    4,  7, 19,  1, 64, 80, 57,153,153,153,153,154,120,121,122, 15, 19, 58,  4,
558*f94c1902Sdrh    7, 21, 18, 64, 79,230,102,102,102,102,103,102,111,117,114, 85,102,119, 14,
559*f94c1902Sdrh   57,  4,  7,  1,  1, 64, 79, 89,153,153,153,153,154,  3,  4, 23, 56,  4,  7,
560*f94c1902Sdrh   23,  5, 64, 78,204,204,204,204,204,206, 98,117, 98, 98, 97,  0,  0,128,  0,
561*f94c1902Sdrh    0,  0, 15, 55,  4,  7,  0, 19, 64, 78, 64,  0,  0,  0,  0,  1,120,121,122,
562*f94c1902Sdrh   24, 54,  4,  7,  7, 21, 64, 77,179, 51, 51, 51, 51, 52, 64, 12,  0,  0,  0,
563*f94c1902Sdrh    0,  0,  0,102,111,117,114, 14, 53,  4,  7,  1,  1, 64, 77, 38,102,102,102,
564*f94c1902Sdrh  102,103,  2,  3, 25, 52,  4,  7,  7, 23, 64, 76,153,153,153,153,153,154,  0,
565*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0, 98,117, 98, 98, 97, 12, 51,  3,  7,  1, 64, 76,
566*f94c1902Sdrh   12,204,204,204,204,205, 15, 23, 50,  4,  7, 18,  7, 64, 75,128,  0,  0,  0,
567*f94c1902Sdrh    0,  1, 85,102,119, 64, 12,  0,  0,  0,  0,  0,  0, 14, 49,  4,  7,  1,  1,
568*f94c1902Sdrh   64, 74,243, 51, 51, 51, 51, 52,  4,  2, 25, 48,  4,  7, 23,  7, 64, 74,102,
569*f94c1902Sdrh  102,102,102,102,103, 98,117, 98, 98, 97,  0,  0,  0,  0,  0,  0,  0,  0, 13,
570*f94c1902Sdrh   47,  4,  7,  0,  1, 64, 73,217,153,153,153,153,154, 15, 23, 46,  4,  7,  7,
571*f94c1902Sdrh   18, 64, 73, 76,204,204,204,204,205, 64, 12,  0,  0,  0,  0,  0,  0, 85,102,
572*f94c1902Sdrh  119, 10,  0,  0,  0, 34,  0, 92,  0,  1,244,  1,231,  1,218,  1,205,  1,192,
573*f94c1902Sdrh    1,179,  1,166,  1,153,  1,140,  1,134,  1,121,  1,108,  1, 95,  1, 82,  1,
574*f94c1902Sdrh   69,  1, 56,  1, 43,  1, 30,  1, 17,  1, 11,  0,254,  0,241,  0,228,  0,215,
575*f94c1902Sdrh    0,202,  0,189,  0,176,  0,163,  0,150,  0,144,  0,131,  0,118,  0,105,  0,
576*f94c1902Sdrh   92,  0, 79,  0,  0,  0,  0, 13, 64, 67, 64,  0,  0,  0,  0,  0, 35, 12,  3,
577*f94c1902Sdrh    7,  1, 64, 66,179, 51, 51, 51, 51, 52, 34, 12,  3,  7,  1, 64, 66, 38,102,
578*f94c1902Sdrh  102,102,102,103, 33, 12,  3,  7,  1, 64, 65,153,153,153,153,153,154, 32, 12,
579*f94c1902Sdrh    3,  7,  1, 64, 65, 12,204,204,204,204,205, 31,  5,  3,  1,  1, 33, 30, 12,
580*f94c1902Sdrh    3,  7,  1, 64, 63,230,102,102,102,102,103, 29, 12,  3,  7,  1, 64, 62,204,
581*f94c1902Sdrh  204,204,204,204,206, 28, 12,  3,  7,  1, 64, 61,179, 51, 51, 51, 51, 52, 27,
582*f94c1902Sdrh   12,  3,  7,  1, 64, 60,153,153,153,153,153,154, 26, 12,  3,  7,  1, 64, 59,
583*f94c1902Sdrh  128,  0,  0,  0,  0,  1, 25, 12,  3,  7,  1, 64, 58,102,102,102,102,102,103,
584*f94c1902Sdrh   24, 12,  3,  7,  1, 64, 57, 76,204,204,204,204,205, 23, 12,  3,  7,  1, 64,
585*f94c1902Sdrh   56, 51, 51, 51, 51, 51, 52, 22, 12,  3,  7,  1, 64, 55, 25,153,153,153,153,
586*f94c1902Sdrh  154, 21,  5,  3,  1,  1, 22, 20, 12,  3,  7,  1, 64, 52,230,102,102,102,102,
587*f94c1902Sdrh  103, 19, 12,  3,  7,  1, 64, 51,204,204,204,204,204,205, 18, 12,  3,  7,  1,
588*f94c1902Sdrh   64, 50,179, 51, 51, 51, 51, 52, 17, 12,  3,  7,  1, 64, 49,153,153,153,153,
589*f94c1902Sdrh  153,154, 16, 12,  3,  7,  1, 64, 48,128,  0,  0,  0,  0,  0, 15, 12,  3,  7,
590*f94c1902Sdrh    1, 64, 46,204,204,204,204,204,206, 14, 12,  3,  7,  1, 64, 44,153,153,153,
591*f94c1902Sdrh  153,153,154, 13, 12,  3,  7,  1, 64, 42,102,102,102,102,102,103, 12, 12,  3,
592*f94c1902Sdrh    7,  1, 64, 40, 51, 51, 51, 51, 51, 52, 11,  5,  3,  1,  1, 11, 10, 12,  3,
593*f94c1902Sdrh    7,  1, 64, 35,204,204,204,204,204,205,  9, 12,  3,  7,  1, 64, 33,153,153,
594*f94c1902Sdrh  153,153,153,154,  8, 12,  3,  7,  1, 64, 30,204,204,204,204,204,206,  7, 12,
595*f94c1902Sdrh    3,  7,  1, 64, 26,102,102,102,102,102,103,  6, 12,  3,  7,  1, 64, 22,  0,
596*f94c1902Sdrh    0,  0,  0,  0,  0,  5, 12,  3,  7,  1, 64, 17,153,153,153,153,153,154,  4,
597*f94c1902Sdrh   12,  3,  7,  1, 64, 10,102,102,102,102,102,103,  3, 12,  3,  7,  1, 64,  1,
598*f94c1902Sdrh  153,153,153,153,153,154,  2, 11,  3,  7,  9, 63,241,153,153,153,153,153,154,
599*f94c1902Sdrh   10,  0,  0,  0, 29,  0,149,  0,  1,243,  1,230,  1,217,  1,204,  1,198,  1,
600*f94c1902Sdrh  185,  1,172,  1,159,  1,146,  1,133,  1,120,  1,107,  1, 94,  1, 81,  1, 68,
601*f94c1902Sdrh    1, 55,  1, 42,  1, 29,  1, 16,  1,  3,  0,246,  0,233,  0,220,  0,207,  0,
602*f94c1902Sdrh  201,  0,188,  0,175,  0,162,  0,149,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
603*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
604*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
605*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
606*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  3,  7,
607*f94c1902Sdrh    1, 64, 81,153,153,153,153,153,154, 64, 12,  3,  7,  1, 64, 81, 83, 51, 51,
608*f94c1902Sdrh   51, 51, 52, 63, 12,  3,  7,  1, 64, 81, 12,204,204,204,204,205, 62, 12,  3,
609*f94c1902Sdrh    7,  1, 64, 80,198,102,102,102,102,103, 61,  5,  3,  1,  1, 66, 60, 12,  3,
610*f94c1902Sdrh    7,  1, 64, 80, 57,153,153,153,153,154, 59, 12,  3,  7,  1, 64, 79,230,102,
611*f94c1902Sdrh  102,102,102,103, 58, 12,  3,  7,  1, 64, 79, 89,153,153,153,153,154, 57, 12,
612*f94c1902Sdrh    3,  7,  1, 64, 78,204,204,204,204,204,206, 56, 12,  3,  7,  1, 64, 78, 64,
613*f94c1902Sdrh    0,  0,  0,  0,  1, 55, 12,  3,  7,  1, 64, 77,179, 51, 51, 51, 51, 52, 54,
614*f94c1902Sdrh   12,  3,  7,  1, 64, 77, 38,102,102,102,102,103, 53, 12,  3,  7,  1, 64, 76,
615*f94c1902Sdrh  153,153,153,153,153,154, 52, 12,  3,  7,  1, 64, 76, 12,204,204,204,204,205,
616*f94c1902Sdrh   51, 12,  3,  7,  1, 64, 75,128,  0,  0,  0,  0,  1, 50, 12,  3,  7,  1, 64,
617*f94c1902Sdrh   74,243, 51, 51, 51, 51, 52, 49, 12,  3,  7,  1, 64, 74,102,102,102,102,102,
618*f94c1902Sdrh  103, 48, 12,  3,  7,  1, 64, 73,217,153,153,153,153,154, 47, 12,  3,  7,  1,
619*f94c1902Sdrh   64, 73, 76,204,204,204,204,205, 46, 12,  3,  7,  1, 64, 72,192,  0,  0,  0,
620*f94c1902Sdrh    0,  1, 45, 12,  3,  7,  1, 64, 72, 51, 51, 51, 51, 51, 52, 44, 12,  3,  7,
621*f94c1902Sdrh    1, 64, 71,166,102,102,102,102,103, 43, 12,  3,  7,  1, 64, 71, 25,153,153,
622*f94c1902Sdrh  153,153,154, 42, 12,  3,  7,  1, 64, 70,140,204,204,204,204,205, 41,  5,  3,
623*f94c1902Sdrh    1,  1, 44, 40, 12,  3,  7,  1, 64, 69,115, 51, 51, 51, 51, 52, 39, 12,  3,
624*f94c1902Sdrh    7,  1, 64, 68,230,102,102,102,102,103, 38, 12,  3,  7,  1, 64, 68, 89,153,
625*f94c1902Sdrh  153,153,153,154, 37, 12,  3,  7,  1, 64, 67,204,204,204,204,204,205, 36, 10,
626*f94c1902Sdrh    0,  0,  0, 41,  0,103,  0,  1,250,  1,235,  1,227,  1,218,  1,211,  1,202,
627*f94c1902Sdrh    1,192,  1,179,  1,172,  1,157,  1,149,  1,141,  1,132,  1,125,  1,116,  1,
628*f94c1902Sdrh  106,  1, 93,  1, 86,  1, 74,  1, 63,  1, 47,  1, 40,  1, 31,  1, 16,  1,  8,
629*f94c1902Sdrh    0,255,  0,248,  0,239,  0,229,  0,216,  0,209,  0,197,  0,186,  0,174,  0,
630*f94c1902Sdrh  158,  0,151,  0,136,  0,128,  0,119,  0,112,  0,103,  0, 93,  0,  0,  0,  0,
631*f94c1902Sdrh   10, 55, 44, 78, 85, 76, 76,  8,  2, 25, 52, 54, 44, 51, 46, 53,  6,  2, 21,
632*f94c1902Sdrh   52, 53, 44, 50,  8,  2, 25, 52, 52, 44, 48, 46, 48,  7,  2, 23, 52, 51, 44,
633*f94c1902Sdrh   49, 53, 14,  2, 37, 52, 50, 44, 88, 39, 53, 53, 54, 54, 55, 55, 39,  6,  2,
634*f94c1902Sdrh   21, 52, 49, 44, 52, 15,  2, 39, 52, 48, 44, 50, 49, 52, 55, 52, 56, 51, 54,
635*f94c1902Sdrh   52, 56, 11,  2, 31, 52, 44, 39, 98,117, 98, 98, 97, 39, 10,  2, 29, 51, 57,
636*f94c1902Sdrh   44, 39,120,121,122, 39, 11,  2, 31, 51, 56, 44, 39,102,111,117,114, 39,  6,
637*f94c1902Sdrh    2, 21, 51, 55, 44, 51, 12,  2, 33, 51, 54, 44, 39, 98,117, 98, 98, 97, 39,
638*f94c1902Sdrh    9,  2, 27, 51, 53, 44, 78, 85, 76, 76,  8,  2, 25, 51, 52, 44, 51, 46, 53,
639*f94c1902Sdrh    6,  2, 21, 51, 51, 44, 50,  8,  2, 25, 51, 50, 44, 48, 46, 48,  7,  2, 23,
640*f94c1902Sdrh   51, 49, 44, 49, 53, 14,  2, 37, 51, 48, 44, 88, 39, 53, 53, 54, 54, 55, 55,
641*f94c1902Sdrh   39,  8,  2, 25, 51, 44, 78, 85, 76, 76,  6,  2, 21, 50, 57, 44, 52, 15,  2,
642*f94c1902Sdrh   39, 50, 56, 44, 50, 49, 52, 55, 52, 56, 51, 54, 52, 56, 10,  2, 29, 50, 55,
643*f94c1902Sdrh   44, 39,120,121,122, 39, 11,  2, 31, 50, 54, 44, 39,102,111,117,114, 39,  6,
644*f94c1902Sdrh    2, 21, 50, 53, 44, 51, 12,  2, 33, 50, 52, 44, 39, 98,117, 98, 98, 97, 39,
645*f94c1902Sdrh    9,  2, 27, 50, 51, 44, 78, 85, 76, 76,  8,  2, 25, 50, 50, 44, 51, 46, 53,
646*f94c1902Sdrh    6,  2, 21, 50, 49, 44, 50,  8,  2, 25, 50, 48, 44, 48, 46, 48,  7,  2, 23,
647*f94c1902Sdrh   50, 44, 51, 46, 53,  7,  2, 23, 49, 57, 44, 49, 53, 14,  2, 37, 49, 56, 44,
648*f94c1902Sdrh   88, 39, 53, 53, 54, 54, 55, 55, 39,  6,  2, 21, 49, 55, 44, 52, 12,  2, 33,
649*f94c1902Sdrh   49, 54, 44, 39, 98,117, 98, 98, 97, 39,  9,  2, 27, 49, 53, 44, 78, 85, 76,
650*f94c1902Sdrh   76,  8,  2, 25, 49, 52, 44, 51, 46, 53,  6,  2, 21, 49, 51, 44, 50,  8,  2,
651*f94c1902Sdrh   25, 49, 50, 44, 48, 46, 48,  7,  2, 23, 49, 49, 44, 49, 53, 14,  2, 37, 49,
652*f94c1902Sdrh   48, 44, 88, 39, 53, 53, 54, 54, 55, 55, 39,  5,  2, 19, 49, 44, 50, 10,  0,
653*f94c1902Sdrh    0,  0, 22,  1, 32,  0,  1,243,  1,236,  1,230,  1,215,  1,207,  1,198,  1,
654*f94c1902Sdrh  191,  1,182,  1,172,  1,159,  1,152,  1,140,  1,129,  1,118,  1,102,  1, 95,
655*f94c1902Sdrh    1, 80,  1, 72,  1, 63,  1, 53,  1, 38,  1, 32,  0,  0,  0,  0,  0,  0,  0,
656*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
657*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
658*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
659*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
660*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
661*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
662*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
663*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
664*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
665*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
666*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
667*f94c1902Sdrh    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
668*f94c1902Sdrh    0,  5,  2, 19, 57, 44, 52, 14,  2, 37, 56, 44, 50, 49, 52, 55, 52, 56, 51,
669*f94c1902Sdrh   54, 52, 56,  9,  2, 27, 55, 44, 39,120,121,122, 39,  8,  2, 25, 54, 52, 44,
670*f94c1902Sdrh   48, 46, 48,  7,  2, 23, 54, 51, 44, 49, 53, 14,  2, 37, 54, 50, 44, 88, 39,
671*f94c1902Sdrh   53, 53, 54, 54, 55, 55, 39,  6,  2, 21, 54, 49, 44, 52, 15,  2, 39, 54, 48,
672*f94c1902Sdrh   44, 50, 49, 52, 55, 52, 56, 51, 54, 52, 56, 10,  2, 29, 54, 44, 39,102,111,
673*f94c1902Sdrh  117,114, 39, 10,  2, 29, 53, 57, 44, 39,120,121,122, 39, 11,  2, 31, 53, 56,
674*f94c1902Sdrh   44, 39,102,111,117,114, 39,  6,  2, 21, 53, 55, 44, 51, 12,  2, 33, 53, 54,
675*f94c1902Sdrh   44, 39, 98,117, 98, 98, 97, 39,  9,  2, 27, 53, 53, 44, 78, 85, 76, 76,  8,
676*f94c1902Sdrh    2, 25, 53, 52, 44, 51, 46, 53,  6,  2, 21, 53, 51, 44, 50,  8,  2, 25, 53,
677*f94c1902Sdrh   50, 44, 48, 46, 48,  7,  2, 23, 53, 49, 44, 49, 53, 14,  2, 37, 53, 48, 44,
678*f94c1902Sdrh   88, 39, 53, 53, 54, 54, 55, 55, 39,  5,  2, 19, 53, 44, 51,  6,  2, 21, 52,
679*f94c1902Sdrh   57, 44, 52, 12,  2, 33, 52, 56, 44, 39, 98,117, 98, 98, 97, 39,
680*f94c1902Sdrh };
681*f94c1902Sdrh 
682*f94c1902Sdrh /* Help message */
683*f94c1902Sdrh static const char zHelp[] =
684*f94c1902Sdrh   "Usage:\n"
685*f94c1902Sdrh   "  sessionfuzz setup          -- Generate seed files c1.txt, c2.txt, etc.\n"
686*f94c1902Sdrh   "  sessionfuzz run FILE ...   -- Run against fuzzed changeset FILE\n"
687*f94c1902Sdrh   "  sessionfuzz run SQLAR ...  -- Run against all files in the SQL Archive\n"
688*f94c1902Sdrh ;
689*f94c1902Sdrh 
690*f94c1902Sdrh #include <stdio.h>
691*f94c1902Sdrh #include <string.h>
692*f94c1902Sdrh #include <assert.h>
693*f94c1902Sdrh #include "zlib.h"
694*f94c1902Sdrh 
695*f94c1902Sdrh /*
696*f94c1902Sdrh ** Implementation of the "sqlar_uncompress(X,SZ)" SQL function
697*f94c1902Sdrh **
698*f94c1902Sdrh ** Parameter SZ is interpreted as an integer. If it is less than or
699*f94c1902Sdrh ** equal to zero, then this function returns a copy of X. Or, if
700*f94c1902Sdrh ** SZ is equal to the size of X when interpreted as a blob, also
701*f94c1902Sdrh ** return a copy of X. Otherwise, decompress blob X using zlib
702*f94c1902Sdrh ** utility function uncompress() and return the results (another
703*f94c1902Sdrh ** blob).
704*f94c1902Sdrh */
705*f94c1902Sdrh static void sqlarUncompressFunc(
706*f94c1902Sdrh   sqlite3_context *context,
707*f94c1902Sdrh   int argc,
708*f94c1902Sdrh   sqlite3_value **argv
709*f94c1902Sdrh ){
710*f94c1902Sdrh   uLong nData;
711*f94c1902Sdrh   uLongf sz;
712*f94c1902Sdrh 
713*f94c1902Sdrh   assert( argc==2 );
714*f94c1902Sdrh   sz = sqlite3_value_int(argv[1]);
715*f94c1902Sdrh 
716*f94c1902Sdrh   if( sz<=0 || sz==(nData = sqlite3_value_bytes(argv[0])) ){
717*f94c1902Sdrh     sqlite3_result_value(context, argv[0]);
718*f94c1902Sdrh   }else{
719*f94c1902Sdrh     const Bytef *pData= sqlite3_value_blob(argv[0]);
720*f94c1902Sdrh     Bytef *pOut = sqlite3_malloc(sz);
721*f94c1902Sdrh     if( Z_OK!=uncompress(pOut, &sz, pData, nData) ){
722*f94c1902Sdrh       sqlite3_result_error(context, "error in uncompress()", -1);
723*f94c1902Sdrh     }else{
724*f94c1902Sdrh       sqlite3_result_blob(context, pOut, sz, SQLITE_TRANSIENT);
725*f94c1902Sdrh     }
726*f94c1902Sdrh     sqlite3_free(pOut);
727*f94c1902Sdrh   }
728*f94c1902Sdrh }
729*f94c1902Sdrh 
730*f94c1902Sdrh 
731*f94c1902Sdrh /* Run a chunk of SQL.  If any errors happen, print an error message
732*f94c1902Sdrh ** and exit.
733*f94c1902Sdrh */
734*f94c1902Sdrh static void runSql(sqlite3 *db, const char *zSql){
735*f94c1902Sdrh   int rc;
736*f94c1902Sdrh   char *zErr = 0;
737*f94c1902Sdrh   rc = sqlite3_exec(db, zSql, 0, 0, &zErr);
738*f94c1902Sdrh   if( rc || zErr ){
739*f94c1902Sdrh     fprintf(stderr, "SQL failed: rc=%d zErr=[%s]\n", rc, zErr);
740*f94c1902Sdrh     fprintf(stderr, "SQL: [%s]\n", zSql);
741*f94c1902Sdrh     exit(1);
742*f94c1902Sdrh   }
743*f94c1902Sdrh }
744*f94c1902Sdrh 
745*f94c1902Sdrh /*
746*f94c1902Sdrh ** Write buffer to disk
747*f94c1902Sdrh */
748*f94c1902Sdrh static void writeFile(const char *zFilename, const void *pData, int nData){
749*f94c1902Sdrh   FILE *out;
750*f94c1902Sdrh   int n;
751*f94c1902Sdrh   out = fopen(zFilename, "wb");
752*f94c1902Sdrh   if( out==0 ){
753*f94c1902Sdrh     fprintf(stderr, "cannot open \"%s\" for writing\n", zFilename);
754*f94c1902Sdrh     exit(1);
755*f94c1902Sdrh   }
756*f94c1902Sdrh   n = (int)fwrite(pData, 1, nData, out);
757*f94c1902Sdrh   fclose(out);
758*f94c1902Sdrh   if( n!=nData ){
759*f94c1902Sdrh     fprintf(stderr, "only wrote %d of %d bytes to \"%s\"\n",n,nData,zFilename);
760*f94c1902Sdrh     exit(1);
761*f94c1902Sdrh   }
762*f94c1902Sdrh }
763*f94c1902Sdrh 
764*f94c1902Sdrh /*
765*f94c1902Sdrh ** Generate a changeset from session pSess and write it to zFile
766*f94c1902Sdrh */
767*f94c1902Sdrh static void makeChangeset(const char *zFile, sqlite3_session *pSess){
768*f94c1902Sdrh   void *pChg;
769*f94c1902Sdrh   int nChg;
770*f94c1902Sdrh   int rc;
771*f94c1902Sdrh   rc = sqlite3session_changeset(pSess, &nChg, &pChg);
772*f94c1902Sdrh   if( rc ){
773*f94c1902Sdrh     fprintf(stderr, "sqlite3session_changeset() returned %d\n", rc);
774*f94c1902Sdrh     exit(1);
775*f94c1902Sdrh   }
776*f94c1902Sdrh   writeFile(zFile, pChg, nChg);
777*f94c1902Sdrh   sqlite3_free(pChg);
778*f94c1902Sdrh }
779*f94c1902Sdrh 
780*f94c1902Sdrh /*
781*f94c1902Sdrh ** Read a file from disk.  Space to hold the answer is obtained from
782*f94c1902Sdrh ** sqlite3_malloc64().
783*f94c1902Sdrh */
784*f94c1902Sdrh static void readFile(const char *zName, void **ppData, int *pnData){
785*f94c1902Sdrh   FILE *in = fopen(zName, "rb");
786*f94c1902Sdrh   long nIn;
787*f94c1902Sdrh   size_t nRead;
788*f94c1902Sdrh   char *pBuf;
789*f94c1902Sdrh   *ppData = 0;
790*f94c1902Sdrh   *pnData = 0;
791*f94c1902Sdrh   if( in==0 ){
792*f94c1902Sdrh     fprintf(stderr, "Cannot open \"%s\" for reading\n", zName);
793*f94c1902Sdrh     exit(1);
794*f94c1902Sdrh   }
795*f94c1902Sdrh   fseek(in, 0, SEEK_END);
796*f94c1902Sdrh   nIn = ftell(in);
797*f94c1902Sdrh   rewind(in);
798*f94c1902Sdrh   pBuf = sqlite3_malloc64( nIn+1 );
799*f94c1902Sdrh   if( pBuf==0 ){
800*f94c1902Sdrh     fprintf(stderr, "Failed to malloc %lld bytes\n", (sqlite3_int64)(nIn+1));
801*f94c1902Sdrh     exit(1);
802*f94c1902Sdrh   }
803*f94c1902Sdrh   nRead = fread(pBuf, 1, nIn, in);
804*f94c1902Sdrh   fclose(in);
805*f94c1902Sdrh   if( nRead!=nIn ){
806*f94c1902Sdrh     fprintf(stderr, "Read only %d of %d bytes from %s\n", (int)nRead, (int)nIn,
807*f94c1902Sdrh                     zName);
808*f94c1902Sdrh     exit(1);
809*f94c1902Sdrh   }
810*f94c1902Sdrh   pBuf[nIn] = 0;
811*f94c1902Sdrh   *pnData = nIn;
812*f94c1902Sdrh   *ppData = pBuf;
813*f94c1902Sdrh }
814*f94c1902Sdrh 
815*f94c1902Sdrh /*
816*f94c1902Sdrh ** The conflict callback
817*f94c1902Sdrh */
818*f94c1902Sdrh static int conflictCall(
819*f94c1902Sdrh   void *NotUsed,
820*f94c1902Sdrh   int eConflict,
821*f94c1902Sdrh   sqlite3_changeset_iter *p
822*f94c1902Sdrh ){
823*f94c1902Sdrh   (void)NotUsed;
824*f94c1902Sdrh   (void)p;
825*f94c1902Sdrh   printf("Conflict %d\n", eConflict);
826*f94c1902Sdrh   return SQLITE_CHANGESET_OMIT;
827*f94c1902Sdrh }
828*f94c1902Sdrh 
829*f94c1902Sdrh /*
830*f94c1902Sdrh ** Reset the database file
831*f94c1902Sdrh */
832*f94c1902Sdrh static void db_reset(sqlite3 *db){
833*f94c1902Sdrh   unsigned char *pData;
834*f94c1902Sdrh   int nData;
835*f94c1902Sdrh   int rc;
836*f94c1902Sdrh 
837*f94c1902Sdrh   nData = sizeof(aDbBytes);
838*f94c1902Sdrh   pData = sqlite3_malloc64( nData );
839*f94c1902Sdrh   if( pData==0 ){
840*f94c1902Sdrh     fprintf(stderr, "could not allocate %d bytes\n", nData);
841*f94c1902Sdrh     exit(1);
842*f94c1902Sdrh   }
843*f94c1902Sdrh   memcpy(pData, aDbBytes, nData);
844*f94c1902Sdrh   rc = sqlite3_deserialize(db, 0, pData, nData, nData,
845*f94c1902Sdrh      SQLITE_DESERIALIZE_FREEONCLOSE | SQLITE_DESERIALIZE_RESIZEABLE);
846*f94c1902Sdrh   if( rc ){
847*f94c1902Sdrh     fprintf(stderr, "sqlite3_deserialize() failed with %d: %s\n",
848*f94c1902Sdrh             rc, sqlite3_errmsg(db));
849*f94c1902Sdrh     exit(1);
850*f94c1902Sdrh   }
851*f94c1902Sdrh }
852*f94c1902Sdrh 
853*f94c1902Sdrh /*
854*f94c1902Sdrh ** Given a full file pathname, return a pointer to the tail.
855*f94c1902Sdrh ** Example:
856*f94c1902Sdrh **
857*f94c1902Sdrh **   input:    /home/drh/sqlite/abc.db
858*f94c1902Sdrh **   output:   abc.db
859*f94c1902Sdrh */
860*f94c1902Sdrh static const char *fileTail(const char *z){
861*f94c1902Sdrh   const char *zOut = z;
862*f94c1902Sdrh   while( z[0] ){
863*f94c1902Sdrh     if( z[0]=='/' && z[1]!=0 ) zOut = &z[1];
864*f94c1902Sdrh     z++;
865*f94c1902Sdrh   }
866*f94c1902Sdrh   return zOut;
867*f94c1902Sdrh }
868*f94c1902Sdrh 
869*f94c1902Sdrh int main(int argc, char **argv){
870*f94c1902Sdrh   const char *zCmd;
871*f94c1902Sdrh   sqlite3 *db;
872*f94c1902Sdrh   int rc;
873*f94c1902Sdrh   sqlite3_session *pSess;
874*f94c1902Sdrh   sqlite3_stmt *pStmt;
875*f94c1902Sdrh   void *pChgset;
876*f94c1902Sdrh   int nChgset;
877*f94c1902Sdrh   int bVerbose = 0;
878*f94c1902Sdrh 
879*f94c1902Sdrh   if( argc<2 ){
880*f94c1902Sdrh     fprintf(stderr, "%s", zHelp);
881*f94c1902Sdrh     exit(1);
882*f94c1902Sdrh   }
883*f94c1902Sdrh   rc = sqlite3_open_v2(":memory:",&db,
884*f94c1902Sdrh                        SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, "memdb");
885*f94c1902Sdrh   if( rc ){
886*f94c1902Sdrh     fprintf(stderr, "Failed to open :memory: database: %s\n",
887*f94c1902Sdrh             sqlite3_errmsg(db));
888*f94c1902Sdrh     exit(1);
889*f94c1902Sdrh   }
890*f94c1902Sdrh   db_reset(db);
891*f94c1902Sdrh   zCmd = argv[1];
892*f94c1902Sdrh   if( strcmp(zCmd, "setup")==0 ){
893*f94c1902Sdrh     if( argc!=2 ){
894*f94c1902Sdrh       fprintf(stdout, "Wrong number of arguments.\n%s", zHelp);
895*f94c1902Sdrh       exit(1);
896*f94c1902Sdrh     }
897*f94c1902Sdrh     runSql(db, zFillSql);
898*f94c1902Sdrh     rc = sqlite3session_create(db, "main", &pSess);
899*f94c1902Sdrh     if( rc ){
900*f94c1902Sdrh       fprintf(stderr, "sqlite3session_create() returns %d\n", rc);
901*f94c1902Sdrh       exit(1);
902*f94c1902Sdrh     }
903*f94c1902Sdrh     rc = sqlite3session_attach(pSess, 0);
904*f94c1902Sdrh     if( rc ){
905*f94c1902Sdrh       fprintf(stderr, "sqlite3session_attach(db,0) returns %d\n", rc);
906*f94c1902Sdrh       exit(1);
907*f94c1902Sdrh     }
908*f94c1902Sdrh     runSql(db, "INSERT INTO t4(z) VALUES('');");
909*f94c1902Sdrh     makeChangeset("c1.txt", pSess);
910*f94c1902Sdrh     runSql(db,
911*f94c1902Sdrh       "UPDATE t1 SET b=c, c=b WHERE a IN (5,7);\n"
912*f94c1902Sdrh       "DELETE FROM t2 WHERE rowid IN (8,2);\n"
913*f94c1902Sdrh       "INSERT OR IGNORE INTO t4 SELECT b FROM t1 WHERE b IS TRUE LIMIT 2;");
914*f94c1902Sdrh     makeChangeset("c2.txt", pSess);
915*f94c1902Sdrh     runSql(db, "UPDATE t3 SET x=y, y=NULL WHERE rowid IN (1,3);");
916*f94c1902Sdrh     makeChangeset("c3.txt", pSess);
917*f94c1902Sdrh     sqlite3session_delete(pSess);
918*f94c1902Sdrh   }else
919*f94c1902Sdrh   if( strcmp(zCmd, "run")==0 ){
920*f94c1902Sdrh     int i;
921*f94c1902Sdrh     if( argc<3 ){
922*f94c1902Sdrh       fprintf(stdout, "Wrong number of arguments.\n%s", zHelp);
923*f94c1902Sdrh       exit(1);
924*f94c1902Sdrh     }
925*f94c1902Sdrh     for(i=2; i<argc; i++){
926*f94c1902Sdrh       if( strcmp(argv[i],"-v")==0 ){
927*f94c1902Sdrh         bVerbose = 1;
928*f94c1902Sdrh         continue;
929*f94c1902Sdrh       }
930*f94c1902Sdrh       readFile(argv[i], &pChgset, &nChgset);
931*f94c1902Sdrh       if( nChgset >= 512
932*f94c1902Sdrh        && memcmp(pChgset, "SQLite format 3", 16)==0
933*f94c1902Sdrh       ){
934*f94c1902Sdrh         sqlite3 *db2;
935*f94c1902Sdrh         sqlite3_stmt *pStmt;
936*f94c1902Sdrh         int nCase = 0;
937*f94c1902Sdrh         /* This file is an SQL Archive containing many changesets */
938*f94c1902Sdrh         if( !bVerbose ){ printf("%s: ", fileTail(argv[i])); fflush(stdout); }
939*f94c1902Sdrh         sqlite3_open_v2(":memory:", &db2,
940*f94c1902Sdrh                         SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE, "memdb");
941*f94c1902Sdrh         sqlite3_deserialize(db2, 0, pChgset, nChgset, nChgset,
942*f94c1902Sdrh               SQLITE_DESERIALIZE_READONLY | SQLITE_DESERIALIZE_FREEONCLOSE);
943*f94c1902Sdrh         sqlite3_create_function(db2, "sqlar_uncompress", 2, SQLITE_UTF8, 0,
944*f94c1902Sdrh                                  sqlarUncompressFunc, 0, 0);
945*f94c1902Sdrh         rc = sqlite3_prepare_v2(db2, "SELECT name, sqlar_uncompress(data,sz)"
946*f94c1902Sdrh                                      "  FROM sqlar", -1, &pStmt, 0);
947*f94c1902Sdrh         if( rc ){
948*f94c1902Sdrh           fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(db2));
949*f94c1902Sdrh           exit(1);
950*f94c1902Sdrh         }
951*f94c1902Sdrh         while( SQLITE_ROW==sqlite3_step(pStmt) ){
952*f94c1902Sdrh           if( bVerbose ){
953*f94c1902Sdrh             printf("%s/%s:", fileTail(argv[i]), sqlite3_column_text(pStmt,0));
954*f94c1902Sdrh             fflush(stdout);
955*f94c1902Sdrh           }
956*f94c1902Sdrh           runSql(db, "BEGIN");
957*f94c1902Sdrh           pChgset = (unsigned char*)sqlite3_column_blob(pStmt, 1);
958*f94c1902Sdrh           nChgset = sqlite3_column_bytes(pStmt, 1);
959*f94c1902Sdrh           rc = sqlite3changeset_apply(db, nChgset, pChgset, 0, conflictCall, 0);
960*f94c1902Sdrh           if( bVerbose ){
961*f94c1902Sdrh             printf(" Ok.  rc=%d\n", rc);
962*f94c1902Sdrh             fflush(stdout);
963*f94c1902Sdrh           }
964*f94c1902Sdrh           runSql(db, "ROLLBACK");
965*f94c1902Sdrh           nCase++;
966*f94c1902Sdrh         }
967*f94c1902Sdrh         sqlite3_finalize(pStmt);
968*f94c1902Sdrh         sqlite3_close(db2);
969*f94c1902Sdrh         if( bVerbose ) printf("%s: ", fileTail(argv[i]));
970*f94c1902Sdrh         printf(" %d cases, 0 crashes\n", nCase);
971*f94c1902Sdrh         fflush(stdout);
972*f94c1902Sdrh       }else{
973*f94c1902Sdrh         /* The named file is just an ordinary changeset */
974*f94c1902Sdrh         printf("%s:", fileTail(argv[i]));
975*f94c1902Sdrh         fflush(stdout);
976*f94c1902Sdrh         runSql(db, "BEGIN");
977*f94c1902Sdrh         rc = sqlite3changeset_apply(db, nChgset, pChgset, 0, conflictCall, 0);
978*f94c1902Sdrh         printf(" %d\n", rc);
979*f94c1902Sdrh         fflush(stdout);
980*f94c1902Sdrh         runSql(db, "ROLLBACK");
981*f94c1902Sdrh         sqlite3_free(pChgset);
982*f94c1902Sdrh       }
983*f94c1902Sdrh     }
984*f94c1902Sdrh   }else
985*f94c1902Sdrh   {
986*f94c1902Sdrh     fprintf(stderr, "%s", zHelp);
987*f94c1902Sdrh     exit(1);
988*f94c1902Sdrh   }
989*f94c1902Sdrh   rc = sqlite3_prepare_v2(db, "PRAGMA integrity_check;", -1, &pStmt, 0);
990*f94c1902Sdrh   if( rc ){
991*f94c1902Sdrh     fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
992*f94c1902Sdrh     exit(1);
993*f94c1902Sdrh   }
994*f94c1902Sdrh   if( sqlite3_step(pStmt)!=SQLITE_ROW
995*f94c1902Sdrh    || strcmp((const char*)sqlite3_column_text(pStmt,0),"ok")!=0
996*f94c1902Sdrh   ){
997*f94c1902Sdrh     fprintf(stderr, "Integrity check failed!\n");
998*f94c1902Sdrh     do{
999*f94c1902Sdrh       fprintf(stderr, "%s\n", sqlite3_column_text(pStmt,0));
1000*f94c1902Sdrh     }while( sqlite3_step(pStmt)==SQLITE_ROW );
1001*f94c1902Sdrh   }
1002*f94c1902Sdrh   sqlite3_finalize(pStmt);
1003*f94c1902Sdrh   sqlite3_close(db);
1004*f94c1902Sdrh   if( sqlite3_memory_used()>0 ){
1005*f94c1902Sdrh     fprintf(stderr, "memory leak of %lld bytes\n",
1006*f94c1902Sdrh          sqlite3_memory_used());
1007*f94c1902Sdrh     exit(1);
1008*f94c1902Sdrh   }
1009*f94c1902Sdrh   return 0;
1010*f94c1902Sdrh }
1011