Add contrib.
[doldaconnect.git] / config / tthsum.c
1 /*
2  *  Dolda Connect - Modular multiuser Direct Connect-style client
3  *  Copyright (C) 2004 Fredrik Tolf (fredrik@dolda2000.com)
4  *  
5  *  This program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2 of the License, or
8  *  (at your option) any later version.
9  *  
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *  
15  *  You should have received a copy of the GNU General Public License
16  *  along with this program; if not, write to the Free Software
17  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18 */
19
20 /* This frankenfile is built from bits and pieces of the daemon. The
21  * copying and pasting is very ugly, but it doesn't *really*
22  * matter. */
23
24 #include <stdlib.h>
25 #include <unistd.h>
26 #include <stdio.h>
27 #include <string.h>
28 #include <fcntl.h>
29 #include <errno.h>
30 #include <sys/stat.h>
31
32 #ifdef HAVE_CONFIG_H
33 #include <config.h>
34 #endif
35
36 struct tigerhash {
37     unsigned long long a, b, c;
38     unsigned char block[64];
39     int offset;
40     size_t len;
41 };
42
43 struct tigertreehash {
44     int blocks;
45     char block[1024];
46     int offset;
47     char stack[64][24];
48     int depth;
49 };
50
51 char buf[32768], dbuf[8192];
52
53 static char *base64set = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
54 static int base64rev[] = {
55     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
56     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
57     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
58     52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
59     -1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
60     15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
61     -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
62     41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1,
63     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
64     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
65     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
66     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
67     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
68     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
69     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
70     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
71 };
72 static char *base32set = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
73 static int base32rev[] = {
74     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
75     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
76     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
77     -1, -1, 26, 27, 28, 29, 30, 31, -1, -1, -1, -1, -1, -1, -1, -1,
78     -1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
79     15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
80     -1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
81     15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
82     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
83     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
84     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
85     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
86     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
87     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
88     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
89     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
90 };
91
92 static unsigned long long table[];
93
94 void inittiger(struct tigerhash *th)
95 {
96     th->a = 0x0123456789abcdefULL;
97     th->b = 0xfedcba9876543210ULL;
98     th->c = 0xf096a5b4c3b2e187ULL;
99     th->offset = 0;
100     th->len = 0;
101 }
102
103 static void round(unsigned long long *a, unsigned long long *b, unsigned long long *c, unsigned long long x, int mul)
104 {
105     *c ^= x;
106     *a -= table[((*c >> 0) & 0xff) + 0x0000] ^ table[((*c >> 16) & 0xff) + 0x0100] ^ table[((*c >> 32) & 0xff) + 0x0200] ^ table[((*c >> 48) & 0xff) + 0x0300];
107     *b += table[((*c >> 8) & 0xff) + 0x0300] ^ table[((*c >> 24) & 0xff) + 0x0200] ^ table[((*c >> 40) & 0xff) + 0x0100] ^ table[((*c >> 56) & 0xff) + 0x0000];
108     *b *= mul;
109 }
110
111 static void pass(unsigned long long *a, unsigned long long *b, unsigned long long *c, unsigned long long *x, int mul)
112 {
113     round(a, b, c, x[0], mul);
114     round(b, c, a, x[1], mul);
115     round(c, a, b, x[2], mul);
116     round(a, b, c, x[3], mul);
117     round(b, c, a, x[4], mul);
118     round(c, a, b, x[5], mul);
119     round(a, b, c, x[6], mul);
120     round(b, c, a, x[7], mul);
121 }
122
123 static void key_schedule(unsigned long long *x)
124 {
125     x[0] -= x[7] ^ 0xa5a5a5a5a5a5a5a5ULL;
126     x[1] ^= x[0];
127     x[2] += x[1];
128     x[3] -= x[2] ^ ((~x[1]) << 19);
129     x[4] ^= x[3];
130     x[5] += x[4];
131     x[6] -= x[5] ^ ((~x[4]) >> 23);
132     x[7] ^= x[6];
133     x[0] += x[7];
134     x[1] -= x[0] ^ ((~x[7]) << 19);
135     x[2] ^= x[1];
136     x[3] += x[2];
137     x[4] -= x[3] ^ ((~x[2]) >> 23);
138     x[5] ^= x[4];
139     x[6] += x[5];
140     x[7] -= x[6] ^ 0x0123456789abcdefULL;
141 }
142
143 static void doblock(struct tigerhash *th)
144 {
145     int i, o;
146     unsigned long long x[8], aa, bb, cc;
147     
148     for(i = 0; i < 8; i++) {
149         x[i] = 0;
150         for(o = 0; o < 8; o++) {
151             x[i] <<= 8;
152             x[i] |= th->block[(i * 8) + 7 - o];
153         }
154     }
155     aa = th->a;
156     bb = th->b;
157     cc = th->c;
158     pass(&th->a, &th->b, &th->c, x, 5);
159     key_schedule(x);
160     pass(&th->c, &th->a, &th->b, x, 7);
161     key_schedule(x);
162     pass(&th->b, &th->c, &th->a, x, 9);
163     th->a ^= aa;
164     th->b -= bb;
165     th->c += cc;
166     th->offset = 0;
167 }
168
169 void dotiger(struct tigerhash *th, char *buf, size_t buflen)
170 {
171     int taken;
172     
173     th->len += buflen;
174     while(buflen > 0) {
175         taken = buflen;
176         if(taken > 64 - th->offset)
177             taken = 64 - th->offset;
178         memcpy(th->block + th->offset, buf, taken);
179         th->offset += taken;
180         buflen -= taken;
181         buf += taken;
182         if(th->offset == 64)
183             doblock(th);
184     }
185 }
186
187 void synctiger(struct tigerhash *th)
188 {
189     int i;
190     unsigned long long buf;
191     
192     th->block[th->offset++] = 1;
193     while(th->offset & 7)
194         th->block[th->offset++] = 0;
195     if(th->offset > 56)
196         doblock(th);
197     if(th->offset < 56)
198         memset(th->block + th->offset, 0, 56 - th->offset);
199     buf = th->len << 3;
200     for(i = 0; i < 8; i++) {
201         th->block[56 + i] = buf & 0xff;
202         buf >>= 8;
203     }
204     doblock(th);
205 }
206
207 void restiger(struct tigerhash *th, char *rbuf)
208 {
209     int i;
210     unsigned long long buf;
211     
212     buf = th->a;
213     for(i = 0; i < 8; i++) {
214         rbuf[i] = buf & 0xff;
215         buf >>= 8;
216     }
217     buf = th->b;
218     for(; i < 16; i++) {
219         rbuf[i] = buf & 0xff;
220         buf >>= 8;
221     }
222     buf = th->c;
223     for(; i < 24; i++) {
224         rbuf[i] = buf & 0xff;
225         buf >>= 8;
226     }
227 }
228
229 void inittigertree(struct tigertreehash *tth)
230 {
231     tth->blocks = 0;
232     tth->offset = 0;
233     tth->depth = 0;
234 }
235
236 static void combine(struct tigertreehash *tth)
237 {
238     struct tigerhash th;
239     
240     inittiger(&th);
241     dotiger(&th, "\001", 1);
242     tth->depth--;
243     dotiger(&th, tth->stack[tth->depth - 1], 24);
244     dotiger(&th, tth->stack[tth->depth], 24);
245     synctiger(&th);
246     restiger(&th, tth->stack[tth->depth - 1]);
247 }
248
249 void pushtigertree(struct tigertreehash *tth, char *buf)
250 {
251     int nb;
252     
253     memcpy(tth->stack[tth->depth++], buf, 24);
254     for(nb = ++tth->blocks; !(nb & 1); nb >>= 1)
255         combine(tth);
256 }
257
258 static void dotreeblock(struct tigertreehash *tth)
259 {
260     struct tigerhash th;
261     int nb;
262     
263     inittiger(&th);
264     dotiger(&th, "\0", 1);
265     dotiger(&th, tth->block, tth->offset);
266     synctiger(&th);
267     restiger(&th, tth->stack[tth->depth++]);
268     tth->offset = 0;
269     for(nb = ++tth->blocks; !(nb & 1); nb >>= 1)
270         combine(tth);
271 }
272
273 void dotigertree(struct tigertreehash *tth, char *buf, size_t buflen)
274 {
275     int taken;
276     
277     while(buflen > 0) {
278         taken = buflen;
279         if(taken > 1024 - tth->offset)
280             taken = 1024 - tth->offset;
281         memcpy(tth->block + tth->offset, buf, taken);
282         tth->offset += taken;
283         buflen -= taken;
284         buf += taken;
285         if(tth->offset == 1024)
286             dotreeblock(tth);
287     }
288 }
289
290 void synctigertree(struct tigertreehash *tth)
291 {
292     if((tth->offset > 0) || (tth->blocks == 0))
293         dotreeblock(tth);
294     while(tth->depth > 1)
295         combine(tth);
296 }
297
298 void restigertree(struct tigertreehash *tth, char *rbuf)
299 {
300     memcpy(rbuf, tth->stack[0], 24);
301 }
302
303 void hexencode(char *dest, char *data, size_t datalen)
304 {
305     char this;
306     int off;
307     int dig;
308     
309     off = 0;
310     for(; datalen > 0; datalen--, data++)
311     {
312         dig = (*data & 0xF0) >> 4;
313         if(dig > 9)
314             this = 'A' + dig - 10;
315         else
316             this = dig + '0';
317         dest[off++] = this;
318         dig = *data & 0x0F;
319         if(dig > 9)
320             this = 'A' + dig - 10;
321         else
322             this = dig + '0';
323         dest[off++] = this;
324     }
325     dest[off] = 0;
326 }
327
328 int hexdecode(char *dest, char *data, size_t *len)
329 {
330     char this;
331     int off;
332     
333     off = 0;
334     for(; *data; data++)
335     {
336         if((*data >= 'A') && (*data <= 'F'))
337         {
338             this = (this & 0x0F) | ((*data - 'A' + 10) << 4);
339         } else if((*data >= '0') && (*data <= '9')) {
340             this = (this & 0x0F) | ((*data - '0') << 4);
341         } else {
342             return(-1);
343         }
344         data++;
345         if(!*data)
346             return(-1);
347         if((*data >= 'A') && (*data <= 'F'))
348         {
349             this = (this & 0xF0) | (*data - 'A' + 10);
350         } else if((*data >= '0') && (*data <= '9')) {
351             this = (this & 0xF0) | (*data - '0');
352         } else {
353             return(-1);
354         }
355         dest[off++] = this;
356     }
357     dest[off] = 0;
358     if(len != NULL)
359         *len = off;
360     return(0);
361 }
362
363 void base64encode(char *dest, char *data, size_t datalen)
364 {
365     int off;
366     
367     if(datalen == 0) {
368         dest[0] = 0;
369         return;
370     }
371     off = 0;
372     while(datalen >= 3)
373     {
374         dest[off++] = base64set[(data[0] & 0xfc) >> 2];
375         dest[off++] = base64set[((data[0] & 0x03) << 4) | ((data[1] & 0xf0) >> 4)];
376         dest[off++] = base64set[((data[1] & 0x0f) << 2) | ((data[2] & 0xc0) >> 6)];
377         dest[off++] = base64set[data[2] & 0x3f];
378         datalen -= 3;
379         data += 3;
380     }
381     if(datalen == 1)
382     {
383         dest[off++] = base64set[(data[0] & 0xfc) >> 2];
384         dest[off++] = base64set[(data[0] & 0x03) << 4];
385         dest[off++] = '=';
386         dest[off++] = '=';
387     }
388     if(datalen == 2)
389     {
390         dest[off++] = base64set[(data[0] & 0xfc) >> 2];
391         dest[off++] = base64set[((data[0] & 0x03) << 4) | ((data[1] & 0xf0) >> 4)];
392         dest[off++] = base64set[(data[1] & 0x0f) << 2];
393         dest[off++] = '=';
394     }
395     dest[off] = 0;
396 }
397
398 int base64decode(char *dest, char *data, size_t *datalen)
399 {
400     int b, c;
401     char cur;
402     int off;
403     
404     off = 0;
405     cur = 0;
406     b = 8;
407     for(; *data > 0; data++)
408     {
409         c = (int)(unsigned char)*data;
410         if(c == '=')
411             break;
412         if(c == '\n')
413             continue;
414         if(base64rev[c] == -1)
415             return(-1);
416         b -= 6;
417         if(b <= 0)
418         {
419             cur |= base64rev[c] >> -b;
420             dest[off++] = cur;
421             b += 8;
422             cur = 0;
423         }
424         cur |= base64rev[c] << b;
425     }
426     if(datalen != NULL)
427         *datalen = off;
428     dest[off] = 0;
429     return(0);
430 }
431
432 void base32encode(char *dest, char *data, size_t datalen)
433 {
434     int off;
435     
436     if(datalen == 0) {
437         dest[0] = 0;
438         return;
439     }
440     off = 0;
441     while(datalen >= 5)
442     {
443         dest[off++] = base32set[((data[0] & 0xf8) >> 3)];
444         dest[off++] = base32set[((data[0] & 0x07) << 2) | ((data[1] & 0xc0) >> 6)];
445         dest[off++] = base32set[((data[1] & 0x3e) >> 1)];
446         dest[off++] = base32set[((data[1] & 0x01) << 4) | ((data[2] & 0xf0) >> 4)];
447         dest[off++] = base32set[((data[2] & 0x0f) << 1) | ((data[3] & 0x80) >> 7)];
448         dest[off++] = base32set[((data[3] & 0x7c) >> 2)];
449         dest[off++] = base32set[((data[3] & 0x03) << 3) | ((data[4] & 0xe0) >> 5)];
450         dest[off++] = base32set[data[4] & 0x1f];
451         datalen -= 5;
452         data += 5;
453     }
454     if(datalen == 1)
455     {
456         dest[off++] = base32set[((data[0] & 0xf8) >> 3)];
457         dest[off++] = base32set[((data[0] & 0x07) << 2)];
458         memcpy(dest + off, "======", 6);
459         off += 6;
460     }
461     if(datalen == 2)
462     {
463         dest[off++] = base32set[((data[0] & 0xf8) >> 3)];
464         dest[off++] = base32set[((data[0] & 0x07) << 2) | ((data[1] & 0xc0) >> 6)];
465         dest[off++] = base32set[((data[1] & 0x3e) >> 1)];
466         dest[off++] = base32set[((data[1] & 0x01) << 4)];
467         memcpy(dest + off, "====", 4);
468         off += 4;
469     }
470     if(datalen == 3)
471     {
472         dest[off++] = base32set[((data[0] & 0xf8) >> 3)];
473         dest[off++] = base32set[((data[0] & 0x07) << 2) | ((data[1] & 0xc0) >> 6)];
474         dest[off++] = base32set[((data[1] & 0x3e) >> 1)];
475         dest[off++] = base32set[((data[1] & 0x01) << 4) | ((data[2] & 0xf0) >> 4)];
476         dest[off++] = base32set[((data[2] & 0x0f) << 1)];
477         memcpy(dest + off, "===", 3);
478         off += 3;
479     }
480     if(datalen == 4)
481     {
482         dest[off++] = base32set[((data[0] & 0xf8) >> 3)];
483         dest[off++] = base32set[((data[0] & 0x07) << 2) | ((data[1] & 0xc0) >> 6)];
484         dest[off++] = base32set[((data[1] & 0x3e) >> 1)];
485         dest[off++] = base32set[((data[1] & 0x01) << 4) | ((data[2] & 0xf0) >> 4)];
486         dest[off++] = base32set[((data[2] & 0x0f) << 1) | ((data[3] & 0x80) >> 7)];
487         dest[off++] = base32set[((data[3] & 0x7c) >> 2)];
488         dest[off++] = base32set[((data[3] & 0x03) << 3)];
489         dest[off++] = '=';
490     }
491     dest[off] = 0;
492 }
493
494 int base32decode(char *dest, char *data, size_t *datalen)
495 {
496     int b, c;
497     char cur;
498     int off;
499     
500     off = 0;
501     cur = 0;
502     b = 8;
503     for(; *data > 0; data++)
504     {
505         c = (int)(unsigned char)*data;
506         if(c == '=')
507             break;
508         if(c == '\n')
509             continue;
510         if(base32rev[c] == -1)
511             return(-1);
512         b -= 5;
513         if(b <= 0)
514         {
515             cur |= base32rev[c] >> -b;
516             dest[off++] = cur;
517             b += 8;
518             cur = 0;
519         }
520         cur |= base32rev[c] << b;
521     }
522     if(datalen != NULL)
523         *datalen = off;
524     dest[off] = 0;
525     return(0);
526 }
527
528 int main(int argc, char **argv)
529 {
530     int i, ret;
531     int c, fd, outfd;
532     int len, len2;
533     int filter, output;
534     struct tigertreehash tth;
535     char res[24];
536     char *statefile;
537     FILE *state;
538     int progress, bytes;
539     struct stat sb;
540     
541     filter = 0;
542     output = 4;
543     outfd = 3;
544     progress = 0;
545     statefile = NULL;
546     while((c = getopt(argc, argv, "phf456F:s:")) != -1) {
547         switch(c) {
548         case '4':
549         case '5':
550         case '6':
551             output = c - '0';
552             break;
553         case 'p':
554             progress = 1;
555             break;
556         case 'f':
557             filter = 1;
558             break;
559         case 'F':
560             outfd = atoi(optarg);
561             break;
562         case 's':
563             statefile = optarg;
564             break;
565         case 'h':
566         case ':':
567         case '?':
568         default:
569             fprintf(stderr, "usage: tigersum [-h456] FILE...\n");
570             fprintf(stderr, "       tigersum [-h456] [-F OUTFD] [-s STATEFILE] -f\n");
571             exit((c == 'h')?0:1);
572         }
573     }
574     if(filter) {
575         inittigertree(&tth);
576         if(statefile != NULL)
577         {
578             if(((state = fopen(statefile, "r")) == NULL) && (errno != ENOENT)) {
579                 fprintf(stderr, "tigersum: %s: %s\n", statefile, strerror(errno));
580                 exit(1);
581             }
582             if(state != NULL) {
583                 if(fgets(buf, sizeof(buf), state) == NULL) {
584                     fprintf(stderr, "tigersum: %s: could not read entire state\n", statefile);
585                     exit(1);
586                 }
587                 tth.blocks = atoi(buf);
588                 if(fgets(buf, sizeof(buf), state) == NULL) {
589                     fprintf(stderr, "tigersum: %s: could not read entire state\n", statefile);
590                     exit(1);
591                 }
592                 tth.depth = atoi(buf);
593                 for(i = 0; i < tth.depth; i++) {
594                     if(fgets(buf, sizeof(buf), state) == NULL) {
595                         fprintf(stderr, "tigersum: %s: could not read entire state\n", statefile);
596                         exit(1);
597                     }
598                     base64decode(dbuf, buf, &ret);
599                     if(ret != 24) {
600                         fprintf(stderr, "tigersum: %s: illegal state\n", statefile);
601                         exit(1);
602                     }
603                     memcpy(tth.stack[i], dbuf, 24);
604                 }
605                 if(fgets(buf, sizeof(buf), state) == NULL) {
606                     fprintf(stderr, "tigersum: %s: could not read entire state\n", statefile);
607                     exit(1);
608                 }
609                 tth.offset = atoi(buf);
610                 if(fgets(buf, sizeof(buf), state) == NULL) {
611                     fprintf(stderr, "tigersum: %s: could not read entire state\n", statefile);
612                     exit(1);
613                 }
614                 base64decode(dbuf, buf, &ret);
615                 if(ret != tth.offset) {
616                     fprintf(stderr, "tigersum: %s: illegal state\n", statefile);
617                     exit(1);
618                 }
619                 memcpy(&tth.block, dbuf, tth.offset);
620                 fclose(state);
621                 unlink(statefile);
622             }
623         }
624         while(1) {
625             ret = read(0, buf, sizeof(buf));
626             if(ret < 0) {
627                 perror("tigersum: read");
628                 exit(1);
629             }
630             if(ret == 0)
631                 break;
632             len = ret;
633             for(len2 = 0; len2 < len; len2 += ret) {
634                 if((ret = write(1, buf, ret)) < 0) {
635                     perror("tigersum: write");
636                     exit(1);
637                 }
638             }
639             dotigertree(&tth, buf, len);
640         }
641         if(statefile != NULL) {
642             if((state = fopen(statefile, "w")) == NULL) {
643                 fprintf(stderr, "tigersum: %s: %s\n", statefile, strerror(errno));
644                 exit(1);
645             }
646             fprintf(state, "%i\n", tth.blocks);
647             fprintf(state, "%i\n", tth.depth);
648             for(i = 0; i < tth.depth; i++) {
649                 base64encode(dbuf, tth.stack[i], 24);
650                 fprintf(state, "%s\n", dbuf);
651             }
652             fprintf(state, "%i\n", tth.offset);
653             base64encode(dbuf, tth.block, tth.offset);
654             fputs(dbuf, state);
655             fputc('\n', state);
656             fclose(state);
657         }
658         synctigertree(&tth);
659         restigertree(&tth, res);
660         if(output == 4)
661             hexencode(dbuf, res, 24);
662         else if(output == 5)
663             base32encode(dbuf, res, 24);
664         else if(output == 6)
665             base64encode(dbuf, res, 24);
666         for(len = 0; len < strlen(dbuf); len += ret) {
667             if((ret = write(outfd, dbuf + len, strlen(dbuf) - len)) < 0) {
668                 perror("tigersum: output");
669                 exit(1);
670             }
671         }
672         write(outfd, "\n", 1);
673     } else {
674         for(i = optind; i < argc; i++) {
675             if(!strcmp(argv[i], "-")) {
676                 fd = 0;
677             } else {
678                 if((fd = open(argv[i], O_RDONLY)) < 0) {
679                     fprintf(stderr, "tigersum: %s: %s\n", argv[i], strerror(errno));
680                     exit(1);
681                 }
682             }
683             if(progress) {
684                 fstat(fd, &sb);
685                 if(!S_ISREG(sb.st_mode))
686                     sb.st_size = -1;
687                 bytes = 0;
688             }
689             inittigertree(&tth);
690             while(1) {
691                 ret = read(fd, buf, sizeof(buf));
692                 if(ret < 0) {
693                     perror("tigersum: read");
694                     exit(1);
695                 }
696                 if(progress) {
697                     if((bytes == 0) || ((bytes & ~0xFFFFF) != ((bytes + ret) & ~0xFFFFF))) {
698                         bytes += ret;
699                         fprintf(stderr, "\033[1G");
700                         if(argc - optind > 1)
701                             fprintf(stderr, "%s: ", argv[i]);
702                         if(sb.st_size < 0) {
703                             fprintf(stderr, "%i", bytes);
704                         } else {
705                             fprintf(stderr, "%i%%", (int)(((float)bytes / (float)sb.st_size) * 100.0));
706                         }
707                         fprintf(stderr, "\033[K");
708                         fflush(stderr);
709                     } else {
710                         bytes += ret;
711                     }
712                 }
713                 if(ret == 0)
714                     break;
715                 dotigertree(&tth, buf, ret);
716             }
717             if(progress)
718                 fprintf(stderr, "\n");
719             synctigertree(&tth);
720             restigertree(&tth, res);
721             if(output == 4)
722                 hexencode(dbuf, res, 24);
723             else if(output == 5)
724                 base32encode(dbuf, res, 24);
725             else if(output == 6)
726                 base64encode(dbuf, res, 24);
727             if(argc - optind > 1)
728                 printf("%s %s\n", dbuf, argv[i]);
729             else
730                 printf("%s\n", dbuf);
731             fflush(stdout);
732             close(fd);
733         }
734     }
735     return(0);
736 }
737
738 static unsigned long long table[1024] = {
739     0x02aab17cf7e90c5eULL,    0xac424b03e243a8ecULL,
740     0x72cd5be30dd5fcd3ULL,    0x6d019b93f6f97f3aULL,
741     0xcd9978ffd21f9193ULL,    0x7573a1c9708029e2ULL,
742     0xb164326b922a83c3ULL,    0x46883eee04915870ULL,
743     0xeaace3057103ece6ULL,    0xc54169b808a3535cULL,
744     0x4ce754918ddec47cULL,    0x0aa2f4dfdc0df40cULL,
745     0x10b76f18a74dbefaULL,    0xc6ccb6235ad1ab6aULL,
746     0x13726121572fe2ffULL,    0x1a488c6f199d921eULL,
747     0x4bc9f9f4da0007caULL,    0x26f5e6f6e85241c7ULL,
748     0x859079dbea5947b6ULL,    0x4f1885c5c99e8c92ULL,
749     0xd78e761ea96f864bULL,    0x8e36428c52b5c17dULL,
750     0x69cf6827373063c1ULL,    0xb607c93d9bb4c56eULL,
751     0x7d820e760e76b5eaULL,    0x645c9cc6f07fdc42ULL,
752     0xbf38a078243342e0ULL,    0x5f6b343c9d2e7d04ULL,
753     0xf2c28aeb600b0ec6ULL,    0x6c0ed85f7254bcacULL,
754     0x71592281a4db4fe5ULL,    0x1967fa69ce0fed9fULL,
755     0xfd5293f8b96545dbULL,    0xc879e9d7f2a7600bULL,
756     0x860248920193194eULL,    0xa4f9533b2d9cc0b3ULL,
757     0x9053836c15957613ULL,    0xdb6dcf8afc357bf1ULL,
758     0x18beea7a7a370f57ULL,    0x037117ca50b99066ULL,
759     0x6ab30a9774424a35ULL,    0xf4e92f02e325249bULL,
760     0x7739db07061ccae1ULL,    0xd8f3b49ceca42a05ULL,
761     0xbd56be3f51382f73ULL,    0x45faed5843b0bb28ULL,
762     0x1c813d5c11bf1f83ULL,    0x8af0e4b6d75fa169ULL,
763     0x33ee18a487ad9999ULL,    0x3c26e8eab1c94410ULL,
764     0xb510102bc0a822f9ULL,    0x141eef310ce6123bULL,
765     0xfc65b90059ddb154ULL,    0xe0158640c5e0e607ULL,
766     0x884e079826c3a3cfULL,    0x930d0d9523c535fdULL,
767     0x35638d754e9a2b00ULL,    0x4085fccf40469dd5ULL,
768     0xc4b17ad28be23a4cULL,    0xcab2f0fc6a3e6a2eULL,
769     0x2860971a6b943fcdULL,    0x3dde6ee212e30446ULL,
770     0x6222f32ae01765aeULL,    0x5d550bb5478308feULL,
771     0xa9efa98da0eda22aULL,    0xc351a71686c40da7ULL,
772     0x1105586d9c867c84ULL,    0xdcffee85fda22853ULL,
773     0xccfbd0262c5eef76ULL,    0xbaf294cb8990d201ULL,
774     0xe69464f52afad975ULL,    0x94b013afdf133e14ULL,
775     0x06a7d1a32823c958ULL,    0x6f95fe5130f61119ULL,
776     0xd92ab34e462c06c0ULL,    0xed7bde33887c71d2ULL,
777     0x79746d6e6518393eULL,    0x5ba419385d713329ULL,
778     0x7c1ba6b948a97564ULL,    0x31987c197bfdac67ULL,
779     0xde6c23c44b053d02ULL,    0x581c49fed002d64dULL,
780     0xdd474d6338261571ULL,    0xaa4546c3e473d062ULL,
781     0x928fce349455f860ULL,    0x48161bbacaab94d9ULL,
782     0x63912430770e6f68ULL,    0x6ec8a5e602c6641cULL,
783     0x87282515337ddd2bULL,    0x2cda6b42034b701bULL,
784     0xb03d37c181cb096dULL,    0xe108438266c71c6fULL,
785     0x2b3180c7eb51b255ULL,    0xdf92b82f96c08bbcULL,
786     0x5c68c8c0a632f3baULL,    0x5504cc861c3d0556ULL,
787     0xabbfa4e55fb26b8fULL,    0x41848b0ab3baceb4ULL,
788     0xb334a273aa445d32ULL,    0xbca696f0a85ad881ULL,
789     0x24f6ec65b528d56cULL,    0x0ce1512e90f4524aULL,
790     0x4e9dd79d5506d35aULL,    0x258905fac6ce9779ULL,
791     0x2019295b3e109b33ULL,    0xf8a9478b73a054ccULL,
792     0x2924f2f934417eb0ULL,    0x3993357d536d1bc4ULL,
793     0x38a81ac21db6ff8bULL,    0x47c4fbf17d6016bfULL,
794     0x1e0faadd7667e3f5ULL,    0x7abcff62938beb96ULL,
795     0xa78dad948fc179c9ULL,    0x8f1f98b72911e50dULL,
796     0x61e48eae27121a91ULL,    0x4d62f7ad31859808ULL,
797     0xeceba345ef5ceaebULL,    0xf5ceb25ebc9684ceULL,
798     0xf633e20cb7f76221ULL,    0xa32cdf06ab8293e4ULL,
799     0x985a202ca5ee2ca4ULL,    0xcf0b8447cc8a8fb1ULL,
800     0x9f765244979859a3ULL,    0xa8d516b1a1240017ULL,
801     0x0bd7ba3ebb5dc726ULL,    0xe54bca55b86adb39ULL,
802     0x1d7a3afd6c478063ULL,    0x519ec608e7669eddULL,
803     0x0e5715a2d149aa23ULL,    0x177d4571848ff194ULL,
804     0xeeb55f3241014c22ULL,    0x0f5e5ca13a6e2ec2ULL,
805     0x8029927b75f5c361ULL,    0xad139fabc3d6e436ULL,
806     0x0d5df1a94ccf402fULL,    0x3e8bd948bea5dfc8ULL,
807     0xa5a0d357bd3ff77eULL,    0xa2d12e251f74f645ULL,
808     0x66fd9e525e81a082ULL,    0x2e0c90ce7f687a49ULL,
809     0xc2e8bcbeba973bc5ULL,    0x000001bce509745fULL,
810     0x423777bbe6dab3d6ULL,    0xd1661c7eaef06eb5ULL,
811     0xa1781f354daacfd8ULL,    0x2d11284a2b16affcULL,
812     0xf1fc4f67fa891d1fULL,    0x73ecc25dcb920adaULL,
813     0xae610c22c2a12651ULL,    0x96e0a810d356b78aULL,
814     0x5a9a381f2fe7870fULL,    0xd5ad62ede94e5530ULL,
815     0xd225e5e8368d1427ULL,    0x65977b70c7af4631ULL,
816     0x99f889b2de39d74fULL,    0x233f30bf54e1d143ULL,
817     0x9a9675d3d9a63c97ULL,    0x5470554ff334f9a8ULL,
818     0x166acb744a4f5688ULL,    0x70c74caab2e4aeadULL,
819     0xf0d091646f294d12ULL,    0x57b82a89684031d1ULL,
820     0xefd95a5a61be0b6bULL,    0x2fbd12e969f2f29aULL,
821     0x9bd37013feff9fe8ULL,    0x3f9b0404d6085a06ULL,
822     0x4940c1f3166cfe15ULL,    0x09542c4dcdf3defbULL,
823     0xb4c5218385cd5ce3ULL,    0xc935b7dc4462a641ULL,
824     0x3417f8a68ed3b63fULL,    0xb80959295b215b40ULL,
825     0xf99cdaef3b8c8572ULL,    0x018c0614f8fcb95dULL,
826     0x1b14accd1a3acdf3ULL,    0x84d471f200bb732dULL,
827     0xc1a3110e95e8da16ULL,    0x430a7220bf1a82b8ULL,
828     0xb77e090d39df210eULL,    0x5ef4bd9f3cd05e9dULL,
829     0x9d4ff6da7e57a444ULL,    0xda1d60e183d4a5f8ULL,
830     0xb287c38417998e47ULL,    0xfe3edc121bb31886ULL,
831     0xc7fe3ccc980ccbefULL,    0xe46fb590189bfd03ULL,
832     0x3732fd469a4c57dcULL,    0x7ef700a07cf1ad65ULL,
833     0x59c64468a31d8859ULL,    0x762fb0b4d45b61f6ULL,
834     0x155baed099047718ULL,    0x68755e4c3d50baa6ULL,
835     0xe9214e7f22d8b4dfULL,    0x2addbf532eac95f4ULL,
836     0x32ae3909b4bd0109ULL,    0x834df537b08e3450ULL,
837     0xfa209da84220728dULL,    0x9e691d9b9efe23f7ULL,
838     0x0446d288c4ae8d7fULL,    0x7b4cc524e169785bULL,
839     0x21d87f0135ca1385ULL,    0xcebb400f137b8aa5ULL,
840     0x272e2b66580796beULL,    0x3612264125c2b0deULL,
841     0x057702bdad1efbb2ULL,    0xd4babb8eacf84be9ULL,
842     0x91583139641bc67bULL,    0x8bdc2de08036e024ULL,
843     0x603c8156f49f68edULL,    0xf7d236f7dbef5111ULL,
844     0x9727c4598ad21e80ULL,    0xa08a0896670a5fd7ULL,
845     0xcb4a8f4309eba9cbULL,    0x81af564b0f7036a1ULL,
846     0xc0b99aa778199abdULL,    0x959f1ec83fc8e952ULL,
847     0x8c505077794a81b9ULL,    0x3acaaf8f056338f0ULL,
848     0x07b43f50627a6778ULL,    0x4a44ab49f5eccc77ULL,
849     0x3bc3d6e4b679ee98ULL,    0x9cc0d4d1cf14108cULL,
850     0x4406c00b206bc8a0ULL,    0x82a18854c8d72d89ULL,
851     0x67e366b35c3c432cULL,    0xb923dd61102b37f2ULL,
852     0x56ab2779d884271dULL,    0xbe83e1b0ff1525afULL,
853     0xfb7c65d4217e49a9ULL,    0x6bdbe0e76d48e7d4ULL,
854     0x08df828745d9179eULL,    0x22ea6a9add53bd34ULL,
855     0xe36e141c5622200aULL,    0x7f805d1b8cb750eeULL,
856     0xafe5c7a59f58e837ULL,    0xe27f996a4fb1c23cULL,
857     0xd3867dfb0775f0d0ULL,    0xd0e673de6e88891aULL,
858     0x123aeb9eafb86c25ULL,    0x30f1d5d5c145b895ULL,
859     0xbb434a2dee7269e7ULL,    0x78cb67ecf931fa38ULL,
860     0xf33b0372323bbf9cULL,    0x52d66336fb279c74ULL,
861     0x505f33ac0afb4eaaULL,    0xe8a5cd99a2cce187ULL,
862     0x534974801e2d30bbULL,    0x8d2d5711d5876d90ULL,
863     0x1f1a412891bc038eULL,    0xd6e2e71d82e56648ULL,
864     0x74036c3a497732b7ULL,    0x89b67ed96361f5abULL,
865     0xffed95d8f1ea02a2ULL,    0xe72b3bd61464d43dULL,
866     0xa6300f170bdc4820ULL,    0xebc18760ed78a77aULL,
867     0xe6a6be5a05a12138ULL,    0xb5a122a5b4f87c98ULL,
868     0x563c6089140b6990ULL,    0x4c46cb2e391f5dd5ULL,
869     0xd932addbc9b79434ULL,    0x08ea70e42015aff5ULL,
870     0xd765a6673e478cf1ULL,    0xc4fb757eab278d99ULL,
871     0xdf11c6862d6e0692ULL,    0xddeb84f10d7f3b16ULL,
872     0x6f2ef604a665ea04ULL,    0x4a8e0f0ff0e0dfb3ULL,
873     0xa5edeef83dbcba51ULL,    0xfc4f0a2a0ea4371eULL,
874     0xe83e1da85cb38429ULL,    0xdc8ff882ba1b1ce2ULL,
875     0xcd45505e8353e80dULL,    0x18d19a00d4db0717ULL,
876     0x34a0cfeda5f38101ULL,    0x0be77e518887caf2ULL,
877     0x1e341438b3c45136ULL,    0xe05797f49089ccf9ULL,
878     0xffd23f9df2591d14ULL,    0x543dda228595c5cdULL,
879     0x661f81fd99052a33ULL,    0x8736e641db0f7b76ULL,
880     0x15227725418e5307ULL,    0xe25f7f46162eb2faULL,
881     0x48a8b2126c13d9feULL,    0xafdc541792e76eeaULL,
882     0x03d912bfc6d1898fULL,    0x31b1aafa1b83f51bULL,
883     0xf1ac2796e42ab7d9ULL,    0x40a3a7d7fcd2ebacULL,
884     0x1056136d0afbbcc5ULL,    0x7889e1dd9a6d0c85ULL,
885     0xd33525782a7974aaULL,    0xa7e25d09078ac09bULL,
886     0xbd4138b3eac6edd0ULL,    0x920abfbe71eb9e70ULL,
887     0xa2a5d0f54fc2625cULL,    0xc054e36b0b1290a3ULL,
888     0xf6dd59ff62fe932bULL,    0x3537354511a8ac7dULL,
889     0xca845e9172fadcd4ULL,    0x84f82b60329d20dcULL,
890     0x79c62ce1cd672f18ULL,    0x8b09a2add124642cULL,
891     0xd0c1e96a19d9e726ULL,    0x5a786a9b4ba9500cULL,
892     0x0e020336634c43f3ULL,    0xc17b474aeb66d822ULL,
893     0x6a731ae3ec9baac2ULL,    0x8226667ae0840258ULL,
894     0x67d4567691caeca5ULL,    0x1d94155c4875adb5ULL,
895     0x6d00fd985b813fdfULL,    0x51286efcb774cd06ULL,
896     0x5e8834471fa744afULL,    0xf72ca0aee761ae2eULL,
897     0xbe40e4cdaee8e09aULL,    0xe9970bbb5118f665ULL,
898     0x726e4beb33df1964ULL,    0x703b000729199762ULL,
899     0x4631d816f5ef30a7ULL,    0xb880b5b51504a6beULL,
900     0x641793c37ed84b6cULL,    0x7b21ed77f6e97d96ULL,
901     0x776306312ef96b73ULL,    0xae528948e86ff3f4ULL,
902     0x53dbd7f286a3f8f8ULL,    0x16cadce74cfc1063ULL,
903     0x005c19bdfa52c6ddULL,    0x68868f5d64d46ad3ULL,
904     0x3a9d512ccf1e186aULL,    0x367e62c2385660aeULL,
905     0xe359e7ea77dcb1d7ULL,    0x526c0773749abe6eULL,
906     0x735ae5f9d09f734bULL,    0x493fc7cc8a558ba8ULL,
907     0xb0b9c1533041ab45ULL,    0x321958ba470a59bdULL,
908     0x852db00b5f46c393ULL,    0x91209b2bd336b0e5ULL,
909     0x6e604f7d659ef19fULL,    0xb99a8ae2782ccb24ULL,
910     0xccf52ab6c814c4c7ULL,    0x4727d9afbe11727bULL,
911     0x7e950d0c0121b34dULL,    0x756f435670ad471fULL,
912     0xf5add442615a6849ULL,    0x4e87e09980b9957aULL,
913     0x2acfa1df50aee355ULL,    0xd898263afd2fd556ULL,
914     0xc8f4924dd80c8fd6ULL,    0xcf99ca3d754a173aULL,
915     0xfe477bacaf91bf3cULL,    0xed5371f6d690c12dULL,
916     0x831a5c285e687094ULL,    0xc5d3c90a3708a0a4ULL,
917     0x0f7f903717d06580ULL,    0x19f9bb13b8fdf27fULL,
918     0xb1bd6f1b4d502843ULL,    0x1c761ba38fff4012ULL,
919     0x0d1530c4e2e21f3bULL,    0x8943ce69a7372c8aULL,
920     0xe5184e11feb5ce66ULL,    0x618bdb80bd736621ULL,
921     0x7d29bad68b574d0bULL,    0x81bb613e25e6fe5bULL,
922     0x071c9c10bc07913fULL,    0xc7beeb7909ac2d97ULL,
923     0xc3e58d353bc5d757ULL,    0xeb017892f38f61e8ULL,
924     0xd4effb9c9b1cc21aULL,    0x99727d26f494f7abULL,
925     0xa3e063a2956b3e03ULL,    0x9d4a8b9a4aa09c30ULL,
926     0x3f6ab7d500090fb4ULL,    0x9cc0f2a057268ac0ULL,
927     0x3dee9d2dedbf42d1ULL,    0x330f49c87960a972ULL,
928     0xc6b2720287421b41ULL,    0x0ac59ec07c00369cULL,
929     0xef4eac49cb353425ULL,    0xf450244eef0129d8ULL,
930     0x8acc46e5caf4deb6ULL,    0x2ffeab63989263f7ULL,
931     0x8f7cb9fe5d7a4578ULL,    0x5bd8f7644e634635ULL,
932     0x427a7315bf2dc900ULL,    0x17d0c4aa2125261cULL,
933     0x3992486c93518e50ULL,    0xb4cbfee0a2d7d4c3ULL,
934     0x7c75d6202c5ddd8dULL,    0xdbc295d8e35b6c61ULL,
935     0x60b369d302032b19ULL,    0xce42685fdce44132ULL,
936     0x06f3ddb9ddf65610ULL,    0x8ea4d21db5e148f0ULL,
937     0x20b0fce62fcd496fULL,    0x2c1b912358b0ee31ULL,
938     0xb28317b818f5a308ULL,    0xa89c1e189ca6d2cfULL,
939     0x0c6b18576aaadbc8ULL,    0xb65deaa91299fae3ULL,
940     0xfb2b794b7f1027e7ULL,    0x04e4317f443b5bebULL,
941     0x4b852d325939d0a6ULL,    0xd5ae6beefb207ffcULL,
942     0x309682b281c7d374ULL,    0xbae309a194c3b475ULL,
943     0x8cc3f97b13b49f05ULL,    0x98a9422ff8293967ULL,
944     0x244b16b01076ff7cULL,    0xf8bf571c663d67eeULL,
945     0x1f0d6758eee30da1ULL,    0xc9b611d97adeb9b7ULL,
946     0xb7afd5887b6c57a2ULL,    0x6290ae846b984fe1ULL,
947     0x94df4cdeacc1a5fdULL,    0x058a5bd1c5483affULL,
948     0x63166cc142ba3c37ULL,    0x8db8526eb2f76f40ULL,
949     0xe10880036f0d6d4eULL,    0x9e0523c9971d311dULL,
950     0x45ec2824cc7cd691ULL,    0x575b8359e62382c9ULL,
951     0xfa9e400dc4889995ULL,    0xd1823ecb45721568ULL,
952     0xdafd983b8206082fULL,    0xaa7d29082386a8cbULL,
953     0x269fcd4403b87588ULL,    0x1b91f5f728bdd1e0ULL,
954     0xe4669f39040201f6ULL,    0x7a1d7c218cf04adeULL,
955     0x65623c29d79ce5ceULL,    0x2368449096c00bb1ULL,
956     0xab9bf1879da503baULL,    0xbc23ecb1a458058eULL,
957     0x9a58df01bb401eccULL,    0xa070e868a85f143dULL,
958     0x4ff188307df2239eULL,    0x14d565b41a641183ULL,
959     0xee13337452701602ULL,    0x950e3dcf3f285e09ULL,
960     0x59930254b9c80953ULL,    0x3bf299408930da6dULL,
961     0xa955943f53691387ULL,    0xa15edecaa9cb8784ULL,
962     0x29142127352be9a0ULL,    0x76f0371fff4e7afbULL,
963     0x0239f450274f2228ULL,    0xbb073af01d5e868bULL,
964     0xbfc80571c10e96c1ULL,    0xd267088568222e23ULL,
965     0x9671a3d48e80b5b0ULL,    0x55b5d38ae193bb81ULL,
966     0x693ae2d0a18b04b8ULL,    0x5c48b4ecadd5335fULL,
967     0xfd743b194916a1caULL,    0x2577018134be98c4ULL,
968     0xe77987e83c54a4adULL,    0x28e11014da33e1b9ULL,
969     0x270cc59e226aa213ULL,    0x71495f756d1a5f60ULL,
970     0x9be853fb60afef77ULL,    0xadc786a7f7443dbfULL,
971     0x0904456173b29a82ULL,    0x58bc7a66c232bd5eULL,
972     0xf306558c673ac8b2ULL,    0x41f639c6b6c9772aULL,
973     0x216defe99fda35daULL,    0x11640cc71c7be615ULL,
974     0x93c43694565c5527ULL,    0xea038e6246777839ULL,
975     0xf9abf3ce5a3e2469ULL,    0x741e768d0fd312d2ULL,
976     0x0144b883ced652c6ULL,    0xc20b5a5ba33f8552ULL,
977     0x1ae69633c3435a9dULL,    0x97a28ca4088cfdecULL,
978     0x8824a43c1e96f420ULL,    0x37612fa66eeea746ULL,
979     0x6b4cb165f9cf0e5aULL,    0x43aa1c06a0abfb4aULL,
980     0x7f4dc26ff162796bULL,    0x6cbacc8e54ed9b0fULL,
981     0xa6b7ffefd2bb253eULL,    0x2e25bc95b0a29d4fULL,
982     0x86d6a58bdef1388cULL,    0xded74ac576b6f054ULL,
983     0x8030bdbc2b45805dULL,    0x3c81af70e94d9289ULL,
984     0x3eff6dda9e3100dbULL,    0xb38dc39fdfcc8847ULL,
985     0x123885528d17b87eULL,    0xf2da0ed240b1b642ULL,
986     0x44cefadcd54bf9a9ULL,    0x1312200e433c7ee6ULL,
987     0x9ffcc84f3a78c748ULL,    0xf0cd1f72248576bbULL,
988     0xec6974053638cfe4ULL,    0x2ba7b67c0cec4e4cULL,
989     0xac2f4df3e5ce32edULL,    0xcb33d14326ea4c11ULL,
990     0xa4e9044cc77e58bcULL,    0x5f513293d934fcefULL,
991     0x5dc9645506e55444ULL,    0x50de418f317de40aULL,
992     0x388cb31a69dde259ULL,    0x2db4a83455820a86ULL,
993     0x9010a91e84711ae9ULL,    0x4df7f0b7b1498371ULL,
994     0xd62a2eabc0977179ULL,    0x22fac097aa8d5c0eULL,
995     0xf49fcc2ff1daf39bULL,    0x487fd5c66ff29281ULL,
996     0xe8a30667fcdca83fULL,    0x2c9b4be3d2fcce63ULL,
997     0xda3ff74b93fbbbc2ULL,    0x2fa165d2fe70ba66ULL,
998     0xa103e279970e93d4ULL,    0xbecdec77b0e45e71ULL,
999     0xcfb41e723985e497ULL,    0xb70aaa025ef75017ULL,
1000     0xd42309f03840b8e0ULL,    0x8efc1ad035898579ULL,
1001     0x96c6920be2b2abc5ULL,    0x66af4163375a9172ULL,
1002     0x2174abdcca7127fbULL,    0xb33ccea64a72ff41ULL,
1003     0xf04a4933083066a5ULL,    0x8d970acdd7289af5ULL,
1004     0x8f96e8e031c8c25eULL,    0xf3fec02276875d47ULL,
1005     0xec7bf310056190ddULL,    0xf5adb0aebb0f1491ULL,
1006     0x9b50f8850fd58892ULL,    0x4975488358b74de8ULL,
1007     0xa3354ff691531c61ULL,    0x0702bbe481d2c6eeULL,
1008     0x89fb24057deded98ULL,    0xac3075138596e902ULL,
1009     0x1d2d3580172772edULL,    0xeb738fc28e6bc30dULL,
1010     0x5854ef8f63044326ULL,    0x9e5c52325add3bbeULL,
1011     0x90aa53cf325c4623ULL,    0xc1d24d51349dd067ULL,
1012     0x2051cfeea69ea624ULL,    0x13220f0a862e7e4fULL,
1013     0xce39399404e04864ULL,    0xd9c42ca47086fcb7ULL,
1014     0x685ad2238a03e7ccULL,    0x066484b2ab2ff1dbULL,
1015     0xfe9d5d70efbf79ecULL,    0x5b13b9dd9c481854ULL,
1016     0x15f0d475ed1509adULL,    0x0bebcd060ec79851ULL,
1017     0xd58c6791183ab7f8ULL,    0xd1187c5052f3eee4ULL,
1018     0xc95d1192e54e82ffULL,    0x86eea14cb9ac6ca2ULL,
1019     0x3485beb153677d5dULL,    0xdd191d781f8c492aULL,
1020     0xf60866baa784ebf9ULL,    0x518f643ba2d08c74ULL,
1021     0x8852e956e1087c22ULL,    0xa768cb8dc410ae8dULL,
1022     0x38047726bfec8e1aULL,    0xa67738b4cd3b45aaULL,
1023     0xad16691cec0dde19ULL,    0xc6d4319380462e07ULL,
1024     0xc5a5876d0ba61938ULL,    0x16b9fa1fa58fd840ULL,
1025     0x188ab1173ca74f18ULL,    0xabda2f98c99c021fULL,
1026     0x3e0580ab134ae816ULL,    0x5f3b05b773645abbULL,
1027     0x2501a2be5575f2f6ULL,    0x1b2f74004e7e8ba9ULL,
1028     0x1cd7580371e8d953ULL,    0x7f6ed89562764e30ULL,
1029     0xb15926ff596f003dULL,    0x9f65293da8c5d6b9ULL,
1030     0x6ecef04dd690f84cULL,    0x4782275fff33af88ULL,
1031     0xe41433083f820801ULL,    0xfd0dfe409a1af9b5ULL,
1032     0x4325a3342cdb396bULL,    0x8ae77e62b301b252ULL,
1033     0xc36f9e9f6655615aULL,    0x85455a2d92d32c09ULL,
1034     0xf2c7dea949477485ULL,    0x63cfb4c133a39ebaULL,
1035     0x83b040cc6ebc5462ULL,    0x3b9454c8fdb326b0ULL,
1036     0x56f56a9e87ffd78cULL,    0x2dc2940d99f42bc6ULL,
1037     0x98f7df096b096e2dULL,    0x19a6e01e3ad852bfULL,
1038     0x42a99ccbdbd4b40bULL,    0xa59998af45e9c559ULL,
1039     0x366295e807d93186ULL,    0x6b48181bfaa1f773ULL,
1040     0x1fec57e2157a0a1dULL,    0x4667446af6201ad5ULL,
1041     0xe615ebcacfb0f075ULL,    0xb8f31f4f68290778ULL,
1042     0x22713ed6ce22d11eULL,    0x3057c1a72ec3c93bULL,
1043     0xcb46acc37c3f1f2fULL,    0xdbb893fd02aaf50eULL,
1044     0x331fd92e600b9fcfULL,    0xa498f96148ea3ad6ULL,
1045     0xa8d8426e8b6a83eaULL,    0xa089b274b7735cdcULL,
1046     0x87f6b3731e524a11ULL,    0x118808e5cbc96749ULL,
1047     0x9906e4c7b19bd394ULL,    0xafed7f7e9b24a20cULL,
1048     0x6509eadeeb3644a7ULL,    0x6c1ef1d3e8ef0edeULL,
1049     0xb9c97d43e9798fb4ULL,    0xa2f2d784740c28a3ULL,
1050     0x7b8496476197566fULL,    0x7a5be3e6b65f069dULL,
1051     0xf96330ed78be6f10ULL,    0xeee60de77a076a15ULL,
1052     0x2b4bee4aa08b9bd0ULL,    0x6a56a63ec7b8894eULL,
1053     0x02121359ba34fef4ULL,    0x4cbf99f8283703fcULL,
1054     0x398071350caf30c8ULL,    0xd0a77a89f017687aULL,
1055     0xf1c1a9eb9e423569ULL,    0x8c7976282dee8199ULL,
1056     0x5d1737a5dd1f7abdULL,    0x4f53433c09a9fa80ULL,
1057     0xfa8b0c53df7ca1d9ULL,    0x3fd9dcbc886ccb77ULL,
1058     0xc040917ca91b4720ULL,    0x7dd00142f9d1dcdfULL,
1059     0x8476fc1d4f387b58ULL,    0x23f8e7c5f3316503ULL,
1060     0x032a2244e7e37339ULL,    0x5c87a5d750f5a74bULL,
1061     0x082b4cc43698992eULL,    0xdf917becb858f63cULL,
1062     0x3270b8fc5bf86ddaULL,    0x10ae72bb29b5dd76ULL,
1063     0x576ac94e7700362bULL,    0x1ad112dac61efb8fULL,
1064     0x691bc30ec5faa427ULL,    0xff246311cc327143ULL,
1065     0x3142368e30e53206ULL,    0x71380e31e02ca396ULL,
1066     0x958d5c960aad76f1ULL,    0xf8d6f430c16da536ULL,
1067     0xc8ffd13f1be7e1d2ULL,    0x7578ae66004ddbe1ULL,
1068     0x05833f01067be646ULL,    0xbb34b5ad3bfe586dULL,
1069     0x095f34c9a12b97f0ULL,    0x247ab64525d60ca8ULL,
1070     0xdcdbc6f3017477d1ULL,    0x4a2e14d4decad24dULL,
1071     0xbdb5e6d9be0a1eebULL,    0x2a7e70f7794301abULL,
1072     0xdef42d8a270540fdULL,    0x01078ec0a34c22c1ULL,
1073     0xe5de511af4c16387ULL,    0x7ebb3a52bd9a330aULL,
1074     0x77697857aa7d6435ULL,    0x004e831603ae4c32ULL,
1075     0xe7a21020ad78e312ULL,    0x9d41a70c6ab420f2ULL,
1076     0x28e06c18ea1141e6ULL,    0xd2b28cbd984f6b28ULL,
1077     0x26b75f6c446e9d83ULL,    0xba47568c4d418d7fULL,
1078     0xd80badbfe6183d8eULL,    0x0e206d7f5f166044ULL,
1079     0xe258a43911cbca3eULL,    0x723a1746b21dc0bcULL,
1080     0xc7caa854f5d7cdd3ULL,    0x7cac32883d261d9cULL,
1081     0x7690c26423ba942cULL,    0x17e55524478042b8ULL,
1082     0xe0be477656a2389fULL,    0x4d289b5e67ab2da0ULL,
1083     0x44862b9c8fbbfd31ULL,    0xb47cc8049d141365ULL,
1084     0x822c1b362b91c793ULL,    0x4eb14655fb13dfd8ULL,
1085     0x1ecbba0714e2a97bULL,    0x6143459d5cde5f14ULL,
1086     0x53a8fbf1d5f0ac89ULL,    0x97ea04d81c5e5b00ULL,
1087     0x622181a8d4fdb3f3ULL,    0xe9bcd341572a1208ULL,
1088     0x1411258643cce58aULL,    0x9144c5fea4c6e0a4ULL,
1089     0x0d33d06565cf620fULL,    0x54a48d489f219ca1ULL,
1090     0xc43e5eac6d63c821ULL,    0xa9728b3a72770dafULL,
1091     0xd7934e7b20df87efULL,    0xe35503b61a3e86e5ULL,
1092     0xcae321fbc819d504ULL,    0x129a50b3ac60bfa6ULL,
1093     0xcd5e68ea7e9fb6c3ULL,    0xb01c90199483b1c7ULL,
1094     0x3de93cd5c295376cULL,    0xaed52edf2ab9ad13ULL,
1095     0x2e60f512c0a07884ULL,    0xbc3d86a3e36210c9ULL,
1096     0x35269d9b163951ceULL,    0x0c7d6e2ad0cdb5faULL,
1097     0x59e86297d87f5733ULL,    0x298ef221898db0e7ULL,
1098     0x55000029d1a5aa7eULL,    0x8bc08ae1b5061b45ULL,
1099     0xc2c31c2b6c92703aULL,    0x94cc596baf25ef42ULL,
1100     0x0a1d73db22540456ULL,    0x04b6a0f9d9c4179aULL,
1101     0xeffdafa2ae3d3c60ULL,    0xf7c8075bb49496c4ULL,
1102     0x9cc5c7141d1cd4e3ULL,    0x78bd1638218e5534ULL,
1103     0xb2f11568f850246aULL,    0xedfabcfa9502bc29ULL,
1104     0x796ce5f2da23051bULL,    0xaae128b0dc93537cULL,
1105     0x3a493da0ee4b29aeULL,    0xb5df6b2c416895d7ULL,
1106     0xfcabbd25122d7f37ULL,    0x70810b58105dc4b1ULL,
1107     0xe10fdd37f7882a90ULL,    0x524dcab5518a3f5cULL,
1108     0x3c9e85878451255bULL,    0x4029828119bd34e2ULL,
1109     0x74a05b6f5d3ceccbULL,    0xb610021542e13ecaULL,
1110     0x0ff979d12f59e2acULL,    0x6037da27e4f9cc50ULL,
1111     0x5e92975a0df1847dULL,    0xd66de190d3e623feULL,
1112     0x5032d6b87b568048ULL,    0x9a36b7ce8235216eULL,
1113     0x80272a7a24f64b4aULL,    0x93efed8b8c6916f7ULL,
1114     0x37ddbff44cce1555ULL,    0x4b95db5d4b99bd25ULL,
1115     0x92d3fda169812fc0ULL,    0xfb1a4a9a90660bb6ULL,
1116     0x730c196946a4b9b2ULL,    0x81e289aa7f49da68ULL,
1117     0x64669a0f83b1a05fULL,    0x27b3ff7d9644f48bULL,
1118     0xcc6b615c8db675b3ULL,    0x674f20b9bcebbe95ULL,
1119     0x6f31238275655982ULL,    0x5ae488713e45cf05ULL,
1120     0xbf619f9954c21157ULL,    0xeabac46040a8eae9ULL,
1121     0x454c6fe9f2c0c1cdULL,    0x419cf6496412691cULL,
1122     0xd3dc3bef265b0f70ULL,    0x6d0e60f5c3578a9eULL,
1123     0x5b0e608526323c55ULL,    0x1a46c1a9fa1b59f5ULL,
1124     0xa9e245a17c4c8ffaULL,    0x65ca5159db2955d7ULL,
1125     0x05db0a76ce35afc2ULL,    0x81eac77ea9113d45ULL,
1126     0x528ef88ab6ac0a0dULL,    0xa09ea253597be3ffULL,
1127     0x430ddfb3ac48cd56ULL,    0xc4b3a67af45ce46fULL,
1128     0x4ececfd8fbe2d05eULL,    0x3ef56f10b39935f0ULL,
1129     0x0b22d6829cd619c6ULL,    0x17fd460a74df2069ULL,
1130     0x6cf8cc8e8510ed40ULL,    0xd6c824bf3a6ecaa7ULL,
1131     0x61243d581a817049ULL,    0x048bacb6bbc163a2ULL,
1132     0xd9a38ac27d44cc32ULL,    0x7fddff5baaf410abULL,
1133     0xad6d495aa804824bULL,    0xe1a6a74f2d8c9f94ULL,
1134     0xd4f7851235dee8e3ULL,    0xfd4b7f886540d893ULL,
1135     0x247c20042aa4bfdaULL,    0x096ea1c517d1327cULL,
1136     0xd56966b4361a6685ULL,    0x277da5c31221057dULL,
1137     0x94d59893a43acff7ULL,    0x64f0c51ccdc02281ULL,
1138     0x3d33bcc4ff6189dbULL,    0xe005cb184ce66af1ULL,
1139     0xff5ccd1d1db99beaULL,    0xb0b854a7fe42980fULL,
1140     0x7bd46a6a718d4b9fULL,    0xd10fa8cc22a5fd8cULL,
1141     0xd31484952be4bd31ULL,    0xc7fa975fcb243847ULL,
1142     0x4886ed1e5846c407ULL,    0x28cddb791eb70b04ULL,
1143     0xc2b00be2f573417fULL,    0x5c9590452180f877ULL,
1144     0x7a6bddfff370eb00ULL,    0xce509e38d6d9d6a4ULL,
1145     0xebeb0f00647fa702ULL,    0x1dcc06cf76606f06ULL,
1146     0xe4d9f28ba286ff0aULL,    0xd85a305dc918c262ULL,
1147     0x475b1d8732225f54ULL,    0x2d4fb51668ccb5feULL,
1148     0xa679b9d9d72bba20ULL,    0x53841c0d912d43a5ULL,
1149     0x3b7eaa48bf12a4e8ULL,    0x781e0e47f22f1ddfULL,
1150     0xeff20ce60ab50973ULL,    0x20d261d19dffb742ULL,
1151     0x16a12b03062a2e39ULL,    0x1960eb2239650495ULL,
1152     0x251c16fed50eb8b8ULL,    0x9ac0c330f826016eULL,
1153     0xed152665953e7671ULL,    0x02d63194a6369570ULL,
1154     0x5074f08394b1c987ULL,    0x70ba598c90b25ce1ULL,
1155     0x794a15810b9742f6ULL,    0x0d5925e9fcaf8c6cULL,
1156     0x3067716cd868744eULL,    0x910ab077e8d7731bULL,
1157     0x6a61bbdb5ac42f61ULL,    0x93513efbf0851567ULL,
1158     0xf494724b9e83e9d5ULL,    0xe887e1985c09648dULL,
1159     0x34b1d3c675370cfdULL,    0xdc35e433bc0d255dULL,
1160     0xd0aab84234131be0ULL,    0x08042a50b48b7eafULL,
1161     0x9997c4ee44a3ab35ULL,    0x829a7b49201799d0ULL,
1162     0x263b8307b7c54441ULL,    0x752f95f4fd6a6ca6ULL,
1163     0x927217402c08c6e5ULL,    0x2a8ab754a795d9eeULL,
1164     0xa442f7552f72943dULL,    0x2c31334e19781208ULL,
1165     0x4fa98d7ceaee6291ULL,    0x55c3862f665db309ULL,
1166     0xbd0610175d53b1f3ULL,    0x46fe6cb840413f27ULL,
1167     0x3fe03792df0cfa59ULL,    0xcfe700372eb85e8fULL,
1168     0xa7be29e7adbce118ULL,    0xe544ee5cde8431ddULL,
1169     0x8a781b1b41f1873eULL,    0xa5c94c78a0d2f0e7ULL,
1170     0x39412e2877b60728ULL,    0xa1265ef3afc9a62cULL,
1171     0xbcc2770c6a2506c5ULL,    0x3ab66dd5dce1ce12ULL,
1172     0xe65499d04a675b37ULL,    0x7d8f523481bfd216ULL,
1173     0x0f6f64fcec15f389ULL,    0x74efbe618b5b13c8ULL,
1174     0xacdc82b714273e1dULL,    0xdd40bfe003199d17ULL,
1175     0x37e99257e7e061f8ULL,    0xfa52626904775aaaULL,
1176     0x8bbbf63a463d56f9ULL,    0xf0013f1543a26e64ULL,
1177     0xa8307e9f879ec898ULL,    0xcc4c27a4150177ccULL,
1178     0x1b432f2cca1d3348ULL,    0xde1d1f8f9f6fa013ULL,
1179     0x606602a047a7ddd6ULL,    0xd237ab64cc1cb2c7ULL,
1180     0x9b938e7225fcd1d3ULL,    0xec4e03708e0ff476ULL,
1181     0xfeb2fbda3d03c12dULL,    0xae0bced2ee43889aULL,
1182     0x22cb8923ebfb4f43ULL,    0x69360d013cf7396dULL,
1183     0x855e3602d2d4e022ULL,    0x073805bad01f784cULL,
1184     0x33e17a133852f546ULL,    0xdf4874058ac7b638ULL,
1185     0xba92b29c678aa14aULL,    0x0ce89fc76cfaadcdULL,
1186     0x5f9d4e0908339e34ULL,    0xf1afe9291f5923b9ULL,
1187     0x6e3480f60f4a265fULL,    0xeebf3a2ab29b841cULL,
1188     0xe21938a88f91b4adULL,    0x57dfeff845c6d3c3ULL,
1189     0x2f006b0bf62caaf2ULL,    0x62f479ef6f75ee78ULL,
1190     0x11a55ad41c8916a9ULL,    0xf229d29084fed453ULL,
1191     0x42f1c27b16b000e6ULL,    0x2b1f76749823c074ULL,
1192     0x4b76eca3c2745360ULL,    0x8c98f463b91691bdULL,
1193     0x14bcc93cf1ade66aULL,    0x8885213e6d458397ULL,
1194     0x8e177df0274d4711ULL,    0xb49b73b5503f2951ULL,
1195     0x10168168c3f96b6bULL,    0x0e3d963b63cab0aeULL,
1196     0x8dfc4b5655a1db14ULL,    0xf789f1356e14de5cULL,
1197     0x683e68af4e51dac1ULL,    0xc9a84f9d8d4b0fd9ULL,
1198     0x3691e03f52a0f9d1ULL,    0x5ed86e46e1878e80ULL,
1199     0x3c711a0e99d07150ULL,    0x5a0865b20c4e9310ULL,
1200     0x56fbfc1fe4f0682eULL,    0xea8d5de3105edf9bULL,
1201     0x71abfdb12379187aULL,    0x2eb99de1bee77b9cULL,
1202     0x21ecc0ea33cf4523ULL,    0x59a4d7521805c7a1ULL,
1203     0x3896f5eb56ae7c72ULL,    0xaa638f3db18f75dcULL,
1204     0x9f39358dabe9808eULL,    0xb7defa91c00b72acULL,
1205     0x6b5541fd62492d92ULL,    0x6dc6dee8f92e4d5bULL,
1206     0x353f57abc4beea7eULL,    0x735769d6da5690ceULL,
1207     0x0a234aa642391484ULL,    0xf6f9508028f80d9dULL,
1208     0xb8e319a27ab3f215ULL,    0x31ad9c1151341a4dULL,
1209     0x773c22a57bef5805ULL,    0x45c7561a07968633ULL,
1210     0xf913da9e249dbe36ULL,    0xda652d9b78a64c68ULL,
1211     0x4c27a97f3bc334efULL,    0x76621220e66b17f4ULL,
1212     0x967743899acd7d0bULL,    0xf3ee5bcae0ed6782ULL,
1213     0x409f753600c879fcULL,    0x06d09a39b5926db6ULL,
1214     0x6f83aeb0317ac588ULL,    0x01e6ca4a86381f21ULL,
1215     0x66ff3462d19f3025ULL,    0x72207c24ddfd3bfbULL,
1216     0x4af6b6d3e2ece2ebULL,    0x9c994dbec7ea08deULL,
1217     0x49ace597b09a8bc4ULL,    0xb38c4766cf0797baULL,
1218     0x131b9373c57c2a75ULL,    0xb1822cce61931e58ULL,
1219     0x9d7555b909ba1c0cULL,    0x127fafdd937d11d2ULL,
1220     0x29da3badc66d92e4ULL,    0xa2c1d57154c2ecbcULL,
1221     0x58c5134d82f6fe24ULL,    0x1c3ae3515b62274fULL,
1222     0xe907c82e01cb8126ULL,    0xf8ed091913e37fcbULL,
1223     0x3249d8f9c80046c9ULL,    0x80cf9bede388fb63ULL,
1224     0x1881539a116cf19eULL,    0x5103f3f76bd52457ULL,
1225     0x15b7e6f5ae47f7a8ULL,    0xdbd7c6ded47e9ccfULL,
1226     0x44e55c410228bb1aULL,    0xb647d4255edb4e99ULL,
1227     0x5d11882bb8aafc30ULL,    0xf5098bbb29d3212aULL,
1228     0x8fb5ea14e90296b3ULL,    0x677b942157dd025aULL,
1229     0xfb58e7c0a390acb5ULL,    0x89d3674c83bd4a01ULL,
1230     0x9e2da4df4bf3b93bULL,    0xfcc41e328cab4829ULL,
1231     0x03f38c96ba582c52ULL,    0xcad1bdbd7fd85db2ULL,
1232     0xbbb442c16082ae83ULL,    0xb95fe86ba5da9ab0ULL,
1233     0xb22e04673771a93fULL,    0x845358c9493152d8ULL,
1234     0xbe2a488697b4541eULL,    0x95a2dc2dd38e6966ULL,
1235     0xc02c11ac923c852bULL,    0x2388b1990df2a87bULL,
1236     0x7c8008fa1b4f37beULL,    0x1f70d0c84d54e503ULL,
1237     0x5490adec7ece57d4ULL,    0x002b3c27d9063a3aULL,
1238     0x7eaea3848030a2bfULL,    0xc602326ded2003c0ULL,
1239     0x83a7287d69a94086ULL,    0xc57a5fcb30f57a8aULL,
1240     0xb56844e479ebe779ULL,    0xa373b40f05dcbce9ULL,
1241     0xd71a786e88570ee2ULL,    0x879cbacdbde8f6a0ULL,
1242     0x976ad1bcc164a32fULL,    0xab21e25e9666d78bULL,
1243     0x901063aae5e5c33cULL,    0x9818b34448698d90ULL,
1244     0xe36487ae3e1e8abbULL,    0xafbdf931893bdcb4ULL,
1245     0x6345a0dc5fbbd519ULL,    0x8628fe269b9465caULL,
1246     0x1e5d01603f9c51ecULL,    0x4de44006a15049b7ULL,
1247     0xbf6c70e5f776cbb1ULL,    0x411218f2ef552bedULL,
1248     0xcb0c0708705a36a3ULL,    0xe74d14754f986044ULL,
1249     0xcd56d9430ea8280eULL,    0xc12591d7535f5065ULL,
1250     0xc83223f1720aef96ULL,    0xc3a0396f7363a51fULL
1251 };