1 /*******************************************************************************
2 
3         copyright:      Copyright (c) 2006 Tango. All rights reserved
4 
5         license:        BSD style: see doc/license.txt for details
6 
7         version:        Initial release: Feb 2006
8 
9         author:         Regan Heath, Oskar Linde
10 
11         This module implements the Tiger algorithm by Ross Anderson and Eli
12         Biham.
13 
14 *******************************************************************************/
15 
16 module tango.util.digest.Tiger;
17 
18 private import tango.core.ByteSwap;
19 
20 private import tango.util.digest.MerkleDamgard;
21 
22 public  import tango.util.digest.Digest;
23 
24 /*******************************************************************************
25 
26 *******************************************************************************/
27 
28 final class Tiger : MerkleDamgard
29 {
30         private ulong[3]        context;
31         private uint            npass = 3;
32         private enum uint       padChar = 0x01;
33 
34         /***********************************************************************
35 
36         ***********************************************************************/
37 
38         private __gshared immutable ulong[3] initial =
39         [
40                 0x0123456789ABCDEF,
41                 0xFEDCBA9876543210,
42                 0xF096A5B4C3B2E187
43         ];
44 
45         /***********************************************************************
46 
47                 Construct an Tiger
48 
49         ***********************************************************************/
50 
51         this() { }
52 
53         /***********************************************************************
54 
55                 The size of a tiger digest is 24 bytes
56                 
57         ***********************************************************************/
58 
59         override uint digestSize() {return 24;}
60         
61 
62         /***********************************************************************
63 
64                 Initialize the cipher
65 
66                 Remarks:
67                 Returns the cipher state to it's initial value
68 
69         ***********************************************************************/
70 
71         override void reset()
72         {
73                 super.reset();
74                 context[] = initial[];
75         }
76 
77         /***********************************************************************
78 
79                 Obtain the digest
80 
81                 Returns:
82                 the digest
83 
84                 Remarks:
85                 Returns a digest of the current cipher state, this may be the
86                 final digest, or a digest of the state between calls to update()
87 
88         ***********************************************************************/
89 
90         override void createDigest(ubyte[] buf)
91         {
92                 version (BigEndian)
93                         ByteSwap.swap64 (context.ptr, context.length * ulong.sizeof);
94                 buf[] = (cast(ubyte[]) context)[];
95         }
96 
97         /***********************************************************************
98 
99                 Get the number of passes being performed
100 
101                 Returns:
102                 the number of passes
103 
104                 Remarks:
105                 The Tiger algorithm may perform an arbitrary number of passes
106                 the minimum recommended number is 3 and this number should be
107                 quite secure however the "ultra-cautious" may wish to increase
108                 this number.
109 
110         ***********************************************************************/
111 
112         uint passes()
113         {
114                 return npass;
115         }
116 
117         /***********************************************************************
118 
119                 Set the number of passes to be performed
120 
121                 Params:
122                 n = the number of passes to perform
123 
124                 Remarks:
125                 The Tiger algorithm may perform an arbitrary number of passes
126                 the minimum recommended number is 3 and this number should be
127                 quite secure however the "ultra-cautious" may wish to increase
128                 this number.
129 
130         ***********************************************************************/
131 
132         void passes(uint n)
133         {
134                 if (n < 3) return ;
135                 npass = n;
136         }
137 
138         /***********************************************************************
139 
140                  block size
141 
142                 Returns:
143                 the block size
144 
145                 Remarks:
146                 Specifies the size (in bytes) of the block of data to pass to
147                 each call to transform(). For Tiger the blockSize is 64.
148 
149         ***********************************************************************/
150 
151         protected override uint blockSize() { return 64; }
152 
153         /***********************************************************************
154 
155                 Length padding size
156 
157                 Returns:
158                 the length padding size
159 
160                 Remarks:
161                 Specifies the size (in bytes) of the padding which uses the
162                 length of the data which has been ciphered, this padding is
163                 carried out by the padLength method. For Tiger the addSize is 8.
164 
165         ***********************************************************************/
166 
167         protected override uint addSize()   { return 8;  }
168 
169         /***********************************************************************
170 
171                 Pads the cipher data
172 
173                 Params:
174                 data = a slice of the cipher buffer to fill with padding
175 
176                 Remarks:
177                 Fills the passed buffer slice with the appropriate padding for
178                 the final call to transform(). This padding will fill the cipher
179                 buffer up to blockSize()-addSize().
180 
181         ***********************************************************************/
182 
183         protected override void padMessage(ubyte[] at)
184         {
185                 at[0] = padChar;
186                 at[1..at.length] = 0;
187         }
188 
189         /***********************************************************************
190 
191                 Performs the length padding
192 
193                 Params:
194                 data   = the slice of the cipher buffer to fill with padding
195                 length = the length of the data which has been ciphered
196 
197                 Remarks:
198                 Fills the passed buffer slice with addSize() bytes of padding
199                 based on the length in bytes of the input data which has been
200                 ciphered.
201 
202         ***********************************************************************/
203 
204         protected override void padLength(ubyte[] at, ulong length)
205         {
206                 length <<= 3;
207                 littleEndian64((cast(ubyte*)&length)[0..8],cast(ulong[]) at); 
208         }
209 
210         /***********************************************************************
211 
212                 Performs the cipher on a block of data
213 
214                 Params:
215                 data = the block of data to cipher
216 
217                 Remarks:
218                 The actual cipher algorithm is carried out by this method on
219                 the passed block of data. This method is called for every
220                 blockSize() bytes of input data and once more with the remaining
221                 data padded to blockSize().
222 
223         ***********************************************************************/
224 
225         protected override void transform(const(ubyte[]) input)
226         {
227                 ulong tmpa,a,b,c;
228                 ulong[8] x;
229                 uint i;
230 
231                 littleEndian64(input,x);
232 
233                 a = context[0];
234                 b = context[1];
235                 c = context[2];
236 
237                 for(i = 0; i < npass; i++) {
238                         if (i > 0) keySchedule(x);
239                         pass(a,b,c,x,(i==0)?5:(i==1)?7:9);
240                         tmpa = a; a = c; c = b; b = tmpa;
241                 }
242 
243                 context[0] = a ^ context[0];
244                 context[1] = b - context[1];
245                 context[2] = c + context[2];
246 
247                 x[] = 0;
248         }
249 
250         /***********************************************************************
251 
252         ***********************************************************************/
253 
254         private static ubyte getByte(ulong c, uint b1, uint b2 = 0)
255         {
256                 return cast(ubyte) (c >> (b1*8) >> (b2*8));
257         }
258 
259         /***********************************************************************
260 
261         ***********************************************************************/
262 
263         private static void round(ref ulong a, ref ulong b, ref ulong c, ulong x, ulong mul)
264         {
265                 c ^= x;
266                 a -= t1[getByte(c,0)] ^ t2[getByte(c,2)] ^ t3[getByte(c,4)] ^ t4[getByte(c,4,2)];
267                 b += t4[getByte(c,1)] ^ t3[getByte(c,3)] ^ t2[getByte(c,4,1)] ^ t1[getByte(c,4,3)];
268                 b *= mul;
269         }
270 
271         /***********************************************************************
272 
273         ***********************************************************************/
274 
275         private static void pass(ref ulong a, ref ulong b, ref ulong c, ref ulong[8] x, ulong mul)
276         {
277                 round(a,b,c,x[0],mul);
278                 round(b,c,a,x[1],mul);
279                 round(c,a,b,x[2],mul);
280                 round(a,b,c,x[3],mul);
281                 round(b,c,a,x[4],mul);
282                 round(c,a,b,x[5],mul);
283                 round(a,b,c,x[6],mul);
284                 round(b,c,a,x[7],mul);
285         }
286 
287         /***********************************************************************
288 
289         ***********************************************************************/
290 
291         private static void keySchedule(ref ulong[8] x)
292         {
293                 x[0] -= x[7] ^ 0xA5A5A5A5A5A5A5A5;
294                 x[1] ^= x[0];
295                 x[2] += x[1];
296                 x[3] -= x[2] ^ ((~x[1])<<19);
297                 x[4] ^= x[3];
298                 x[5] += x[4];
299                 x[6] -= x[5] ^ ((~x[4])>>23);
300                 x[7] ^= x[6];
301                 x[0] += x[7];
302                 x[1] -= x[0] ^ ((~x[7])<<19);
303                 x[2] ^= x[1];
304                 x[3] += x[2];
305                 x[4] -= x[3] ^ ((~x[2])>>23);
306                 x[5] ^= x[4];
307                 x[6] += x[5];
308                 x[7] -= x[6] ^ 0x0123456789ABCDEF;
309         }
310 
311         /***********************************************************************
312 
313         ***********************************************************************/
314 
315         @property private static const(ulong)[] t1() { return table[0..256]; }
316         @property private static const(ulong)[] t2() { return table[256..512]; }
317         @property private static const(ulong)[] t3() { return table[512..768]; }
318         @property private static const(ulong)[] t4() { return table[768..1024]; }
319 }
320 
321 
322 /*******************************************************************************
323 
324 *******************************************************************************/
325 
326 private __gshared immutable ulong[1024] table = 
327 [
328     0x02aab17cf7e90c5e   /*    0 */,    0xac424b03e243a8ec   /*    1 */,
329     0x72cd5be30dd5fcd3   /*    2 */,    0x6d019b93f6f97f3a   /*    3 */,
330     0xcd9978ffd21f9193   /*    4 */,    0x7573a1c9708029e2   /*    5 */,
331     0xb164326b922a83c3   /*    6 */,    0x46883eee04915870   /*    7 */,
332     0xeaace3057103ece6   /*    8 */,    0xc54169b808a3535c   /*    9 */,
333     0x4ce754918ddec47c   /*   10 */,    0x0aa2f4dfdc0df40c   /*   11 */,
334     0x10b76f18a74dbefa   /*   12 */,    0xc6ccb6235ad1ab6a   /*   13 */,
335     0x13726121572fe2ff   /*   14 */,    0x1a488c6f199d921e   /*   15 */,
336     0x4bc9f9f4da0007ca   /*   16 */,    0x26f5e6f6e85241c7   /*   17 */,
337     0x859079dbea5947b6   /*   18 */,    0x4f1885c5c99e8c92   /*   19 */,
338     0xd78e761ea96f864b   /*   20 */,    0x8e36428c52b5c17d   /*   21 */,
339     0x69cf6827373063c1   /*   22 */,    0xb607c93d9bb4c56e   /*   23 */,
340     0x7d820e760e76b5ea   /*   24 */,    0x645c9cc6f07fdc42   /*   25 */,
341     0xbf38a078243342e0   /*   26 */,    0x5f6b343c9d2e7d04   /*   27 */,
342     0xf2c28aeb600b0ec6   /*   28 */,    0x6c0ed85f7254bcac   /*   29 */,
343     0x71592281a4db4fe5   /*   30 */,    0x1967fa69ce0fed9f   /*   31 */,
344     0xfd5293f8b96545db   /*   32 */,    0xc879e9d7f2a7600b   /*   33 */,
345     0x860248920193194e   /*   34 */,    0xa4f9533b2d9cc0b3   /*   35 */,
346     0x9053836c15957613   /*   36 */,    0xdb6dcf8afc357bf1   /*   37 */,
347     0x18beea7a7a370f57   /*   38 */,    0x037117ca50b99066   /*   39 */,
348     0x6ab30a9774424a35   /*   40 */,    0xf4e92f02e325249b   /*   41 */,
349     0x7739db07061ccae1   /*   42 */,    0xd8f3b49ceca42a05   /*   43 */,
350     0xbd56be3f51382f73   /*   44 */,    0x45faed5843b0bb28   /*   45 */,
351     0x1c813d5c11bf1f83   /*   46 */,    0x8af0e4b6d75fa169   /*   47 */,
352     0x33ee18a487ad9999   /*   48 */,    0x3c26e8eab1c94410   /*   49 */,
353     0xb510102bc0a822f9   /*   50 */,    0x141eef310ce6123b   /*   51 */,
354     0xfc65b90059ddb154   /*   52 */,    0xe0158640c5e0e607   /*   53 */,
355     0x884e079826c3a3cf   /*   54 */,    0x930d0d9523c535fd   /*   55 */,
356     0x35638d754e9a2b00   /*   56 */,    0x4085fccf40469dd5   /*   57 */,
357     0xc4b17ad28be23a4c   /*   58 */,    0xcab2f0fc6a3e6a2e   /*   59 */,
358     0x2860971a6b943fcd   /*   60 */,    0x3dde6ee212e30446   /*   61 */,
359     0x6222f32ae01765ae   /*   62 */,    0x5d550bb5478308fe   /*   63 */,
360     0xa9efa98da0eda22a   /*   64 */,    0xc351a71686c40da7   /*   65 */,
361     0x1105586d9c867c84   /*   66 */,    0xdcffee85fda22853   /*   67 */,
362     0xccfbd0262c5eef76   /*   68 */,    0xbaf294cb8990d201   /*   69 */,
363     0xe69464f52afad975   /*   70 */,    0x94b013afdf133e14   /*   71 */,
364     0x06a7d1a32823c958   /*   72 */,    0x6f95fe5130f61119   /*   73 */,
365     0xd92ab34e462c06c0   /*   74 */,    0xed7bde33887c71d2   /*   75 */,
366     0x79746d6e6518393e   /*   76 */,    0x5ba419385d713329   /*   77 */,
367     0x7c1ba6b948a97564   /*   78 */,    0x31987c197bfdac67   /*   79 */,
368     0xde6c23c44b053d02   /*   80 */,    0x581c49fed002d64d   /*   81 */,
369     0xdd474d6338261571   /*   82 */,    0xaa4546c3e473d062   /*   83 */,
370     0x928fce349455f860   /*   84 */,    0x48161bbacaab94d9   /*   85 */,
371     0x63912430770e6f68   /*   86 */,    0x6ec8a5e602c6641c   /*   87 */,
372     0x87282515337ddd2b   /*   88 */,    0x2cda6b42034b701b   /*   89 */,
373     0xb03d37c181cb096d   /*   90 */,    0xe108438266c71c6f   /*   91 */,
374     0x2b3180c7eb51b255   /*   92 */,    0xdf92b82f96c08bbc   /*   93 */,
375     0x5c68c8c0a632f3ba   /*   94 */,    0x5504cc861c3d0556   /*   95 */,
376     0xabbfa4e55fb26b8f   /*   96 */,    0x41848b0ab3baceb4   /*   97 */,
377     0xb334a273aa445d32   /*   98 */,    0xbca696f0a85ad881   /*   99 */,
378     0x24f6ec65b528d56c   /*  100 */,    0x0ce1512e90f4524a   /*  101 */,
379     0x4e9dd79d5506d35a   /*  102 */,    0x258905fac6ce9779   /*  103 */,
380     0x2019295b3e109b33   /*  104 */,    0xf8a9478b73a054cc   /*  105 */,
381     0x2924f2f934417eb0   /*  106 */,    0x3993357d536d1bc4   /*  107 */,
382     0x38a81ac21db6ff8b   /*  108 */,    0x47c4fbf17d6016bf   /*  109 */,
383     0x1e0faadd7667e3f5   /*  110 */,    0x7abcff62938beb96   /*  111 */,
384     0xa78dad948fc179c9   /*  112 */,    0x8f1f98b72911e50d   /*  113 */,
385     0x61e48eae27121a91   /*  114 */,    0x4d62f7ad31859808   /*  115 */,
386     0xeceba345ef5ceaeb   /*  116 */,    0xf5ceb25ebc9684ce   /*  117 */,
387     0xf633e20cb7f76221   /*  118 */,    0xa32cdf06ab8293e4   /*  119 */,
388     0x985a202ca5ee2ca4   /*  120 */,    0xcf0b8447cc8a8fb1   /*  121 */,
389     0x9f765244979859a3   /*  122 */,    0xa8d516b1a1240017   /*  123 */,
390     0x0bd7ba3ebb5dc726   /*  124 */,    0xe54bca55b86adb39   /*  125 */,
391     0x1d7a3afd6c478063   /*  126 */,    0x519ec608e7669edd   /*  127 */,
392     0x0e5715a2d149aa23   /*  128 */,    0x177d4571848ff194   /*  129 */,
393     0xeeb55f3241014c22   /*  130 */,    0x0f5e5ca13a6e2ec2   /*  131 */,
394     0x8029927b75f5c361   /*  132 */,    0xad139fabc3d6e436   /*  133 */,
395     0x0d5df1a94ccf402f   /*  134 */,    0x3e8bd948bea5dfc8   /*  135 */,
396     0xa5a0d357bd3ff77e   /*  136 */,    0xa2d12e251f74f645   /*  137 */,
397     0x66fd9e525e81a082   /*  138 */,    0x2e0c90ce7f687a49   /*  139 */,
398     0xc2e8bcbeba973bc5   /*  140 */,    0x000001bce509745f   /*  141 */,
399     0x423777bbe6dab3d6   /*  142 */,    0xd1661c7eaef06eb5   /*  143 */,
400     0xa1781f354daacfd8   /*  144 */,    0x2d11284a2b16affc   /*  145 */,
401     0xf1fc4f67fa891d1f   /*  146 */,    0x73ecc25dcb920ada   /*  147 */,
402     0xae610c22c2a12651   /*  148 */,    0x96e0a810d356b78a   /*  149 */,
403     0x5a9a381f2fe7870f   /*  150 */,    0xd5ad62ede94e5530   /*  151 */,
404     0xd225e5e8368d1427   /*  152 */,    0x65977b70c7af4631   /*  153 */,
405     0x99f889b2de39d74f   /*  154 */,    0x233f30bf54e1d143   /*  155 */,
406     0x9a9675d3d9a63c97   /*  156 */,    0x5470554ff334f9a8   /*  157 */,
407     0x166acb744a4f5688   /*  158 */,    0x70c74caab2e4aead   /*  159 */,
408     0xf0d091646f294d12   /*  160 */,    0x57b82a89684031d1   /*  161 */,
409     0xefd95a5a61be0b6b   /*  162 */,    0x2fbd12e969f2f29a   /*  163 */,
410     0x9bd37013feff9fe8   /*  164 */,    0x3f9b0404d6085a06   /*  165 */,
411     0x4940c1f3166cfe15   /*  166 */,    0x09542c4dcdf3defb   /*  167 */,
412     0xb4c5218385cd5ce3   /*  168 */,    0xc935b7dc4462a641   /*  169 */,
413     0x3417f8a68ed3b63f   /*  170 */,    0xb80959295b215b40   /*  171 */,
414     0xf99cdaef3b8c8572   /*  172 */,    0x018c0614f8fcb95d   /*  173 */,
415     0x1b14accd1a3acdf3   /*  174 */,    0x84d471f200bb732d   /*  175 */,
416     0xc1a3110e95e8da16   /*  176 */,    0x430a7220bf1a82b8   /*  177 */,
417     0xb77e090d39df210e   /*  178 */,    0x5ef4bd9f3cd05e9d   /*  179 */,
418     0x9d4ff6da7e57a444   /*  180 */,    0xda1d60e183d4a5f8   /*  181 */,
419     0xb287c38417998e47   /*  182 */,    0xfe3edc121bb31886   /*  183 */,
420     0xc7fe3ccc980ccbef   /*  184 */,    0xe46fb590189bfd03   /*  185 */,
421     0x3732fd469a4c57dc   /*  186 */,    0x7ef700a07cf1ad65   /*  187 */,
422     0x59c64468a31d8859   /*  188 */,    0x762fb0b4d45b61f6   /*  189 */,
423     0x155baed099047718   /*  190 */,    0x68755e4c3d50baa6   /*  191 */,
424     0xe9214e7f22d8b4df   /*  192 */,    0x2addbf532eac95f4   /*  193 */,
425     0x32ae3909b4bd0109   /*  194 */,    0x834df537b08e3450   /*  195 */,
426     0xfa209da84220728d   /*  196 */,    0x9e691d9b9efe23f7   /*  197 */,
427     0x0446d288c4ae8d7f   /*  198 */,    0x7b4cc524e169785b   /*  199 */,
428     0x21d87f0135ca1385   /*  200 */,    0xcebb400f137b8aa5   /*  201 */,
429     0x272e2b66580796be   /*  202 */,    0x3612264125c2b0de   /*  203 */,
430     0x057702bdad1efbb2   /*  204 */,    0xd4babb8eacf84be9   /*  205 */,
431     0x91583139641bc67b   /*  206 */,    0x8bdc2de08036e024   /*  207 */,
432     0x603c8156f49f68ed   /*  208 */,    0xf7d236f7dbef5111   /*  209 */,
433     0x9727c4598ad21e80   /*  210 */,    0xa08a0896670a5fd7   /*  211 */,
434     0xcb4a8f4309eba9cb   /*  212 */,    0x81af564b0f7036a1   /*  213 */,
435     0xc0b99aa778199abd   /*  214 */,    0x959f1ec83fc8e952   /*  215 */,
436     0x8c505077794a81b9   /*  216 */,    0x3acaaf8f056338f0   /*  217 */,
437     0x07b43f50627a6778   /*  218 */,    0x4a44ab49f5eccc77   /*  219 */,
438     0x3bc3d6e4b679ee98   /*  220 */,    0x9cc0d4d1cf14108c   /*  221 */,
439     0x4406c00b206bc8a0   /*  222 */,    0x82a18854c8d72d89   /*  223 */,
440     0x67e366b35c3c432c   /*  224 */,    0xb923dd61102b37f2   /*  225 */,
441     0x56ab2779d884271d   /*  226 */,    0xbe83e1b0ff1525af   /*  227 */,
442     0xfb7c65d4217e49a9   /*  228 */,    0x6bdbe0e76d48e7d4   /*  229 */,
443     0x08df828745d9179e   /*  230 */,    0x22ea6a9add53bd34   /*  231 */,
444     0xe36e141c5622200a   /*  232 */,    0x7f805d1b8cb750ee   /*  233 */,
445     0xafe5c7a59f58e837   /*  234 */,    0xe27f996a4fb1c23c   /*  235 */,
446     0xd3867dfb0775f0d0   /*  236 */,    0xd0e673de6e88891a   /*  237 */,
447     0x123aeb9eafb86c25   /*  238 */,    0x30f1d5d5c145b895   /*  239 */,
448     0xbb434a2dee7269e7   /*  240 */,    0x78cb67ecf931fa38   /*  241 */,
449     0xf33b0372323bbf9c   /*  242 */,    0x52d66336fb279c74   /*  243 */,
450     0x505f33ac0afb4eaa   /*  244 */,    0xe8a5cd99a2cce187   /*  245 */,
451     0x534974801e2d30bb   /*  246 */,    0x8d2d5711d5876d90   /*  247 */,
452     0x1f1a412891bc038e   /*  248 */,    0xd6e2e71d82e56648   /*  249 */,
453     0x74036c3a497732b7   /*  250 */,    0x89b67ed96361f5ab   /*  251 */,
454     0xffed95d8f1ea02a2   /*  252 */,    0xe72b3bd61464d43d   /*  253 */,
455     0xa6300f170bdc4820   /*  254 */,    0xebc18760ed78a77a   /*  255 */,
456     0xe6a6be5a05a12138   /*  256 */,    0xb5a122a5b4f87c98   /*  257 */,
457     0x563c6089140b6990   /*  258 */,    0x4c46cb2e391f5dd5   /*  259 */,
458     0xd932addbc9b79434   /*  260 */,    0x08ea70e42015aff5   /*  261 */,
459     0xd765a6673e478cf1   /*  262 */,    0xc4fb757eab278d99   /*  263 */,
460     0xdf11c6862d6e0692   /*  264 */,    0xddeb84f10d7f3b16   /*  265 */,
461     0x6f2ef604a665ea04   /*  266 */,    0x4a8e0f0ff0e0dfb3   /*  267 */,
462     0xa5edeef83dbcba51   /*  268 */,    0xfc4f0a2a0ea4371e   /*  269 */,
463     0xe83e1da85cb38429   /*  270 */,    0xdc8ff882ba1b1ce2   /*  271 */,
464     0xcd45505e8353e80d   /*  272 */,    0x18d19a00d4db0717   /*  273 */,
465     0x34a0cfeda5f38101   /*  274 */,    0x0be77e518887caf2   /*  275 */,
466     0x1e341438b3c45136   /*  276 */,    0xe05797f49089ccf9   /*  277 */,
467     0xffd23f9df2591d14   /*  278 */,    0x543dda228595c5cd   /*  279 */,
468     0x661f81fd99052a33   /*  280 */,    0x8736e641db0f7b76   /*  281 */,
469     0x15227725418e5307   /*  282 */,    0xe25f7f46162eb2fa   /*  283 */,
470     0x48a8b2126c13d9fe   /*  284 */,    0xafdc541792e76eea   /*  285 */,
471     0x03d912bfc6d1898f   /*  286 */,    0x31b1aafa1b83f51b   /*  287 */,
472     0xf1ac2796e42ab7d9   /*  288 */,    0x40a3a7d7fcd2ebac   /*  289 */,
473     0x1056136d0afbbcc5   /*  290 */,    0x7889e1dd9a6d0c85   /*  291 */,
474     0xd33525782a7974aa   /*  292 */,    0xa7e25d09078ac09b   /*  293 */,
475     0xbd4138b3eac6edd0   /*  294 */,    0x920abfbe71eb9e70   /*  295 */,
476     0xa2a5d0f54fc2625c   /*  296 */,    0xc054e36b0b1290a3   /*  297 */,
477     0xf6dd59ff62fe932b   /*  298 */,    0x3537354511a8ac7d   /*  299 */,
478     0xca845e9172fadcd4   /*  300 */,    0x84f82b60329d20dc   /*  301 */,
479     0x79c62ce1cd672f18   /*  302 */,    0x8b09a2add124642c   /*  303 */,
480     0xd0c1e96a19d9e726   /*  304 */,    0x5a786a9b4ba9500c   /*  305 */,
481     0x0e020336634c43f3   /*  306 */,    0xc17b474aeb66d822   /*  307 */,
482     0x6a731ae3ec9baac2   /*  308 */,    0x8226667ae0840258   /*  309 */,
483     0x67d4567691caeca5   /*  310 */,    0x1d94155c4875adb5   /*  311 */,
484     0x6d00fd985b813fdf   /*  312 */,    0x51286efcb774cd06   /*  313 */,
485     0x5e8834471fa744af   /*  314 */,    0xf72ca0aee761ae2e   /*  315 */,
486     0xbe40e4cdaee8e09a   /*  316 */,    0xe9970bbb5118f665   /*  317 */,
487     0x726e4beb33df1964   /*  318 */,    0x703b000729199762   /*  319 */,
488     0x4631d816f5ef30a7   /*  320 */,    0xb880b5b51504a6be   /*  321 */,
489     0x641793c37ed84b6c   /*  322 */,    0x7b21ed77f6e97d96   /*  323 */,
490     0x776306312ef96b73   /*  324 */,    0xae528948e86ff3f4   /*  325 */,
491     0x53dbd7f286a3f8f8   /*  326 */,    0x16cadce74cfc1063   /*  327 */,
492     0x005c19bdfa52c6dd   /*  328 */,    0x68868f5d64d46ad3   /*  329 */,
493     0x3a9d512ccf1e186a   /*  330 */,    0x367e62c2385660ae   /*  331 */,
494     0xe359e7ea77dcb1d7   /*  332 */,    0x526c0773749abe6e   /*  333 */,
495     0x735ae5f9d09f734b   /*  334 */,    0x493fc7cc8a558ba8   /*  335 */,
496     0xb0b9c1533041ab45   /*  336 */,    0x321958ba470a59bd   /*  337 */,
497     0x852db00b5f46c393   /*  338 */,    0x91209b2bd336b0e5   /*  339 */,
498     0x6e604f7d659ef19f   /*  340 */,    0xb99a8ae2782ccb24   /*  341 */,
499     0xccf52ab6c814c4c7   /*  342 */,    0x4727d9afbe11727b   /*  343 */,
500     0x7e950d0c0121b34d   /*  344 */,    0x756f435670ad471f   /*  345 */,
501     0xf5add442615a6849   /*  346 */,    0x4e87e09980b9957a   /*  347 */,
502     0x2acfa1df50aee355   /*  348 */,    0xd898263afd2fd556   /*  349 */,
503     0xc8f4924dd80c8fd6   /*  350 */,    0xcf99ca3d754a173a   /*  351 */,
504     0xfe477bacaf91bf3c   /*  352 */,    0xed5371f6d690c12d   /*  353 */,
505     0x831a5c285e687094   /*  354 */,    0xc5d3c90a3708a0a4   /*  355 */,
506     0x0f7f903717d06580   /*  356 */,    0x19f9bb13b8fdf27f   /*  357 */,
507     0xb1bd6f1b4d502843   /*  358 */,    0x1c761ba38fff4012   /*  359 */,
508     0x0d1530c4e2e21f3b   /*  360 */,    0x8943ce69a7372c8a   /*  361 */,
509     0xe5184e11feb5ce66   /*  362 */,    0x618bdb80bd736621   /*  363 */,
510     0x7d29bad68b574d0b   /*  364 */,    0x81bb613e25e6fe5b   /*  365 */,
511     0x071c9c10bc07913f   /*  366 */,    0xc7beeb7909ac2d97   /*  367 */,
512     0xc3e58d353bc5d757   /*  368 */,    0xeb017892f38f61e8   /*  369 */,
513     0xd4effb9c9b1cc21a   /*  370 */,    0x99727d26f494f7ab   /*  371 */,
514     0xa3e063a2956b3e03   /*  372 */,    0x9d4a8b9a4aa09c30   /*  373 */,
515     0x3f6ab7d500090fb4   /*  374 */,    0x9cc0f2a057268ac0   /*  375 */,
516     0x3dee9d2dedbf42d1   /*  376 */,    0x330f49c87960a972   /*  377 */,
517     0xc6b2720287421b41   /*  378 */,    0x0ac59ec07c00369c   /*  379 */,
518     0xef4eac49cb353425   /*  380 */,    0xf450244eef0129d8   /*  381 */,
519     0x8acc46e5caf4deb6   /*  382 */,    0x2ffeab63989263f7   /*  383 */,
520     0x8f7cb9fe5d7a4578   /*  384 */,    0x5bd8f7644e634635   /*  385 */,
521     0x427a7315bf2dc900   /*  386 */,    0x17d0c4aa2125261c   /*  387 */,
522     0x3992486c93518e50   /*  388 */,    0xb4cbfee0a2d7d4c3   /*  389 */,
523     0x7c75d6202c5ddd8d   /*  390 */,    0xdbc295d8e35b6c61   /*  391 */,
524     0x60b369d302032b19   /*  392 */,    0xce42685fdce44132   /*  393 */,
525     0x06f3ddb9ddf65610   /*  394 */,    0x8ea4d21db5e148f0   /*  395 */,
526     0x20b0fce62fcd496f   /*  396 */,    0x2c1b912358b0ee31   /*  397 */,
527     0xb28317b818f5a308   /*  398 */,    0xa89c1e189ca6d2cf   /*  399 */,
528     0x0c6b18576aaadbc8   /*  400 */,    0xb65deaa91299fae3   /*  401 */,
529     0xfb2b794b7f1027e7   /*  402 */,    0x04e4317f443b5beb   /*  403 */,
530     0x4b852d325939d0a6   /*  404 */,    0xd5ae6beefb207ffc   /*  405 */,
531     0x309682b281c7d374   /*  406 */,    0xbae309a194c3b475   /*  407 */,
532     0x8cc3f97b13b49f05   /*  408 */,    0x98a9422ff8293967   /*  409 */,
533     0x244b16b01076ff7c   /*  410 */,    0xf8bf571c663d67ee   /*  411 */,
534     0x1f0d6758eee30da1   /*  412 */,    0xc9b611d97adeb9b7   /*  413 */,
535     0xb7afd5887b6c57a2   /*  414 */,    0x6290ae846b984fe1   /*  415 */,
536     0x94df4cdeacc1a5fd   /*  416 */,    0x058a5bd1c5483aff   /*  417 */,
537     0x63166cc142ba3c37   /*  418 */,    0x8db8526eb2f76f40   /*  419 */,
538     0xe10880036f0d6d4e   /*  420 */,    0x9e0523c9971d311d   /*  421 */,
539     0x45ec2824cc7cd691   /*  422 */,    0x575b8359e62382c9   /*  423 */,
540     0xfa9e400dc4889995   /*  424 */,    0xd1823ecb45721568   /*  425 */,
541     0xdafd983b8206082f   /*  426 */,    0xaa7d29082386a8cb   /*  427 */,
542     0x269fcd4403b87588   /*  428 */,    0x1b91f5f728bdd1e0   /*  429 */,
543     0xe4669f39040201f6   /*  430 */,    0x7a1d7c218cf04ade   /*  431 */,
544     0x65623c29d79ce5ce   /*  432 */,    0x2368449096c00bb1   /*  433 */,
545     0xab9bf1879da503ba   /*  434 */,    0xbc23ecb1a458058e   /*  435 */,
546     0x9a58df01bb401ecc   /*  436 */,    0xa070e868a85f143d   /*  437 */,
547     0x4ff188307df2239e   /*  438 */,    0x14d565b41a641183   /*  439 */,
548     0xee13337452701602   /*  440 */,    0x950e3dcf3f285e09   /*  441 */,
549     0x59930254b9c80953   /*  442 */,    0x3bf299408930da6d   /*  443 */,
550     0xa955943f53691387   /*  444 */,    0xa15edecaa9cb8784   /*  445 */,
551     0x29142127352be9a0   /*  446 */,    0x76f0371fff4e7afb   /*  447 */,
552     0x0239f450274f2228   /*  448 */,    0xbb073af01d5e868b   /*  449 */,
553     0xbfc80571c10e96c1   /*  450 */,    0xd267088568222e23   /*  451 */,
554     0x9671a3d48e80b5b0   /*  452 */,    0x55b5d38ae193bb81   /*  453 */,
555     0x693ae2d0a18b04b8   /*  454 */,    0x5c48b4ecadd5335f   /*  455 */,
556     0xfd743b194916a1ca   /*  456 */,    0x2577018134be98c4   /*  457 */,
557     0xe77987e83c54a4ad   /*  458 */,    0x28e11014da33e1b9   /*  459 */,
558     0x270cc59e226aa213   /*  460 */,    0x71495f756d1a5f60   /*  461 */,
559     0x9be853fb60afef77   /*  462 */,    0xadc786a7f7443dbf   /*  463 */,
560     0x0904456173b29a82   /*  464 */,    0x58bc7a66c232bd5e   /*  465 */,
561     0xf306558c673ac8b2   /*  466 */,    0x41f639c6b6c9772a   /*  467 */,
562     0x216defe99fda35da   /*  468 */,    0x11640cc71c7be615   /*  469 */,
563     0x93c43694565c5527   /*  470 */,    0xea038e6246777839   /*  471 */,
564     0xf9abf3ce5a3e2469   /*  472 */,    0x741e768d0fd312d2   /*  473 */,
565     0x0144b883ced652c6   /*  474 */,    0xc20b5a5ba33f8552   /*  475 */,
566     0x1ae69633c3435a9d   /*  476 */,    0x97a28ca4088cfdec   /*  477 */,
567     0x8824a43c1e96f420   /*  478 */,    0x37612fa66eeea746   /*  479 */,
568     0x6b4cb165f9cf0e5a   /*  480 */,    0x43aa1c06a0abfb4a   /*  481 */,
569     0x7f4dc26ff162796b   /*  482 */,    0x6cbacc8e54ed9b0f   /*  483 */,
570     0xa6b7ffefd2bb253e   /*  484 */,    0x2e25bc95b0a29d4f   /*  485 */,
571     0x86d6a58bdef1388c   /*  486 */,    0xded74ac576b6f054   /*  487 */,
572     0x8030bdbc2b45805d   /*  488 */,    0x3c81af70e94d9289   /*  489 */,
573     0x3eff6dda9e3100db   /*  490 */,    0xb38dc39fdfcc8847   /*  491 */,
574     0x123885528d17b87e   /*  492 */,    0xf2da0ed240b1b642   /*  493 */,
575     0x44cefadcd54bf9a9   /*  494 */,    0x1312200e433c7ee6   /*  495 */,
576     0x9ffcc84f3a78c748   /*  496 */,    0xf0cd1f72248576bb   /*  497 */,
577     0xec6974053638cfe4   /*  498 */,    0x2ba7b67c0cec4e4c   /*  499 */,
578     0xac2f4df3e5ce32ed   /*  500 */,    0xcb33d14326ea4c11   /*  501 */,
579     0xa4e9044cc77e58bc   /*  502 */,    0x5f513293d934fcef   /*  503 */,
580     0x5dc9645506e55444   /*  504 */,    0x50de418f317de40a   /*  505 */,
581     0x388cb31a69dde259   /*  506 */,    0x2db4a83455820a86   /*  507 */,
582     0x9010a91e84711ae9   /*  508 */,    0x4df7f0b7b1498371   /*  509 */,
583     0xd62a2eabc0977179   /*  510 */,    0x22fac097aa8d5c0e   /*  511 */,
584     0xf49fcc2ff1daf39b   /*  512 */,    0x487fd5c66ff29281   /*  513 */,
585     0xe8a30667fcdca83f   /*  514 */,    0x2c9b4be3d2fcce63   /*  515 */,
586     0xda3ff74b93fbbbc2   /*  516 */,    0x2fa165d2fe70ba66   /*  517 */,
587     0xa103e279970e93d4   /*  518 */,    0xbecdec77b0e45e71   /*  519 */,
588     0xcfb41e723985e497   /*  520 */,    0xb70aaa025ef75017   /*  521 */,
589     0xd42309f03840b8e0   /*  522 */,    0x8efc1ad035898579   /*  523 */,
590     0x96c6920be2b2abc5   /*  524 */,    0x66af4163375a9172   /*  525 */,
591     0x2174abdcca7127fb   /*  526 */,    0xb33ccea64a72ff41   /*  527 */,
592     0xf04a4933083066a5   /*  528 */,    0x8d970acdd7289af5   /*  529 */,
593     0x8f96e8e031c8c25e   /*  530 */,    0xf3fec02276875d47   /*  531 */,
594     0xec7bf310056190dd   /*  532 */,    0xf5adb0aebb0f1491   /*  533 */,
595     0x9b50f8850fd58892   /*  534 */,    0x4975488358b74de8   /*  535 */,
596     0xa3354ff691531c61   /*  536 */,    0x0702bbe481d2c6ee   /*  537 */,
597     0x89fb24057deded98   /*  538 */,    0xac3075138596e902   /*  539 */,
598     0x1d2d3580172772ed   /*  540 */,    0xeb738fc28e6bc30d   /*  541 */,
599     0x5854ef8f63044326   /*  542 */,    0x9e5c52325add3bbe   /*  543 */,
600     0x90aa53cf325c4623   /*  544 */,    0xc1d24d51349dd067   /*  545 */,
601     0x2051cfeea69ea624   /*  546 */,    0x13220f0a862e7e4f   /*  547 */,
602     0xce39399404e04864   /*  548 */,    0xd9c42ca47086fcb7   /*  549 */,
603     0x685ad2238a03e7cc   /*  550 */,    0x066484b2ab2ff1db   /*  551 */,
604     0xfe9d5d70efbf79ec   /*  552 */,    0x5b13b9dd9c481854   /*  553 */,
605     0x15f0d475ed1509ad   /*  554 */,    0x0bebcd060ec79851   /*  555 */,
606     0xd58c6791183ab7f8   /*  556 */,    0xd1187c5052f3eee4   /*  557 */,
607     0xc95d1192e54e82ff   /*  558 */,    0x86eea14cb9ac6ca2   /*  559 */,
608     0x3485beb153677d5d   /*  560 */,    0xdd191d781f8c492a   /*  561 */,
609     0xf60866baa784ebf9   /*  562 */,    0x518f643ba2d08c74   /*  563 */,
610     0x8852e956e1087c22   /*  564 */,    0xa768cb8dc410ae8d   /*  565 */,
611     0x38047726bfec8e1a   /*  566 */,    0xa67738b4cd3b45aa   /*  567 */,
612     0xad16691cec0dde19   /*  568 */,    0xc6d4319380462e07   /*  569 */,
613     0xc5a5876d0ba61938   /*  570 */,    0x16b9fa1fa58fd840   /*  571 */,
614     0x188ab1173ca74f18   /*  572 */,    0xabda2f98c99c021f   /*  573 */,
615     0x3e0580ab134ae816   /*  574 */,    0x5f3b05b773645abb   /*  575 */,
616     0x2501a2be5575f2f6   /*  576 */,    0x1b2f74004e7e8ba9   /*  577 */,
617     0x1cd7580371e8d953   /*  578 */,    0x7f6ed89562764e30   /*  579 */,
618     0xb15926ff596f003d   /*  580 */,    0x9f65293da8c5d6b9   /*  581 */,
619     0x6ecef04dd690f84c   /*  582 */,    0x4782275fff33af88   /*  583 */,
620     0xe41433083f820801   /*  584 */,    0xfd0dfe409a1af9b5   /*  585 */,
621     0x4325a3342cdb396b   /*  586 */,    0x8ae77e62b301b252   /*  587 */,
622     0xc36f9e9f6655615a   /*  588 */,    0x85455a2d92d32c09   /*  589 */,
623     0xf2c7dea949477485   /*  590 */,    0x63cfb4c133a39eba   /*  591 */,
624     0x83b040cc6ebc5462   /*  592 */,    0x3b9454c8fdb326b0   /*  593 */,
625     0x56f56a9e87ffd78c   /*  594 */,    0x2dc2940d99f42bc6   /*  595 */,
626     0x98f7df096b096e2d   /*  596 */,    0x19a6e01e3ad852bf   /*  597 */,
627     0x42a99ccbdbd4b40b   /*  598 */,    0xa59998af45e9c559   /*  599 */,
628     0x366295e807d93186   /*  600 */,    0x6b48181bfaa1f773   /*  601 */,
629     0x1fec57e2157a0a1d   /*  602 */,    0x4667446af6201ad5   /*  603 */,
630     0xe615ebcacfb0f075   /*  604 */,    0xb8f31f4f68290778   /*  605 */,
631     0x22713ed6ce22d11e   /*  606 */,    0x3057c1a72ec3c93b   /*  607 */,
632     0xcb46acc37c3f1f2f   /*  608 */,    0xdbb893fd02aaf50e   /*  609 */,
633     0x331fd92e600b9fcf   /*  610 */,    0xa498f96148ea3ad6   /*  611 */,
634     0xa8d8426e8b6a83ea   /*  612 */,    0xa089b274b7735cdc   /*  613 */,
635     0x87f6b3731e524a11   /*  614 */,    0x118808e5cbc96749   /*  615 */,
636     0x9906e4c7b19bd394   /*  616 */,    0xafed7f7e9b24a20c   /*  617 */,
637     0x6509eadeeb3644a7   /*  618 */,    0x6c1ef1d3e8ef0ede   /*  619 */,
638     0xb9c97d43e9798fb4   /*  620 */,    0xa2f2d784740c28a3   /*  621 */,
639     0x7b8496476197566f   /*  622 */,    0x7a5be3e6b65f069d   /*  623 */,
640     0xf96330ed78be6f10   /*  624 */,    0xeee60de77a076a15   /*  625 */,
641     0x2b4bee4aa08b9bd0   /*  626 */,    0x6a56a63ec7b8894e   /*  627 */,
642     0x02121359ba34fef4   /*  628 */,    0x4cbf99f8283703fc   /*  629 */,
643     0x398071350caf30c8   /*  630 */,    0xd0a77a89f017687a   /*  631 */,
644     0xf1c1a9eb9e423569   /*  632 */,    0x8c7976282dee8199   /*  633 */,
645     0x5d1737a5dd1f7abd   /*  634 */,    0x4f53433c09a9fa80   /*  635 */,
646     0xfa8b0c53df7ca1d9   /*  636 */,    0x3fd9dcbc886ccb77   /*  637 */,
647     0xc040917ca91b4720   /*  638 */,    0x7dd00142f9d1dcdf   /*  639 */,
648     0x8476fc1d4f387b58   /*  640 */,    0x23f8e7c5f3316503   /*  641 */,
649     0x032a2244e7e37339   /*  642 */,    0x5c87a5d750f5a74b   /*  643 */,
650     0x082b4cc43698992e   /*  644 */,    0xdf917becb858f63c   /*  645 */,
651     0x3270b8fc5bf86dda   /*  646 */,    0x10ae72bb29b5dd76   /*  647 */,
652     0x576ac94e7700362b   /*  648 */,    0x1ad112dac61efb8f   /*  649 */,
653     0x691bc30ec5faa427   /*  650 */,    0xff246311cc327143   /*  651 */,
654     0x3142368e30e53206   /*  652 */,    0x71380e31e02ca396   /*  653 */,
655     0x958d5c960aad76f1   /*  654 */,    0xf8d6f430c16da536   /*  655 */,
656     0xc8ffd13f1be7e1d2   /*  656 */,    0x7578ae66004ddbe1   /*  657 */,
657     0x05833f01067be646   /*  658 */,    0xbb34b5ad3bfe586d   /*  659 */,
658     0x095f34c9a12b97f0   /*  660 */,    0x247ab64525d60ca8   /*  661 */,
659     0xdcdbc6f3017477d1   /*  662 */,    0x4a2e14d4decad24d   /*  663 */,
660     0xbdb5e6d9be0a1eeb   /*  664 */,    0x2a7e70f7794301ab   /*  665 */,
661     0xdef42d8a270540fd   /*  666 */,    0x01078ec0a34c22c1   /*  667 */,
662     0xe5de511af4c16387   /*  668 */,    0x7ebb3a52bd9a330a   /*  669 */,
663     0x77697857aa7d6435   /*  670 */,    0x004e831603ae4c32   /*  671 */,
664     0xe7a21020ad78e312   /*  672 */,    0x9d41a70c6ab420f2   /*  673 */,
665     0x28e06c18ea1141e6   /*  674 */,    0xd2b28cbd984f6b28   /*  675 */,
666     0x26b75f6c446e9d83   /*  676 */,    0xba47568c4d418d7f   /*  677 */,
667     0xd80badbfe6183d8e   /*  678 */,    0x0e206d7f5f166044   /*  679 */,
668     0xe258a43911cbca3e   /*  680 */,    0x723a1746b21dc0bc   /*  681 */,
669     0xc7caa854f5d7cdd3   /*  682 */,    0x7cac32883d261d9c   /*  683 */,
670     0x7690c26423ba942c   /*  684 */,    0x17e55524478042b8   /*  685 */,
671     0xe0be477656a2389f   /*  686 */,    0x4d289b5e67ab2da0   /*  687 */,
672     0x44862b9c8fbbfd31   /*  688 */,    0xb47cc8049d141365   /*  689 */,
673     0x822c1b362b91c793   /*  690 */,    0x4eb14655fb13dfd8   /*  691 */,
674     0x1ecbba0714e2a97b   /*  692 */,    0x6143459d5cde5f14   /*  693 */,
675     0x53a8fbf1d5f0ac89   /*  694 */,    0x97ea04d81c5e5b00   /*  695 */,
676     0x622181a8d4fdb3f3   /*  696 */,    0xe9bcd341572a1208   /*  697 */,
677     0x1411258643cce58a   /*  698 */,    0x9144c5fea4c6e0a4   /*  699 */,
678     0x0d33d06565cf620f   /*  700 */,    0x54a48d489f219ca1   /*  701 */,
679     0xc43e5eac6d63c821   /*  702 */,    0xa9728b3a72770daf   /*  703 */,
680     0xd7934e7b20df87ef   /*  704 */,    0xe35503b61a3e86e5   /*  705 */,
681     0xcae321fbc819d504   /*  706 */,    0x129a50b3ac60bfa6   /*  707 */,
682     0xcd5e68ea7e9fb6c3   /*  708 */,    0xb01c90199483b1c7   /*  709 */,
683     0x3de93cd5c295376c   /*  710 */,    0xaed52edf2ab9ad13   /*  711 */,
684     0x2e60f512c0a07884   /*  712 */,    0xbc3d86a3e36210c9   /*  713 */,
685     0x35269d9b163951ce   /*  714 */,    0x0c7d6e2ad0cdb5fa   /*  715 */,
686     0x59e86297d87f5733   /*  716 */,    0x298ef221898db0e7   /*  717 */,
687     0x55000029d1a5aa7e   /*  718 */,    0x8bc08ae1b5061b45   /*  719 */,
688     0xc2c31c2b6c92703a   /*  720 */,    0x94cc596baf25ef42   /*  721 */,
689     0x0a1d73db22540456   /*  722 */,    0x04b6a0f9d9c4179a   /*  723 */,
690     0xeffdafa2ae3d3c60   /*  724 */,    0xf7c8075bb49496c4   /*  725 */,
691     0x9cc5c7141d1cd4e3   /*  726 */,    0x78bd1638218e5534   /*  727 */,
692     0xb2f11568f850246a   /*  728 */,    0xedfabcfa9502bc29   /*  729 */,
693     0x796ce5f2da23051b   /*  730 */,    0xaae128b0dc93537c   /*  731 */,
694     0x3a493da0ee4b29ae   /*  732 */,    0xb5df6b2c416895d7   /*  733 */,
695     0xfcabbd25122d7f37   /*  734 */,    0x70810b58105dc4b1   /*  735 */,
696     0xe10fdd37f7882a90   /*  736 */,    0x524dcab5518a3f5c   /*  737 */,
697     0x3c9e85878451255b   /*  738 */,    0x4029828119bd34e2   /*  739 */,
698     0x74a05b6f5d3ceccb   /*  740 */,    0xb610021542e13eca   /*  741 */,
699     0x0ff979d12f59e2ac   /*  742 */,    0x6037da27e4f9cc50   /*  743 */,
700     0x5e92975a0df1847d   /*  744 */,    0xd66de190d3e623fe   /*  745 */,
701     0x5032d6b87b568048   /*  746 */,    0x9a36b7ce8235216e   /*  747 */,
702     0x80272a7a24f64b4a   /*  748 */,    0x93efed8b8c6916f7   /*  749 */,
703     0x37ddbff44cce1555   /*  750 */,    0x4b95db5d4b99bd25   /*  751 */,
704     0x92d3fda169812fc0   /*  752 */,    0xfb1a4a9a90660bb6   /*  753 */,
705     0x730c196946a4b9b2   /*  754 */,    0x81e289aa7f49da68   /*  755 */,
706     0x64669a0f83b1a05f   /*  756 */,    0x27b3ff7d9644f48b   /*  757 */,
707     0xcc6b615c8db675b3   /*  758 */,    0x674f20b9bcebbe95   /*  759 */,
708     0x6f31238275655982   /*  760 */,    0x5ae488713e45cf05   /*  761 */,
709     0xbf619f9954c21157   /*  762 */,    0xeabac46040a8eae9   /*  763 */,
710     0x454c6fe9f2c0c1cd   /*  764 */,    0x419cf6496412691c   /*  765 */,
711     0xd3dc3bef265b0f70   /*  766 */,    0x6d0e60f5c3578a9e   /*  767 */,
712     0x5b0e608526323c55   /*  768 */,    0x1a46c1a9fa1b59f5   /*  769 */,
713     0xa9e245a17c4c8ffa   /*  770 */,    0x65ca5159db2955d7   /*  771 */,
714     0x05db0a76ce35afc2   /*  772 */,    0x81eac77ea9113d45   /*  773 */,
715     0x528ef88ab6ac0a0d   /*  774 */,    0xa09ea253597be3ff   /*  775 */,
716     0x430ddfb3ac48cd56   /*  776 */,    0xc4b3a67af45ce46f   /*  777 */,
717     0x4ececfd8fbe2d05e   /*  778 */,    0x3ef56f10b39935f0   /*  779 */,
718     0x0b22d6829cd619c6   /*  780 */,    0x17fd460a74df2069   /*  781 */,
719     0x6cf8cc8e8510ed40   /*  782 */,    0xd6c824bf3a6ecaa7   /*  783 */,
720     0x61243d581a817049   /*  784 */,    0x048bacb6bbc163a2   /*  785 */,
721     0xd9a38ac27d44cc32   /*  786 */,    0x7fddff5baaf410ab   /*  787 */,
722     0xad6d495aa804824b   /*  788 */,    0xe1a6a74f2d8c9f94   /*  789 */,
723     0xd4f7851235dee8e3   /*  790 */,    0xfd4b7f886540d893   /*  791 */,
724     0x247c20042aa4bfda   /*  792 */,    0x096ea1c517d1327c   /*  793 */,
725     0xd56966b4361a6685   /*  794 */,    0x277da5c31221057d   /*  795 */,
726     0x94d59893a43acff7   /*  796 */,    0x64f0c51ccdc02281   /*  797 */,
727     0x3d33bcc4ff6189db   /*  798 */,    0xe005cb184ce66af1   /*  799 */,
728     0xff5ccd1d1db99bea   /*  800 */,    0xb0b854a7fe42980f   /*  801 */,
729     0x7bd46a6a718d4b9f   /*  802 */,    0xd10fa8cc22a5fd8c   /*  803 */,
730     0xd31484952be4bd31   /*  804 */,    0xc7fa975fcb243847   /*  805 */,
731     0x4886ed1e5846c407   /*  806 */,    0x28cddb791eb70b04   /*  807 */,
732     0xc2b00be2f573417f   /*  808 */,    0x5c9590452180f877   /*  809 */,
733     0x7a6bddfff370eb00   /*  810 */,    0xce509e38d6d9d6a4   /*  811 */,
734     0xebeb0f00647fa702   /*  812 */,    0x1dcc06cf76606f06   /*  813 */,
735     0xe4d9f28ba286ff0a   /*  814 */,    0xd85a305dc918c262   /*  815 */,
736     0x475b1d8732225f54   /*  816 */,    0x2d4fb51668ccb5fe   /*  817 */,
737     0xa679b9d9d72bba20   /*  818 */,    0x53841c0d912d43a5   /*  819 */,
738     0x3b7eaa48bf12a4e8   /*  820 */,    0x781e0e47f22f1ddf   /*  821 */,
739     0xeff20ce60ab50973   /*  822 */,    0x20d261d19dffb742   /*  823 */,
740     0x16a12b03062a2e39   /*  824 */,    0x1960eb2239650495   /*  825 */,
741     0x251c16fed50eb8b8   /*  826 */,    0x9ac0c330f826016e   /*  827 */,
742     0xed152665953e7671   /*  828 */,    0x02d63194a6369570   /*  829 */,
743     0x5074f08394b1c987   /*  830 */,    0x70ba598c90b25ce1   /*  831 */,
744     0x794a15810b9742f6   /*  832 */,    0x0d5925e9fcaf8c6c   /*  833 */,
745     0x3067716cd868744e   /*  834 */,    0x910ab077e8d7731b   /*  835 */,
746     0x6a61bbdb5ac42f61   /*  836 */,    0x93513efbf0851567   /*  837 */,
747     0xf494724b9e83e9d5   /*  838 */,    0xe887e1985c09648d   /*  839 */,
748     0x34b1d3c675370cfd   /*  840 */,    0xdc35e433bc0d255d   /*  841 */,
749     0xd0aab84234131be0   /*  842 */,    0x08042a50b48b7eaf   /*  843 */,
750     0x9997c4ee44a3ab35   /*  844 */,    0x829a7b49201799d0   /*  845 */,
751     0x263b8307b7c54441   /*  846 */,    0x752f95f4fd6a6ca6   /*  847 */,
752     0x927217402c08c6e5   /*  848 */,    0x2a8ab754a795d9ee   /*  849 */,
753     0xa442f7552f72943d   /*  850 */,    0x2c31334e19781208   /*  851 */,
754     0x4fa98d7ceaee6291   /*  852 */,    0x55c3862f665db309   /*  853 */,
755     0xbd0610175d53b1f3   /*  854 */,    0x46fe6cb840413f27   /*  855 */,
756     0x3fe03792df0cfa59   /*  856 */,    0xcfe700372eb85e8f   /*  857 */,
757     0xa7be29e7adbce118   /*  858 */,    0xe544ee5cde8431dd   /*  859 */,
758     0x8a781b1b41f1873e   /*  860 */,    0xa5c94c78a0d2f0e7   /*  861 */,
759     0x39412e2877b60728   /*  862 */,    0xa1265ef3afc9a62c   /*  863 */,
760     0xbcc2770c6a2506c5   /*  864 */,    0x3ab66dd5dce1ce12   /*  865 */,
761     0xe65499d04a675b37   /*  866 */,    0x7d8f523481bfd216   /*  867 */,
762     0x0f6f64fcec15f389   /*  868 */,    0x74efbe618b5b13c8   /*  869 */,
763     0xacdc82b714273e1d   /*  870 */,    0xdd40bfe003199d17   /*  871 */,
764     0x37e99257e7e061f8   /*  872 */,    0xfa52626904775aaa   /*  873 */,
765     0x8bbbf63a463d56f9   /*  874 */,    0xf0013f1543a26e64   /*  875 */,
766     0xa8307e9f879ec898   /*  876 */,    0xcc4c27a4150177cc   /*  877 */,
767     0x1b432f2cca1d3348   /*  878 */,    0xde1d1f8f9f6fa013   /*  879 */,
768     0x606602a047a7ddd6   /*  880 */,    0xd237ab64cc1cb2c7   /*  881 */,
769     0x9b938e7225fcd1d3   /*  882 */,    0xec4e03708e0ff476   /*  883 */,
770     0xfeb2fbda3d03c12d   /*  884 */,    0xae0bced2ee43889a   /*  885 */,
771     0x22cb8923ebfb4f43   /*  886 */,    0x69360d013cf7396d   /*  887 */,
772     0x855e3602d2d4e022   /*  888 */,    0x073805bad01f784c   /*  889 */,
773     0x33e17a133852f546   /*  890 */,    0xdf4874058ac7b638   /*  891 */,
774     0xba92b29c678aa14a   /*  892 */,    0x0ce89fc76cfaadcd   /*  893 */,
775     0x5f9d4e0908339e34   /*  894 */,    0xf1afe9291f5923b9   /*  895 */,
776     0x6e3480f60f4a265f   /*  896 */,    0xeebf3a2ab29b841c   /*  897 */,
777     0xe21938a88f91b4ad   /*  898 */,    0x57dfeff845c6d3c3   /*  899 */,
778     0x2f006b0bf62caaf2   /*  900 */,    0x62f479ef6f75ee78   /*  901 */,
779     0x11a55ad41c8916a9   /*  902 */,    0xf229d29084fed453   /*  903 */,
780     0x42f1c27b16b000e6   /*  904 */,    0x2b1f76749823c074   /*  905 */,
781     0x4b76eca3c2745360   /*  906 */,    0x8c98f463b91691bd   /*  907 */,
782     0x14bcc93cf1ade66a   /*  908 */,    0x8885213e6d458397   /*  909 */,
783     0x8e177df0274d4711   /*  910 */,    0xb49b73b5503f2951   /*  911 */,
784     0x10168168c3f96b6b   /*  912 */,    0x0e3d963b63cab0ae   /*  913 */,
785     0x8dfc4b5655a1db14   /*  914 */,    0xf789f1356e14de5c   /*  915 */,
786     0x683e68af4e51dac1   /*  916 */,    0xc9a84f9d8d4b0fd9   /*  917 */,
787     0x3691e03f52a0f9d1   /*  918 */,    0x5ed86e46e1878e80   /*  919 */,
788     0x3c711a0e99d07150   /*  920 */,    0x5a0865b20c4e9310   /*  921 */,
789     0x56fbfc1fe4f0682e   /*  922 */,    0xea8d5de3105edf9b   /*  923 */,
790     0x71abfdb12379187a   /*  924 */,    0x2eb99de1bee77b9c   /*  925 */,
791     0x21ecc0ea33cf4523   /*  926 */,    0x59a4d7521805c7a1   /*  927 */,
792     0x3896f5eb56ae7c72   /*  928 */,    0xaa638f3db18f75dc   /*  929 */,
793     0x9f39358dabe9808e   /*  930 */,    0xb7defa91c00b72ac   /*  931 */,
794     0x6b5541fd62492d92   /*  932 */,    0x6dc6dee8f92e4d5b   /*  933 */,
795     0x353f57abc4beea7e   /*  934 */,    0x735769d6da5690ce   /*  935 */,
796     0x0a234aa642391484   /*  936 */,    0xf6f9508028f80d9d   /*  937 */,
797     0xb8e319a27ab3f215   /*  938 */,    0x31ad9c1151341a4d   /*  939 */,
798     0x773c22a57bef5805   /*  940 */,    0x45c7561a07968633   /*  941 */,
799     0xf913da9e249dbe36   /*  942 */,    0xda652d9b78a64c68   /*  943 */,
800     0x4c27a97f3bc334ef   /*  944 */,    0x76621220e66b17f4   /*  945 */,
801     0x967743899acd7d0b   /*  946 */,    0xf3ee5bcae0ed6782   /*  947 */,
802     0x409f753600c879fc   /*  948 */,    0x06d09a39b5926db6   /*  949 */,
803     0x6f83aeb0317ac588   /*  950 */,    0x01e6ca4a86381f21   /*  951 */,
804     0x66ff3462d19f3025   /*  952 */,    0x72207c24ddfd3bfb   /*  953 */,
805     0x4af6b6d3e2ece2eb   /*  954 */,    0x9c994dbec7ea08de   /*  955 */,
806     0x49ace597b09a8bc4   /*  956 */,    0xb38c4766cf0797ba   /*  957 */,
807     0x131b9373c57c2a75   /*  958 */,    0xb1822cce61931e58   /*  959 */,
808     0x9d7555b909ba1c0c   /*  960 */,    0x127fafdd937d11d2   /*  961 */,
809     0x29da3badc66d92e4   /*  962 */,    0xa2c1d57154c2ecbc   /*  963 */,
810     0x58c5134d82f6fe24   /*  964 */,    0x1c3ae3515b62274f   /*  965 */,
811     0xe907c82e01cb8126   /*  966 */,    0xf8ed091913e37fcb   /*  967 */,
812     0x3249d8f9c80046c9   /*  968 */,    0x80cf9bede388fb63   /*  969 */,
813     0x1881539a116cf19e   /*  970 */,    0x5103f3f76bd52457   /*  971 */,
814     0x15b7e6f5ae47f7a8   /*  972 */,    0xdbd7c6ded47e9ccf   /*  973 */,
815     0x44e55c410228bb1a   /*  974 */,    0xb647d4255edb4e99   /*  975 */,
816     0x5d11882bb8aafc30   /*  976 */,    0xf5098bbb29d3212a   /*  977 */,
817     0x8fb5ea14e90296b3   /*  978 */,    0x677b942157dd025a   /*  979 */,
818     0xfb58e7c0a390acb5   /*  980 */,    0x89d3674c83bd4a01   /*  981 */,
819     0x9e2da4df4bf3b93b   /*  982 */,    0xfcc41e328cab4829   /*  983 */,
820     0x03f38c96ba582c52   /*  984 */,    0xcad1bdbd7fd85db2   /*  985 */,
821     0xbbb442c16082ae83   /*  986 */,    0xb95fe86ba5da9ab0   /*  987 */,
822     0xb22e04673771a93f   /*  988 */,    0x845358c9493152d8   /*  989 */,
823     0xbe2a488697b4541e   /*  990 */,    0x95a2dc2dd38e6966   /*  991 */,
824     0xc02c11ac923c852b   /*  992 */,    0x2388b1990df2a87b   /*  993 */,
825     0x7c8008fa1b4f37be   /*  994 */,    0x1f70d0c84d54e503   /*  995 */,
826     0x5490adec7ece57d4   /*  996 */,    0x002b3c27d9063a3a   /*  997 */,
827     0x7eaea3848030a2bf   /*  998 */,    0xc602326ded2003c0   /*  999 */,
828     0x83a7287d69a94086   /* 1000 */,    0xc57a5fcb30f57a8a   /* 1001 */,
829     0xb56844e479ebe779   /* 1002 */,    0xa373b40f05dcbce9   /* 1003 */,
830     0xd71a786e88570ee2   /* 1004 */,    0x879cbacdbde8f6a0   /* 1005 */,
831     0x976ad1bcc164a32f   /* 1006 */,    0xab21e25e9666d78b   /* 1007 */,
832     0x901063aae5e5c33c   /* 1008 */,    0x9818b34448698d90   /* 1009 */,
833     0xe36487ae3e1e8abb   /* 1010 */,    0xafbdf931893bdcb4   /* 1011 */,
834     0x6345a0dc5fbbd519   /* 1012 */,    0x8628fe269b9465ca   /* 1013 */,
835     0x1e5d01603f9c51ec   /* 1014 */,    0x4de44006a15049b7   /* 1015 */,
836     0xbf6c70e5f776cbb1   /* 1016 */,    0x411218f2ef552bed   /* 1017 */,
837     0xcb0c0708705a36a3   /* 1018 */,    0xe74d14754f986044   /* 1019 */,
838     0xcd56d9430ea8280e   /* 1020 */,    0xc12591d7535f5065   /* 1021 */,
839     0xc83223f1720aef96   /* 1022 */,    0xc3a0396f7363a51f   /* 1023 */
840 ];
841 
842 
843 /*******************************************************************************
844 
845 *******************************************************************************/
846 
847 debug(UnitTest)
848 {
849         unittest
850         {
851         __gshared immutable immutable(char)[][] strings = [
852                 "",
853                 "abc",
854                 "Tiger",
855                 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-",
856                 "ABCDEFGHIJKLMNOPQRSTUVWXYZ=abcdefghijklmnopqrstuvwxyz+0123456789",
857                 "Tiger - A Fast New Hash Function, by Ross Anderson and Eli Biham",
858                 "Tiger - A Fast New Hash Function, by Ross Anderson and Eli Biham, proceedings of Fast Software Encryption 3, Cambridge.",
859                 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
860                 x"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000",
861         ];
862         __gshared immutable immutable(char)[][] results = [
863                 "3293ac630c13f0245f92bbb1766e16167a4e58492dde73f3",
864                 "2aab1484e8c158f2bfb8c5ff41b57a525129131c957b5f93",
865                 "dd00230799f5009fec6debc838bb6a27df2b9d6f110c7937",
866                 "f71c8583902afb879edfe610f82c0d4786a3a534504486b5",
867                 "48ceeb6308b87d46e95d656112cdf18d97915f9765658957",
868                 "8a866829040a410c729ad23f5ada711603b3cdd357e4c15e",
869                 "ce55a6afd591f5ebac547ff84f89227f9331dab0b611c889",
870                 "0f7bf9a19b9c58f2b7610df7e84f0ac3a71c631e7b53f78e",
871                 "5ab6ff5b263acfab2013c3068c03a82979ea6db287a3ecdd",
872         ];
873 
874         Tiger h = new Tiger();
875 
876         foreach(int i, immutable(char)[] s; strings) {
877                 h.update(cast(ubyte[]) s);
878 
879                 char[] d = h.hexDigest();
880 
881                 assert(d == results[i],":("~s~")("~d~")!=("~results[i]~")");
882 
883         }
884         }
885 }