blob: 2512528a4c383956ba620dc342591b50b6ecfc84 [file] [log] [blame]
Darrick J. Wongdb8bbf22011-09-15 23:46:37 -04001/*
2 * crc32c.c
3 *
4 * August 26, 2011 Darrick J. Wong <djwong at us.ibm.com>
5 * Reuse Bob Pearson's slice-by-8 implementation for e2fsprogs.
6 *
7 * July 20, 2011 Bob Pearson <rpearson at systemfabricworks.com>
8 * added slice by 8 algorithm to the existing conventional and
9 * slice by 4 algorithms.
10 *
11 * Oct 15, 2000 Matt Domsch <Matt_Domsch@dell.com>
12 * Nicer crc32 functions/docs submitted by linux@horizon.com. Thanks!
13 * Code was from the public domain, copyright abandoned. Code was
14 * subsequently included in the kernel, thus was re-licensed under the
15 * GNU GPL v2.
16 *
17 * Oct 12, 2000 Matt Domsch <Matt_Domsch@dell.com>
18 * Same crc32 function was used in 5 other places in the kernel.
19 * I made one version, and deleted the others.
20 * There are various incantations of crc32(). Some use a seed of 0 or ~0.
21 * Some xor at the end with ~0. The generic crc32() function takes
22 * seed as an argument, and doesn't xor at the end. Then individual
23 * users can do whatever they need.
24 * drivers/net/smc9194.c uses seed ~0, doesn't xor with ~0.
25 * fs/jffs2 uses seed 0, doesn't xor with ~0.
26 * fs/partitions/efi.c uses seed ~0, xor's with ~0.
27 *
28 * This source code is licensed under the GNU General Public License,
29 * Version 2. See the file COPYING for more details.
30 */
Theodore Ts'od1154eb2011-09-18 17:34:37 -040031#include "config.h"
Darrick J. Wongdb8bbf22011-09-15 23:46:37 -040032#include <stdint.h>
Darrick J. Wongdb8bbf22011-09-15 23:46:37 -040033#include <stdlib.h>
34#include <stdio.h>
35#define __force
36#define min(x, y) ((x) > (y) ? (y) : (x))
37#define __ALIGN_KERNEL_MASK(x, mask) (((x) + (mask)) & ~(mask))
Theodore Ts'oe64e6762012-04-05 12:13:05 -070038#define __ALIGN_KERNEL(x, a) __ALIGN_KERNEL_MASK(x, (__typeof__(x))(a) - 1)
Darrick J. Wongdb8bbf22011-09-15 23:46:37 -040039#define ALIGN(x, a) __ALIGN_KERNEL((x), (a))
Theodore Ts'oe64e6762012-04-05 12:13:05 -070040#define PTR_ALIGN(p, a) ((__typeof__(p))ALIGN((unsigned long)(p), (a)))
Darrick J. Wongdb8bbf22011-09-15 23:46:37 -040041#include "crc32c_defs.h"
42
Theodore Ts'o8232f2d2011-10-03 22:49:45 -040043#include "ext2fs.h"
44#ifdef WORDS_BIGENDIAN
45#define __constant_cpu_to_le32(x) ___constant_swab32((x))
46#define __constant_cpu_to_be32(x) (x)
47#define __be32_to_cpu(x) (x)
48#define __cpu_to_be32(x) (x)
49#define __cpu_to_le32(x) (ext2fs_cpu_to_le32((x)))
50#define __le32_to_cpu(x) (ext2fs_le32_to_cpu((x)))
51#else
52#define __constant_cpu_to_le32(x) (x)
53#define __constant_cpu_to_be32(x) ___constant_swab32((x))
54#define __be32_to_cpu(x) (ext2fs_be32_to_cpu((x)))
55#define __cpu_to_be32(x) (ext2fs_cpu_to_be32((x)))
56#define __cpu_to_le32(x) (x)
57#define __le32_to_cpu(x) (x)
58#endif
59
Darrick J. Wongdb8bbf22011-09-15 23:46:37 -040060#if CRC_LE_BITS > 8
61# define tole(x) (__force uint32_t) __constant_cpu_to_le32(x)
62#else
63# define tole(x) (x)
64#endif
65
66#if CRC_BE_BITS > 8
67# define tobe(x) (__force uint32_t) __constant_cpu_to_be32(x)
68#else
69# define tobe(x) (x)
70#endif
71
72#include "crc32c_table.h"
73
74#if CRC_LE_BITS == 32
75/* slice by 4 algorithm */
76static uint32_t crc32c_le_body(uint32_t crc, uint8_t const *buf, size_t len)
77{
78 const uint8_t *p8;
79 const uint32_t *p32;
80 size_t init_bytes;
81 size_t words;
82 size_t end_bytes;
83 size_t i;
84 uint32_t q;
85 uint8_t i0, i1, i2, i3;
86
87 crc = (__force uint32_t) __cpu_to_le32(crc);
88
89 /* unroll loop into 'init_bytes' odd bytes followed by
90 * 'words' aligned 4 byte words followed by
91 * 'end_bytes' odd bytes at the end */
92 p8 = buf;
93 p32 = (uint32_t *)PTR_ALIGN(p8, 4);
94 init_bytes = min((uintptr_t)p32 - (uintptr_t)p8, len);
95 words = (len - init_bytes) >> 2;
96 end_bytes = (len - init_bytes) & 3;
97
98 for (i = 0; i < init_bytes; i++) {
99#ifndef WORDS_BIGENDIAN
100 i0 = *p8++ ^ crc;
101 crc = t0_le[i0] ^ (crc >> 8);
102#else
103 i0 = *p8++ ^ (crc >> 24);
104 crc = t0_le[i0] ^ (crc << 8);
105#endif
106 }
107
108 /* using pre-increment below slightly faster */
109 p32--;
110
111 for (i = 0; i < words; i++) {
112#ifndef WORDS_BIGENDIAN
113 q = *++p32 ^ crc;
114 i3 = q;
115 i2 = q >> 8;
116 i1 = q >> 16;
117 i0 = q >> 24;
118 crc = t3_le[i3] ^ t2_le[i2] ^ t1_le[i1] ^ t0_le[i0];
119#else
120 q = *++p32 ^ crc;
121 i3 = q >> 24;
122 i2 = q >> 16;
123 i1 = q >> 8;
124 i0 = q;
125 crc = t3_le[i3] ^ t2_le[i2] ^ t1_le[i1] ^ t0_le[i0];
126#endif
127 }
128
129 p8 = (uint8_t *)(++p32);
130
131 for (i = 0; i < end_bytes; i++) {
132#ifndef WORDS_BIGENDIAN
133 i0 = *p8++ ^ crc;
134 crc = t0_le[i0] ^ (crc >> 8);
135#else
136 i0 = *p8++ ^ (crc >> 24);
137 crc = t0_le[i0] ^ (crc << 8);
138#endif
139 }
140
141 return __le32_to_cpu((__force __le32)crc);
142}
143#endif
144
145#if CRC_BE_BITS == 32
146static uint32_t crc32c_be_body(uint32_t crc, uint8_t const *buf, size_t len)
147{
148 const uint8_t *p8;
149 const uint32_t *p32;
150 size_t init_bytes;
151 size_t words;
152 size_t end_bytes;
153 size_t i;
154 uint32_t q;
155 uint8_t i0, i1, i2, i3;
156
157 crc = (__force uint32_t) __cpu_to_be32(crc);
158
159 p8 = buf;
160 p32 = (uint32_t *)PTR_ALIGN(p8, 4);
161 init_bytes = min((uintptr_t)p32 - (uintptr_t)p8, len);
162 words = (len - init_bytes) >> 2;
163 end_bytes = (len - init_bytes) & 3;
164
165 for (i = 0; i < init_bytes; i++) {
166#ifndef WORDS_BIGENDIAN
167 i0 = *p8++ ^ crc;
168 crc = t0_be[i0] ^ (crc >> 8);
169#else
170 i0 = *p8++ ^ (crc >> 24);
171 crc = t0_be[i0] ^ (crc << 8);
172#endif
173 }
174
175 p32--;
176
177 for (i = 0; i < words; i++) {
178#ifndef WORDS_BIGENDIAN
179 q = *++p32 ^ crc;
180 i3 = q;
181 i2 = q >> 8;
182 i1 = q >> 16;
183 i0 = q >> 24;
184 crc = t3_be[i3] ^ t2_be[i2] ^ t1_be[i1] ^ t0_be[i0];
185#else
186 q = *++p32 ^ crc;
187 i3 = q >> 24;
188 i2 = q >> 16;
189 i1 = q >> 8;
190 i0 = q;
191 crc = t3_be[i3] ^ t2_be[i2] ^ t1_be[i1] ^ t0_be[i0];
192#endif
193 }
194
195 p8 = (uint8_t *)(++p32);
196
197 for (i = 0; i < end_bytes; i++) {
198#ifndef WORDS_BIGENDIAN
199 i0 = *p8++ ^ crc;
200 crc = t0_be[i0] ^ (crc >> 8);
201#else
202 i0 = *p8++ ^ (crc >> 24);
203 crc = t0_be[i0] ^ (crc << 8);
204#endif
205 }
206
207 return __be32_to_cpu((__force __be32)crc);
208}
209#endif
210
211#if CRC_LE_BITS == 64
212/* slice by 8 algorithm */
213static uint32_t crc32c_le_body(uint32_t crc, uint8_t const *buf, size_t len)
214{
215 const uint8_t *p8;
216 const uint32_t *p32;
217 size_t init_bytes;
218 size_t words;
219 size_t end_bytes;
220 size_t i;
221 uint32_t q;
222 uint8_t i0, i1, i2, i3;
223
224 crc = (__force uint32_t) __cpu_to_le32(crc);
225
226 p8 = buf;
Theodore Ts'oe48bf252013-05-19 18:50:10 -0400227 p32 = (const uint32_t *)PTR_ALIGN(p8, 8);
Darrick J. Wongdb8bbf22011-09-15 23:46:37 -0400228 init_bytes = min((uintptr_t)p32 - (uintptr_t)p8, len);
229 words = (len - init_bytes) >> 3;
230 end_bytes = (len - init_bytes) & 7;
231
232 for (i = 0; i < init_bytes; i++) {
233#ifndef WORDS_BIGENDIAN
234 i0 = *p8++ ^ crc;
235 crc = t0_le[i0] ^ (crc >> 8);
236#else
237 i0 = *p8++ ^ (crc >> 24);
238 crc = t0_le[i0] ^ (crc << 8);
239#endif
240 }
241
242 p32--;
243
244 for (i = 0; i < words; i++) {
245#ifndef WORDS_BIGENDIAN
246 q = *++p32 ^ crc;
247 i3 = q;
248 i2 = q >> 8;
249 i1 = q >> 16;
250 i0 = q >> 24;
251 crc = t7_le[i3] ^ t6_le[i2] ^ t5_le[i1] ^ t4_le[i0];
252
253 q = *++p32;
254 i3 = q;
255 i2 = q >> 8;
256 i1 = q >> 16;
257 i0 = q >> 24;
258 crc ^= t3_le[i3] ^ t2_le[i2] ^ t1_le[i1] ^ t0_le[i0];
259#else
260 q = *++p32 ^ crc;
261 i3 = q >> 24;
262 i2 = q >> 16;
263 i1 = q >> 8;
264 i0 = q;
265 crc = t7_le[i3] ^ t6_le[i2] ^ t5_le[i1] ^ t4_le[i0];
266
267 q = *++p32;
268 i3 = q >> 24;
269 i2 = q >> 16;
270 i1 = q >> 8;
271 i0 = q;
272 crc ^= t3_le[i3] ^ t2_le[i2] ^ t1_le[i1] ^ t0_le[i0];
273#endif
274 }
275
Theodore Ts'oe48bf252013-05-19 18:50:10 -0400276 p8 = (const uint8_t *)(++p32);
Darrick J. Wongdb8bbf22011-09-15 23:46:37 -0400277
278 for (i = 0; i < end_bytes; i++) {
279#ifndef WORDS_BIGENDIAN
280 i0 = *p8++ ^ crc;
281 crc = t0_le[i0] ^ (crc >> 8);
282#else
283 i0 = *p8++ ^ (crc >> 24);
284 crc = t0_le[i0] ^ (crc << 8);
285#endif
286 }
287
288 return __le32_to_cpu(crc);
289}
290#endif
291
292#if CRC_BE_BITS == 64
293static uint32_t crc32c_be_body(uint32_t crc, uint8_t const *buf, size_t len)
294{
295 const uint8_t *p8;
296 const uint32_t *p32;
297 size_t init_bytes;
298 size_t words;
299 size_t end_bytes;
300 size_t i;
301 uint32_t q;
302 uint8_t i0, i1, i2, i3;
303
304 crc = (__force uint32_t) __cpu_to_be32(crc);
305
306 p8 = buf;
Theodore Ts'oe48bf252013-05-19 18:50:10 -0400307 p32 = (const uint32_t *)PTR_ALIGN(p8, 8);
Darrick J. Wongdb8bbf22011-09-15 23:46:37 -0400308 init_bytes = min((uintptr_t)p32 - (uintptr_t)p8, len);
309 words = (len - init_bytes) >> 3;
310 end_bytes = (len - init_bytes) & 7;
311
312 for (i = 0; i < init_bytes; i++) {
313#ifndef WORDS_BIGENDIAN
314 i0 = *p8++ ^ crc;
315 crc = t0_be[i0] ^ (crc >> 8);
316#else
317 i0 = *p8++ ^ (crc >> 24);
318 crc = t0_be[i0] ^ (crc << 8);
319#endif
320 }
321
322 p32--;
323
324 for (i = 0; i < words; i++) {
325#ifndef WORDS_BIGENDIAN
326 q = *++p32 ^ crc;
327 i3 = q;
328 i2 = q >> 8;
329 i1 = q >> 16;
330 i0 = q >> 24;
331 crc = t7_be[i3] ^ t6_be[i2] ^ t5_be[i1] ^ t4_be[i0];
332
333 q = *++p32;
334 i3 = q;
335 i2 = q >> 8;
336 i1 = q >> 16;
337 i0 = q >> 24;
338 crc ^= t3_be[i3] ^ t2_be[i2] ^ t1_be[i1] ^ t0_be[i0];
339#else
340 q = *++p32 ^ crc;
341 i3 = q >> 24;
342 i2 = q >> 16;
343 i1 = q >> 8;
344 i0 = q;
345 crc = t7_be[i3] ^ t6_be[i2] ^ t5_be[i1] ^ t4_be[i0];
346
347 q = *++p32;
348 i3 = q >> 24;
349 i2 = q >> 16;
350 i1 = q >> 8;
351 i0 = q;
352 crc ^= t3_be[i3] ^ t2_be[i2] ^ t1_be[i1] ^ t0_be[i0];
353#endif
354 }
355
Theodore Ts'oe48bf252013-05-19 18:50:10 -0400356 p8 = (const uint8_t *)(++p32);
Darrick J. Wongdb8bbf22011-09-15 23:46:37 -0400357
358 for (i = 0; i < end_bytes; i++) {
359#ifndef WORDS_BIGENDIAN
360 i0 = *p8++ ^ crc;
361 crc = t0_be[i0] ^ (crc >> 8);
362#else
363 i0 = *p8++ ^ (crc >> 24);
364 crc = t0_be[i0] ^ (crc << 8);
365#endif
366 }
367
368 return __be32_to_cpu(crc);
369}
370#endif
371
372/**
373 * crc32c_le() - Calculate bitwise little-endian CRC32c.
374 * @crc: seed value for computation. ~0 for ext4, sometimes 0 for
375 * other uses, or the previous crc32c value if computing incrementally.
376 * @p: pointer to buffer over which CRC is run
377 * @len: length of buffer @p
378 */
379uint32_t ext2fs_crc32c_le(uint32_t crc, unsigned char const *p, size_t len)
380{
381#if CRC_LE_BITS == 1
382 int i;
383 while (len--) {
384 crc ^= *p++;
385 for (i = 0; i < 8; i++)
386 crc = (crc >> 1) ^ ((crc & 1) ? CRCPOLY_LE : 0);
387 }
388# elif CRC_LE_BITS == 2
389 while (len--) {
390 crc ^= *p++;
391 crc = (crc >> 2) ^ t0_le[crc & 0x03];
392 crc = (crc >> 2) ^ t0_le[crc & 0x03];
393 crc = (crc >> 2) ^ t0_le[crc & 0x03];
394 crc = (crc >> 2) ^ t0_le[crc & 0x03];
395 }
396# elif CRC_LE_BITS == 4
397 while (len--) {
398 crc ^= *p++;
399 crc = (crc >> 4) ^ t0_le[crc & 0x0f];
400 crc = (crc >> 4) ^ t0_le[crc & 0x0f];
401 }
402# elif CRC_LE_BITS == 8
403 while (len--) {
404 crc ^= *p++;
405 crc = (crc >> 8) ^ t0_le[crc & 0xff];
406 }
407# else
408 crc = crc32c_le_body(crc, p, len);
409# endif
410 return crc;
411}
412
413/**
414 * crc32c_be() - Calculate bitwise big-endian CRC32c.
415 * @crc: seed value for computation. ~0 for ext4, sometimes 0 for
416 * other uses, or the previous crc32c value if computing incrementally.
417 * @p: pointer to buffer over which CRC is run
418 * @len: length of buffer @p
419 */
420uint32_t ext2fs_crc32c_be(uint32_t crc, unsigned char const *p, size_t len)
421{
422#if CRC_BE_BITS == 1
423 int i;
424 while (len--) {
425 crc ^= *p++ << 24;
426 for (i = 0; i < 8; i++)
427 crc = (crc << 1) ^
428 ((crc & 0x80000000) ? CRCPOLY_BE : 0);
429 }
430# elif CRC_BE_BITS == 2
431 while (len--) {
432 crc ^= *p++ << 24;
433 crc = (crc << 2) ^ t0_be[crc >> 30];
434 crc = (crc << 2) ^ t0_be[crc >> 30];
435 crc = (crc << 2) ^ t0_be[crc >> 30];
436 crc = (crc << 2) ^ t0_be[crc >> 30];
437 }
438# elif CRC_BE_BITS == 4
439 while (len--) {
440 crc ^= *p++ << 24;
441 crc = (crc << 4) ^ t0_be[crc >> 28];
442 crc = (crc << 4) ^ t0_be[crc >> 28];
443 }
444# elif CRC_BE_BITS == 8
445 while (len--) {
446 crc ^= *p++ << 24;
447 crc = (crc << 8) ^ t0_be[crc >> 24];
448 }
449# else
450 crc = crc32c_be_body(crc, p, len);
451# endif
452 return crc;
453}
454
455#ifdef UNITTEST
456static uint8_t test_buf[] = {
457 0xd9, 0xd7, 0x6a, 0x13, 0x3a, 0xb1, 0x05, 0x48,
458 0xda, 0xad, 0x14, 0xbd, 0x03, 0x3a, 0x58, 0x5e,
459 0x6e, 0xd1, 0x56, 0xc9, 0x2e, 0xc4, 0xcb, 0x6b,
460 0xe8, 0x77, 0x52, 0x37, 0x4e, 0x0f, 0x55, 0xd2,
461 0x12, 0x65, 0x90, 0xc2, 0x41, 0x49, 0x81, 0x01,
462 0xf5, 0x01, 0xeb, 0x2d, 0x78, 0x74, 0x23, 0x5d,
463 0x84, 0x5c, 0x81, 0x92, 0x21, 0xe9, 0x8d, 0x1d,
464 0x89, 0xf2, 0x4a, 0xac, 0xdd, 0xf9, 0xaf, 0xee,
465 0x44, 0xe7, 0x6e, 0xed, 0xfb, 0xd8, 0x89, 0x0e,
466 0x96, 0x62, 0xcd, 0xa4, 0x4b, 0xa9, 0xe5, 0x45,
467 0xb1, 0x29, 0x9b, 0x0f, 0xfc, 0xbd, 0x83, 0xab,
468 0xa8, 0x54, 0x96, 0x44, 0x2c, 0x7f, 0xbb, 0xe7,
469 0x52, 0x29, 0x08, 0xee, 0x14, 0xc5, 0xc2, 0xec,
470 0x5a, 0xeb, 0x40, 0x40, 0xea, 0xd1, 0x3d, 0x15,
471 0x73, 0xaa, 0x8c, 0x73, 0xfc, 0xf2, 0x2b, 0x49,
472 0x0b, 0x13, 0x96, 0xd9, 0x8e, 0x4b, 0xbc, 0xe0,
473 0xf4, 0xd2, 0xe0, 0x2e, 0x7a, 0xf0, 0x5d, 0x1f,
474 0xd2, 0x92, 0x97, 0xe0, 0xaa, 0x59, 0xab, 0xc9,
475 0x5c, 0xa6, 0x51, 0x1a, 0xe3, 0xd6, 0x06, 0xb9,
476 0xae, 0xb8, 0x76, 0x36, 0x79, 0x37, 0x52, 0xf6,
477 0x34, 0xaf, 0x27, 0x19, 0xe1, 0xc0, 0x2b, 0xdd,
478 0x01, 0x15, 0xcd, 0xce, 0x44, 0xf6, 0x4c, 0x18,
479 0x92, 0x69, 0xbe, 0x8a, 0x76, 0x23, 0x52, 0x13,
480 0x3f, 0xf9, 0xe0, 0xf5, 0x06, 0x28, 0x7c, 0xc7,
481 0xf3, 0x42, 0x0f, 0xdd, 0x40, 0x33, 0xf7, 0x99,
482 0xe2, 0xad, 0x26, 0xd9, 0x53, 0x10, 0x72, 0x0c,
483 0x4e, 0x43, 0x4c, 0x61, 0xfe, 0xd9, 0xc1, 0x16,
484 0xa1, 0x93, 0xca, 0x3c, 0x75, 0x7f, 0x07, 0x7a,
485 0x65, 0xb3, 0x53, 0x2a, 0x52, 0x00, 0xa0, 0x62,
486 0xe0, 0xa3, 0x1f, 0xad, 0xd7, 0xbb, 0xc0, 0x83,
487 0x5d, 0x54, 0x87, 0x5f, 0xc8, 0x2f, 0xc8, 0xbf,
488 0x69, 0x04, 0x91, 0xc8, 0xa6, 0x1d, 0x4d, 0x46,
489 0x91, 0xfc, 0x26, 0xf4, 0x16, 0xd1, 0xa4, 0xbf,
490 0x5c, 0xa2, 0x6c, 0xdd, 0xb4, 0x40, 0xf2, 0x2e,
491 0xa2, 0xad, 0xf7, 0xf4, 0xa5, 0x8a, 0x3e, 0x23,
492 0x64, 0x08, 0xc8, 0xa1, 0xa0, 0xf0, 0x5d, 0x70,
493 0xd2, 0x77, 0xfd, 0xc8, 0x50, 0x83, 0x0f, 0xd6,
494 0x2b, 0xe4, 0x1f, 0x52, 0x34, 0x33, 0x68, 0xfd,
495 0x92, 0xbe, 0x9f, 0x97, 0x6b, 0x8d, 0x81, 0x91,
496 0x0f, 0xef, 0x65, 0xc8, 0x0d, 0x15, 0x01, 0x77,
497 0x58, 0xb2, 0xf4, 0x1b, 0x06, 0x7e, 0xf5, 0xca,
498 0x15, 0x2e, 0x38, 0xd8, 0x81, 0x1c, 0x1c, 0xa0,
499 0xb6, 0x13, 0x6a, 0x2b, 0x71, 0x34, 0x52, 0xd7,
500 0x1d, 0xbd, 0x37, 0x59, 0xbc, 0x86, 0x25, 0x2b,
501 0xa8, 0x93, 0xce, 0x1a, 0x03, 0x16, 0xfe, 0x01,
502 0x57, 0x99, 0x24, 0x25, 0x2c, 0xb3, 0xab, 0x1e,
503 0x2d, 0x65, 0x20, 0x89, 0x17, 0x02, 0x0e, 0x0a,
504 0xf5, 0x1e, 0xc7, 0xff, 0x1f, 0x61, 0xa9, 0x54,
505 0x18, 0xd4, 0xba, 0x50, 0x57, 0x02, 0xa1, 0xab,
506 0x22, 0x2e, 0x07, 0xea, 0xa9, 0xa3, 0x83, 0x4f,
507 0x27, 0xf5, 0xc5, 0xee, 0x3c, 0x3b, 0x10, 0xad,
508 0x32, 0x2b, 0x1c, 0x03, 0xcb, 0xaf, 0x98, 0x83,
509 0x54, 0xc3, 0x68, 0x63, 0xd4, 0xe0, 0x0e, 0x3c,
510 0x1a, 0x4e, 0xc0, 0x81, 0xd0, 0xe8, 0x6a, 0x62,
511 0x6b, 0x3e, 0x6f, 0xc4, 0xc6, 0x33, 0x4e, 0x26,
512 0x21, 0xf5, 0x04, 0xdf, 0xfa, 0xce, 0x45, 0xaf,
513 0xdc, 0x5e, 0x1b, 0xad, 0x93, 0xca, 0xf5, 0xcf,
514 0xd7, 0xee, 0x0c, 0x5c, 0x5e, 0xb4, 0xf0, 0x92,
515 0xd2, 0xf2, 0xf0, 0xa9, 0x1e, 0xab, 0x80, 0x68,
516 0x46, 0xef, 0xcc, 0x26, 0x0c, 0x5c, 0xdd, 0x4e,
517 0x83, 0xb8, 0xb9, 0x53, 0x6e, 0xf8, 0x93, 0x38,
518 0x67, 0xa4, 0x41, 0x87, 0x72, 0xe7, 0x7e, 0x86,
519 0xc9, 0x49, 0x00, 0x33, 0xb1, 0x38, 0x6c, 0x71,
520 0xd7, 0x1d, 0x8e, 0x61, 0x01, 0xb6, 0x57, 0xa9,
521 0xf1, 0xac, 0x15, 0xc2, 0x83, 0x77, 0xca, 0x64,
522 0xca, 0x7b, 0x6c, 0xa1, 0x10, 0x1b, 0x13, 0xd0,
523 0xd3, 0x9e, 0x9e, 0x10, 0x70, 0xc8, 0x1a, 0xbb,
524 0x3f, 0x19, 0x86, 0xab, 0x01, 0x0e, 0xea, 0x34,
525 0x22, 0xea, 0xe2, 0x15, 0xb7, 0xed, 0x21, 0x21,
526 0x75, 0xa5, 0xe7, 0x08, 0xa1, 0x38, 0xe0, 0x91,
527 0x05, 0x60, 0xea, 0xa7, 0x50, 0x27, 0x18, 0x07,
528 0x9d, 0xe0, 0x18, 0x2b, 0xd4, 0x07, 0x59, 0x00,
529 0xe6, 0x45, 0x18, 0x2a, 0x30, 0x6e, 0xf3, 0xb4,
530 0xd0, 0xef, 0xa6, 0x5b, 0x71, 0xa2, 0x5a, 0x3b,
531 0x89, 0x4c, 0xaf, 0x3f, 0xcb, 0x9f, 0x03, 0xfb,
532 0x43, 0x7c, 0x6b, 0xd3, 0x6a, 0xea, 0xce, 0x4a,
533 0x5f, 0x64, 0xb5, 0x62, 0xda, 0x5d, 0x27, 0xb7,
534 0xb8, 0x11, 0xca, 0x33, 0x30, 0xec, 0x70, 0xf0,
535 0x1b, 0x03, 0x50, 0xff, 0x5e, 0xa6, 0x08, 0xde,
536 0x37, 0x70, 0xc0, 0x81, 0x55, 0x60, 0x17, 0xa1,
537 0x85, 0xae, 0x26, 0x44, 0xe4, 0x67, 0x3c, 0x91,
538 0xfd, 0xc4, 0x3d, 0x97, 0x72, 0x23, 0xf3, 0x3c,
539 0x8f, 0xe0, 0xe2, 0xf2, 0x09, 0x96, 0x10, 0x67,
540 0xb5, 0xfe, 0xff, 0x3d, 0x4a, 0xc8, 0x62, 0x11,
541 0xa5, 0x98, 0xc1, 0x2d, 0x40, 0x82, 0x88, 0x8b,
542 0xe5, 0xb0, 0x75, 0xbf, 0x2f, 0xa8, 0x6a, 0x55,
543 0x49, 0x2e, 0x9c, 0x29, 0xd2, 0x7c, 0xbf, 0xf3,
544 0xaa, 0x3a, 0x16, 0x4a, 0xa4, 0x15, 0xf3, 0x48,
545 0xde, 0x38, 0x13, 0x44, 0x26, 0x02, 0xe6, 0xe9,
546 0xa8, 0x24, 0x89, 0xb5, 0x43, 0x95, 0xe4, 0x4c,
547 0xc3, 0xa0, 0xdf, 0xcc, 0x42, 0xf8, 0x8d, 0xb0,
548 0x3b, 0xea, 0x10, 0xb7, 0xe1, 0x40, 0x54, 0xb9,
549 0xa3, 0x2d, 0xfb, 0xb4, 0x91, 0xc0, 0x3e, 0x94,
550 0xf1, 0xa1, 0x3c, 0xbe, 0xef, 0xb8, 0x70, 0x55,
551 0x0a, 0x26, 0x93, 0xbf, 0xe6, 0x21, 0x92, 0x32,
552 0x3c, 0x39, 0x27, 0x6a, 0x23, 0x48, 0x02, 0x35,
553 0x3c, 0xd4, 0xcc, 0x04, 0xc0, 0x4e, 0xa7, 0x02,
554 0x63, 0x37, 0xc2, 0xb8, 0x56, 0x1d, 0x57, 0x57,
555 0x42, 0x04, 0x8d, 0xee, 0xcf, 0x8b, 0xc9, 0xc3,
556 0xba, 0x3b, 0x15, 0xd7, 0xaf, 0xbf, 0x9e, 0xcd,
557 0x44, 0xcf, 0xf0, 0x00, 0xb7, 0x3a, 0xfc, 0xa8,
558 0x12, 0xab, 0x3a, 0x62, 0x01, 0x21, 0x46, 0xe9,
559 0x1e, 0x48, 0x37, 0xfc, 0x13, 0x4d, 0xf6, 0x2a,
560 0x72, 0x40, 0x75, 0x38, 0x71, 0xf2, 0x17, 0x20,
561 0x2c, 0xdd, 0xc0, 0x49, 0xbc, 0x63, 0x33, 0xea,
562 0x06, 0x75, 0x41, 0xe7, 0x5c, 0x1f, 0xfb, 0xf9,
563 0x68, 0x83, 0xc2, 0x5a, 0x4a, 0x1e, 0x61, 0x08,
564 0x57, 0xf3, 0x00, 0xba, 0x77, 0x92, 0x63, 0xa5,
565 0xb7, 0xfe, 0x97, 0x22, 0xda, 0x5e, 0xd3, 0xaf,
566 0xbc, 0x89, 0x0d, 0x4c, 0x37, 0xa9, 0x27, 0x4a,
567 0x7f, 0xdb, 0x81, 0x39, 0x11, 0x86, 0x12, 0xf9,
568 0x10, 0x50, 0xe4, 0xdb, 0x72, 0xf9, 0xae, 0x10,
569 0x7c, 0xed, 0x50, 0x5c, 0x61, 0xeb, 0x42, 0x1e,
570 0xa4, 0xf4, 0xf0, 0xfa, 0x45, 0x4d, 0x95, 0x2b,
571 0xd4, 0x67, 0x4a, 0xe3, 0x8a, 0x15, 0x55, 0x92,
572 0x77, 0x64, 0x8c, 0x51, 0x38, 0xf9, 0x26, 0x3e,
573 0x68, 0xe2, 0xac, 0xbb, 0x64, 0x77, 0xe2, 0x82,
574 0xa4, 0x42, 0x41, 0x38, 0xa0, 0xf0, 0xc9, 0xd8,
575 0x6c, 0xe0, 0xef, 0x4c, 0xda, 0xb4, 0x92, 0xef,
576 0x1b, 0xe3, 0x9b, 0xc1, 0x44, 0x3c, 0xb9, 0xb7,
577 0x39, 0xac, 0x5c, 0x32, 0x39, 0xb4, 0x21, 0x85,
578 0x93, 0xbc, 0xf2, 0x51, 0x43, 0xb7, 0xae, 0x1e,
579 0x61, 0x9c, 0x38, 0x9c, 0xaa, 0xff, 0xde, 0xfc,
580 0xbf, 0x85, 0xef, 0x17, 0x34, 0x36, 0x71, 0x5f,
581 0x04, 0x16, 0xa6, 0x9e, 0xfd, 0x3a, 0x03, 0xd8,
582 0xbf, 0x71, 0x70, 0x20, 0x8f, 0x7c, 0xfb, 0xff,
583 0x61, 0xe0, 0xe2, 0x60, 0xa7, 0xb1, 0xc0, 0xe0,
584 0xd9, 0x3f, 0xdc, 0x8d, 0x4a, 0xa4, 0x52, 0x61,
585 0xaf, 0x9d, 0xdf, 0x8a, 0x0d, 0x41, 0xc0, 0x25,
586 0x68, 0x12, 0x7b, 0xd5, 0xc7, 0xdb, 0x68, 0x70,
587 0x2d, 0x7d, 0x95, 0x12, 0x03, 0x23, 0x0c, 0xe8,
588 0x14, 0x41, 0x11, 0x28, 0xec, 0x9d, 0xd3, 0x28,
589 0x77, 0x7a, 0x3c, 0x93, 0x8e, 0x5c, 0x7e, 0xb3,
590 0x42, 0x9a, 0x18, 0x25, 0x93, 0xc8, 0xea, 0x43,
591 0x1b, 0xbe, 0xd5, 0x27, 0xf1, 0xd4, 0xe0, 0x1e,
592 0xce, 0xc7, 0xc7, 0x2c, 0x25, 0x35, 0x58, 0xb8,
593 0x6c, 0xf3, 0xa2, 0xad, 0xe7, 0x58, 0x49, 0x47,
594 0xf7, 0xca, 0xde, 0x8b, 0x81, 0xb7, 0x75, 0xf4,
595 0x95, 0xa7, 0x5c, 0xc3, 0x2c, 0x0e, 0x1c, 0x52,
596 0x9a, 0xc3, 0x2a, 0x00, 0x21, 0xa7, 0x51, 0x6b,
597 0xf0, 0x05, 0x87, 0x8c, 0x42, 0x1b, 0xc3, 0x2e,
598 0xa3, 0x76, 0x22, 0xd5, 0x7f, 0x56, 0x10, 0xef,
599 0x98, 0x85, 0x65, 0x86, 0x71, 0x87, 0xd2, 0x8c,
600 0xc0, 0x47, 0x20, 0xe8, 0xb5, 0x1c, 0xe3, 0xdd,
601 0x3c, 0x5c, 0x03, 0xbb, 0x0e, 0x97, 0x3b, 0xe1,
602 0x56, 0x9a, 0xd5, 0x0a, 0x63, 0xd5, 0x33, 0xaf,
603 0x36, 0xca, 0xcf, 0x8f, 0x00, 0x28, 0xa3, 0x45,
604 0xb8, 0xcd, 0xde, 0x73, 0xd4, 0xfa, 0x2d, 0x6f,
605 0xdb, 0x93, 0xaa, 0xdd, 0x7f, 0xd2, 0x22, 0x9c,
606 0x96, 0x48, 0x1e, 0xa8, 0x63, 0xbe, 0xbc, 0x0d,
607 0x14, 0x3c, 0x2e, 0x11, 0x1f, 0xd2, 0xf4, 0x57,
608 0xb3, 0x47, 0xf8, 0xa6, 0x1b, 0xc3, 0xa7, 0x95,
609 0x2d, 0xd4, 0xca, 0xb8, 0x0d, 0xfb, 0x06, 0x85,
610 0xda, 0x63, 0xf0, 0x3e, 0x9d, 0x5e, 0xee, 0xce,
611 0xed, 0x74, 0x1d, 0x2c, 0x97, 0x3f, 0x71, 0x95,
612 0x12, 0x03, 0xc5, 0x92, 0x46, 0x84, 0x1b, 0x07,
613 0xe6, 0xb4, 0x1d, 0x3a, 0xf1, 0x89, 0x90, 0x50,
614 0x10, 0x29, 0x34, 0xc0, 0x90, 0xbe, 0x4a, 0xa9,
615 0x0d, 0xb0, 0x7b, 0xfb, 0x35, 0xee, 0x4e, 0x34,
616 0xec, 0x5a, 0x58, 0xbc, 0xb8, 0xda, 0x38, 0x88,
617 0x8c, 0x74, 0x1e, 0xc9, 0xab, 0x78, 0x2e, 0x2a,
618 0x17, 0x8a, 0x43, 0x3d, 0xa1, 0x2a, 0x41, 0xb5,
619 0xd6, 0xe8, 0x5b, 0xc5, 0x4a, 0x1c, 0x3c, 0x9f,
620 0x8d, 0x3a, 0x69, 0x88, 0xf8, 0x80, 0xd2, 0x11,
621 0xfc, 0x7e, 0x80, 0x8e, 0x7f, 0x85, 0x64, 0x9c,
622 0x46, 0x58, 0xc8, 0x48, 0x98, 0x4b, 0xf5, 0x73,
623 0x3f, 0x49, 0xce, 0x53, 0x2c, 0xd5, 0xfc, 0x33,
624 0xf1, 0x6f, 0xd8, 0xe9, 0x2e, 0x70, 0x2e, 0xdc,
625 0xe5, 0x43, 0x80, 0x38, 0xf2, 0x87, 0xed, 0x85,
626 0xe4, 0x3e, 0x45, 0x14, 0x20, 0xcf, 0xa0, 0x61,
627 0x4f, 0xe8, 0xd7, 0x5b, 0xb3, 0x0d, 0x0e, 0x4e,
628 0x4d, 0xce, 0xbe, 0xba, 0xaa, 0x90, 0x09, 0xcb,
629 0x4b, 0x5d, 0x08, 0xff, 0x52, 0xd5, 0x23, 0xbc,
630 0xad, 0x8d, 0xd3, 0x06, 0x4a, 0xa0, 0x51, 0x56,
631 0xa7, 0xd8, 0x33, 0xab, 0xbc, 0xd0, 0xdf, 0x92,
632 0x87, 0x20, 0x2d, 0x7b, 0x5e, 0xfa, 0x30, 0xa7,
633 0x06, 0x06, 0xe5, 0x4f, 0x2c, 0xb5, 0x61, 0xd7,
634 0x54, 0xd3, 0xdf, 0xd0, 0x0a, 0xb0, 0x06, 0xce,
635 0xf6, 0x86, 0xb7, 0x8e, 0xaa, 0x7b, 0x78, 0xd5,
636 0xb9, 0xeb, 0x07, 0xac, 0x5f, 0xc5, 0xd2, 0x8c,
637 0x40, 0xe0, 0x7f, 0x98, 0xd4, 0xe5, 0x4b, 0xca,
638 0xfb, 0x47, 0xef, 0xef, 0xb9, 0x4d, 0x6d, 0x8f,
639 0x82, 0x68, 0x74, 0x84, 0xe0, 0x0a, 0x93, 0x0f,
640 0xb2, 0x01, 0xa9, 0x9f, 0x68, 0x6a, 0xe8, 0xf7,
641 0xfb, 0x0b, 0xde, 0x17, 0xe0, 0x30, 0x38, 0x51,
642 0xbc, 0x07, 0xb8, 0x2c, 0x91, 0x0f, 0xc1, 0x0e,
643 0xa6, 0xf9, 0xf0, 0xd5, 0x48, 0x76, 0x8a, 0xde,
644 0x74, 0xe3, 0x30, 0x65, 0x56, 0xb3, 0x5c, 0xe2,
645 0x89, 0x8d, 0xda, 0x80, 0xad, 0x0f, 0x22, 0xfb,
646 0x24, 0x1d, 0x16, 0xdd, 0x34, 0x4b, 0x90, 0x58,
647 0x4e, 0x0c, 0x13, 0x28, 0xcf, 0x1d, 0xa4, 0xaa,
648 0xb7, 0xf3, 0xb1, 0x66, 0xad, 0x3b, 0xcf, 0x79,
649 0x12, 0x04, 0xd7, 0x79, 0xd9, 0x5f, 0xdf, 0x89,
650 0xb2, 0x5b, 0xa7, 0x9a, 0x26, 0x1e, 0x67, 0x46,
651 0x7c, 0x66, 0x95, 0x67, 0xe6, 0x45, 0x8b, 0x1f,
652 0x65, 0x79, 0x9f, 0x6d, 0x11, 0x81, 0x17, 0x0d,
653 0x11, 0xb0, 0x5c, 0xb4, 0xc7, 0x27, 0x87, 0xab,
654 0x5d, 0x0a, 0x18, 0xae, 0x4e, 0x06, 0xa3, 0x3d,
655 0xc7, 0xb0, 0x22, 0xba, 0x03, 0xa4, 0x0f, 0xe5,
656 0x1c, 0x72, 0x2a, 0x04, 0xce, 0x83, 0xe9, 0xf3,
657 0xd7, 0xc9, 0x67, 0x6c, 0x1e, 0x6b, 0x3c, 0x9b,
658 0x0b, 0x5e, 0x6a, 0xa6, 0x79, 0x0a, 0xf1, 0xbe,
659 0xd7, 0xb4, 0x6f, 0x45, 0x1e, 0xfb, 0x78, 0x97,
660 0xaf, 0x34, 0x76, 0x95, 0x52, 0xf7, 0x3d, 0x5d,
661 0x07, 0x28, 0x57, 0x9c, 0x4a, 0x0f, 0xcf, 0x0b,
662 0x1b, 0xc4, 0xc2, 0x72, 0xd7, 0x72, 0x38, 0x9b,
663 0xea, 0xeb, 0xee, 0xae, 0x34, 0xc8, 0x01, 0xd7,
664 0xa5, 0xe3, 0xce, 0x41, 0xad, 0x02, 0x60, 0x23,
665 0x18, 0x36, 0xba, 0x17, 0xfa, 0xcf, 0xe4, 0xda,
666 0xdc, 0xfc, 0x82, 0xdc, 0x7c, 0x11, 0xf4, 0xb8,
667 0x52, 0x5d, 0xf7, 0x2f, 0xc8, 0xfe, 0x4a, 0xe6,
668 0xb9, 0xaf, 0x4b, 0x17, 0x18, 0x91, 0xc2, 0xfe,
669 0xd7, 0x3a, 0x77, 0x0c, 0xa0, 0x43, 0x9c, 0x6f,
670 0x13, 0x06, 0xbe, 0x6e, 0xe0, 0x1a, 0x3c, 0xf3,
671 0xf5, 0xcc, 0x78, 0xfb, 0x5d, 0xd5, 0xda, 0xb7,
672 0x58, 0xea, 0x86, 0x42, 0x6b, 0x32, 0xff, 0xb2,
673 0xe2, 0xee, 0x03, 0x1f, 0xf4, 0xef, 0xdb, 0x53,
674 0x79, 0xd5, 0x4e, 0xaf, 0x60, 0x8e, 0x02, 0xc2,
675 0xcc, 0x39, 0x97, 0x7b, 0xfd, 0xa1, 0xf8, 0x7a,
676 0x26, 0xe8, 0x55, 0xd6, 0xa4, 0x8b, 0xa0, 0x1b,
677 0x2d, 0x63, 0xaa, 0x73, 0x71, 0x6e, 0xbf, 0x8b,
678 0x3b, 0xe3, 0x1b, 0x0d, 0xbb, 0x2e, 0x44, 0x09,
679 0x64, 0xac, 0xc7, 0x9e, 0xb5, 0xc6, 0x77, 0xb0,
680 0x79, 0xb3, 0xaa, 0xfc, 0x67, 0x57, 0x9a, 0x50,
681 0x81, 0x37, 0x14, 0x7c, 0xd7, 0xa0, 0xd4, 0x6a,
682 0x79, 0x84, 0x51, 0x0e, 0x95, 0x0a, 0x30, 0xa3,
683 0x60, 0x55, 0x48, 0x05, 0x16, 0xae, 0x43, 0x90,
684 0xdc, 0x8e, 0x09, 0xbe, 0x79, 0xf6, 0x90, 0x74,
685 0xf8, 0x20, 0x96, 0x4d, 0xa7, 0xf5, 0x1a, 0x2b,
686 0xc7, 0x15, 0x9d, 0x18, 0xf7, 0x94, 0x87, 0xf7,
687 0xf4, 0xfb, 0x0d, 0x61, 0xb6, 0xd7, 0xbe, 0x10,
688 0x8e, 0x47, 0x3c, 0x10, 0x44, 0x90, 0x52, 0x21,
689 0x83, 0xc0, 0xf5, 0x99, 0xaa, 0xbc, 0xf6, 0x55,
690 0xae, 0xf5, 0xb2, 0xa4, 0xcd, 0x4d, 0xb9, 0x38,
691 0x6c, 0xbc, 0x80, 0xc3, 0xad, 0xf4, 0x46, 0x31,
692 0x01, 0x58, 0x2d, 0x88, 0x57, 0xc3, 0x23, 0xd1,
693 0x64, 0xc9, 0xa3, 0x21, 0x6b, 0x8b, 0x8a, 0x23,
694 0x2c, 0x4f, 0xa9, 0xcd, 0x67, 0xfa, 0x77, 0xad,
695 0xa3, 0x16, 0xa2, 0xe5, 0x19, 0x14, 0x70, 0x41,
696 0x5b, 0xda, 0x14, 0xde, 0xe3, 0xe5, 0xc1, 0x15,
697 0xb4, 0x77, 0xa4, 0x9b, 0xb8, 0xb1, 0x28, 0x51,
698 0x30, 0xb4, 0xf1, 0xf3, 0xf8, 0x6d, 0xd0, 0xc3,
699 0x8c, 0x4c, 0x76, 0xb0, 0x9a, 0xdf, 0xc8, 0xbe,
700 0xf8, 0x4a, 0x61, 0x6e, 0x3e, 0xd6, 0x3c, 0xe8,
701 0xde, 0x56, 0xa0, 0x9c, 0x25, 0xbe, 0xce, 0x93,
702 0x1f, 0x88, 0xfb, 0x9a, 0x1a, 0xe2, 0xff, 0x88,
703 0xad, 0x10, 0xcb, 0x6c, 0xd6, 0xe7, 0x39, 0x0b,
704 0xe5, 0x1a, 0x06, 0x05, 0x64, 0x5b, 0x0a, 0xdf,
705 0x22, 0x58, 0xd7, 0xfb, 0x88, 0x12, 0xdd, 0xb7,
706 0x52, 0x3a, 0xc9, 0xbf, 0x49, 0xdf, 0x8c, 0x87,
707 0x9f, 0x84, 0xb5, 0x0a, 0xf6, 0x00, 0x52, 0xae,
708 0x67, 0x12, 0x1a, 0x8c, 0x71, 0x15, 0xf5, 0xa1,
709 0x13, 0x39, 0xf0, 0x91, 0x7e, 0x88, 0x7c, 0xb3,
710 0x95, 0x50, 0x02, 0xa6, 0x63, 0xb5, 0x64, 0xfb,
711 0x90, 0x87, 0x61, 0xe2, 0x27, 0xaf, 0x11, 0x0c,
712 0x73, 0x83, 0xef, 0xa9, 0x28, 0xfe, 0xc8, 0x85,
713 0x1a, 0x3a, 0xde, 0xf2, 0xe5, 0x25, 0x64, 0x6d,
714 0xaa, 0x41, 0x4c, 0x80, 0x2e, 0x84, 0xff, 0xc1,
715 0xc0, 0x54, 0x0c, 0x29, 0x1b, 0xa3, 0x07, 0x7c,
716 0x33, 0x4c, 0x10, 0xf6, 0x6f, 0x79, 0xdf, 0xd3,
717 0xf0, 0x24, 0x57, 0xf1, 0x60, 0xe1, 0xf0, 0xbd,
718 0xc4, 0x1f, 0xf4, 0x67, 0xd2, 0xd3, 0xcc, 0x6a,
719 0x07, 0x72, 0x44, 0x16, 0x85, 0x46, 0xd0, 0x73,
720 0x87, 0xa9, 0xc7, 0x2f, 0xd1, 0xf5, 0xec, 0xe3,
721 0x28, 0xa3, 0x93, 0x4f, 0xd7, 0x76, 0xc1, 0x3c,
722 0x0d, 0x13, 0x33, 0xcf, 0x5b, 0xbd, 0x6a, 0x52,
723 0x4e, 0xee, 0xc8, 0x5e, 0xa1, 0x58, 0x4a, 0x08,
724 0x81, 0xd9, 0x23, 0xcc, 0xfb, 0x1c, 0xb2, 0xd8,
725 0xa3, 0xe4, 0x53, 0xfe, 0xf4, 0x4b, 0x48, 0xc1,
726 0x20, 0xa4, 0x97, 0xf8, 0x38, 0xa3, 0x69, 0xc1,
727 0x11, 0xf0, 0xa1, 0x3b, 0xa9, 0x9a, 0x12, 0x61,
728 0xe8, 0x8d, 0x99, 0x44, 0x3f, 0x94, 0x72, 0x82,
729 0x19, 0x96, 0x62, 0xb0, 0xa6, 0x64, 0x05, 0x19,
730 0x8f, 0xd6, 0x5d, 0x05, 0xbf, 0x79, 0x9e, 0x9d,
731 0xe4, 0x93, 0x4c, 0xad, 0x61, 0x8c, 0x18, 0xda,
732 0xb6, 0x2e, 0xb3, 0xca, 0x14, 0x4d, 0x53, 0xa4,
733 0x97, 0x27, 0x10, 0x56, 0xa2, 0x67, 0x5a, 0x5a,
734 0x5e, 0x13, 0xc0, 0xdb, 0xa7, 0x9f, 0x45, 0x5b,
735 0xeb, 0x1a, 0x14, 0x0c, 0x8c, 0x38, 0x5e, 0x77,
736 0x9a, 0xec, 0x75, 0x68, 0x93, 0x65, 0x02, 0x9c,
737 0xfb, 0x62, 0x60, 0x49, 0xdd, 0xb2, 0x2a, 0x67,
738 0x86, 0xe3, 0x8a, 0x7d, 0x8c, 0x46, 0x78, 0x81,
739 0x60, 0x69, 0xf2, 0x3f, 0x74, 0x11, 0x35, 0xff,
740 0x77, 0xa3, 0x66, 0x20, 0xfc, 0x98, 0x4a, 0x35,
741 0x7a, 0x52, 0xe4, 0x90, 0x13, 0x80, 0xb9, 0xa6,
742 0x73, 0x7a, 0x7d, 0x66, 0x6e, 0x6b, 0xb6, 0x43,
743 0x10, 0xd5, 0x91, 0x2b, 0x66, 0xdd, 0x89, 0x87,
744 0xe3, 0x8c, 0x58, 0x53, 0x2f, 0x40, 0x74, 0x45,
745 0x1b, 0x77, 0x7a, 0xa4, 0x44, 0x19, 0x78, 0xba,
746 0x87, 0x10, 0x41, 0x31, 0x32, 0x5f, 0x87, 0x68,
747 0xde, 0x43, 0x4a, 0xef, 0x33, 0xb3, 0x11, 0x83,
748 0xa9, 0xc2, 0x6f, 0x8d, 0x34, 0xe2, 0x95, 0x84,
749 0x3a, 0x4f, 0x6f, 0x8c, 0x31, 0x1d, 0xb6, 0xf5,
750 0x95, 0x0d, 0x01, 0x11, 0x20, 0xdf, 0x72, 0xf3,
751 0x3f, 0x9a, 0x33, 0xaa, 0xb1, 0x06, 0x6a, 0x63,
752 0x47, 0x91, 0x01, 0xdf, 0xb3, 0x54, 0x36, 0xfd,
753 0x06, 0x2d, 0xb8, 0x08, 0xe3, 0xd3, 0x65, 0xac,
754 0x66, 0x03, 0xee, 0xa4, 0x63, 0xbd, 0xd4, 0xce,
755 0xbd, 0x79, 0xa7, 0x48, 0x38, 0xc5, 0x7d, 0xb5,
756 0x71, 0x9a, 0x3c, 0x11, 0x7c, 0x6c, 0xe2, 0x54,
757 0x02, 0x5d, 0x42, 0xab, 0x25, 0x93, 0x66, 0x01,
758 0x37, 0x78, 0x35, 0x4a, 0x8c, 0x19, 0x4d, 0x00,
759 0x75, 0x4f, 0xcc, 0xc0, 0x26, 0x82, 0xc1, 0x35,
760 0x8c, 0xc7, 0xc2, 0x59, 0x01, 0x3e, 0x98, 0x22,
761 0x88, 0x9c, 0x90, 0x75, 0x05, 0x33, 0x07, 0xb9,
762 0x39, 0x81, 0x38, 0x58, 0x10, 0x29, 0xcf, 0xc8,
763 0x98, 0xb2, 0x03, 0xd7, 0x5b, 0xb3, 0x18, 0xba,
764 0x34, 0x0c, 0x9f, 0xab, 0xd7, 0xed, 0x29, 0x82,
765 0x41, 0xe0, 0x20, 0x97, 0x57, 0x92, 0xb2, 0xb8,
766 0x10, 0x2d, 0x0b, 0xa2, 0xc5, 0x8f, 0x90, 0x6f,
767 0xed, 0x12, 0x56, 0x25, 0xbe, 0xfd, 0x75, 0xf7,
768 0xb6, 0xf8, 0x40, 0x67, 0x39, 0x11, 0xfa, 0x15,
769 0xae, 0x6a, 0x54, 0x5f, 0x32, 0x2b, 0xf8, 0x48,
770 0x55, 0xbe, 0x86, 0x2f, 0x69, 0x48, 0x5b, 0x5d,
771 0x4d, 0xb7, 0x35, 0xaa, 0xb6, 0x91, 0x88, 0x19,
772 0x96, 0x1c, 0x68, 0xf6, 0x85, 0x9e, 0xb3, 0xb2,
773 0xa3, 0x32, 0xd4, 0x52, 0x70, 0xb7, 0x62, 0xe3,
774 0x14, 0xb6, 0x78, 0x5f, 0x1b, 0x1d, 0x04, 0x9c,
775 0x26, 0x0c, 0x33, 0x94, 0xb1, 0x97, 0x08, 0xdb,
776 0x0b, 0x39, 0x29, 0xd4, 0xbc, 0x6d, 0xdf, 0x02,
777 0xc6, 0x99, 0xab, 0x99, 0x32, 0xe5, 0xce, 0x51,
778 0x4f, 0xae, 0xb8, 0x8b, 0xe0, 0xaf, 0x07, 0xc4,
779 0xf9, 0x41, 0x7c, 0x59, 0xa0, 0xac, 0x74, 0x4d,
780 0x7e, 0x43, 0x77, 0x9c, 0x06, 0x49, 0x79, 0x8a,
781 0x14, 0x73, 0x93, 0xa8, 0x5b, 0x1b, 0x34, 0x29,
782 0x78, 0x04, 0x2f, 0xd7, 0x1f, 0x13, 0x90, 0xe0,
783 0xdd, 0x3b, 0x42, 0x6b, 0x79, 0x6e, 0x52, 0xc7,
784 0x0f, 0x38, 0xda, 0x01, 0x2c, 0x8d, 0xe6, 0x94,
785 0x5d, 0x59, 0x27, 0x1d, 0x10, 0x4e, 0x11, 0x36,
786 0xfb, 0x53, 0x16, 0x05, 0x25, 0xf2, 0x64, 0xd8,
787 0xf9, 0xcd, 0x5c, 0xfe, 0xb4, 0x18, 0x44, 0x80,
788 0x10, 0xbc, 0x3d, 0xf3, 0x1d, 0x5a, 0xf0, 0xc1,
789 0xc3, 0x55, 0xff, 0x41, 0x3e, 0xe3, 0xef, 0x44,
790 0xb2, 0xc0, 0x01, 0x18, 0xa2, 0x49, 0x88, 0x78,
791 0x0d, 0x4c, 0xc8, 0x73, 0xcf, 0x30, 0x85, 0x3a,
792 0x88, 0x90, 0x01, 0xcf, 0x69, 0x53, 0xa3, 0x18,
793 0x3f, 0xd6, 0xe7, 0x94, 0x14, 0xa7, 0xae, 0xcd,
794 0x6f, 0x11, 0x72, 0xfe, 0x2b, 0xb0, 0x81, 0x53,
795 0xea, 0x67, 0xd6, 0xe4, 0xca, 0x42, 0xa0, 0xf9,
796 0xb1, 0xd4, 0xb5, 0x3b, 0xc9, 0xf0, 0x36, 0xc1,
797 0x1c, 0xf4, 0xb1, 0xf6, 0x84, 0xd0, 0x86, 0x6c,
798 0x76, 0x9a, 0x03, 0xc2, 0xb6, 0x2e, 0x9a, 0x46,
799 0xf5, 0x5f, 0x2c, 0x38, 0xac, 0xad, 0x6f, 0x2e,
800 0x7a, 0x18, 0x2d, 0x22, 0x95, 0x5e, 0x5e, 0xc9,
801 0x7a, 0x0a, 0x56, 0xe1, 0xc7, 0x15, 0xfd, 0xbf,
802 0xff, 0xf7, 0x7e, 0x85, 0x20, 0xa9, 0x8a, 0x9c,
803 0xa9, 0x7d, 0xe8, 0xed, 0xfc, 0x7f, 0xbb, 0xf0,
804 0x05, 0x3f, 0xce, 0x4f, 0x4c, 0xee, 0xa4, 0xa0,
805 0xcc, 0x9c, 0x62, 0x1e, 0xd6, 0xd0, 0x30, 0x37,
806 0xb8, 0x98, 0x56, 0x1d, 0xaa, 0xd6, 0x5e, 0x73,
807 0x12, 0xe4, 0x88, 0x82, 0x48, 0x64, 0x06, 0xd7,
808 0x2a, 0x31, 0x50, 0x7b, 0x10, 0x17, 0xb8, 0x4c,
809 0x5a, 0x8d, 0xf1, 0xfc, 0xf1, 0x33, 0x3b, 0x98,
810 0x42, 0x18, 0x5b, 0x35, 0x78, 0xca, 0x8e, 0x41,
811 0x52, 0xae, 0x6d, 0xe1, 0xa2, 0x9d, 0x5b, 0xbd,
812 0xf3, 0x5f, 0x49, 0xc1, 0x27, 0x06, 0xc1, 0xaf,
813 0xc0, 0xa3, 0x9d, 0xf3, 0x1c, 0x8e, 0x90, 0x8a,
814 0xb0, 0x69, 0xb0, 0xc5, 0x11, 0x0c, 0x91, 0x14,
815 0x1f, 0x5e, 0x10, 0xe1, 0x1d, 0x14, 0x30, 0x54,
816 0x1e, 0x17, 0x3d, 0x31, 0x7b, 0xbf, 0x2f, 0x9d,
817 0x6d, 0x63, 0x32, 0xf0, 0x9d, 0x9f, 0x95, 0x3d,
818 0x0b, 0xd2, 0x4d, 0x10, 0xe2, 0x3f, 0x67, 0x69,
819 0x43, 0x9a, 0x4a, 0x2c, 0x54, 0x71, 0xa8, 0xa0,
820 0x9e, 0x9f, 0x10, 0xaf, 0x1b, 0xce, 0x99, 0xe3,
821 0x25, 0x32, 0x10, 0x54, 0x80, 0xfe, 0xda, 0x57,
822 0xd0, 0xb2, 0x92, 0x7f, 0xbb, 0x5f, 0xe7, 0x4d,
823 0x1b, 0x3d, 0x46, 0x4d, 0xe4, 0x4c, 0xd6, 0xaf,
824 0x1a, 0x32, 0x12, 0x40, 0xb8, 0x84, 0x8e, 0xe4,
825 0x80, 0xce, 0x7e, 0xc1, 0x13, 0x8b, 0xb0, 0xb7,
826 0x6f, 0x24, 0xba, 0x85, 0x50, 0x83, 0xc3, 0xcf,
827 0x19, 0xb3, 0xf0, 0xc7, 0xee, 0x68, 0xbe, 0x9e,
828 0x6d, 0xb9, 0xfb, 0xd5, 0x29, 0xce, 0x82, 0xcd,
829 0x69, 0x16, 0x68, 0x6b, 0x6a, 0xf4, 0x02, 0x32,
830 0xce, 0x60, 0x37, 0x0c, 0xb9, 0x38, 0x92, 0x9c,
831 0x42, 0xa9, 0x0b, 0x53, 0x96, 0xfe, 0x39, 0xc1,
832 0x24, 0x65, 0x9b, 0xcd, 0xe7, 0x8d, 0x36, 0x07,
833 0x9f, 0x1d, 0x35, 0x8e, 0xdc, 0x4c, 0xb5, 0x68,
834 0xc5, 0xfd, 0x44, 0x19, 0xf2, 0x6c, 0x59, 0x1c,
835 0xb1, 0x0b, 0x35, 0x48, 0x86, 0x1a, 0x05, 0x22,
836 0x03, 0x0c, 0x0c, 0xa2, 0x92, 0x90, 0x35, 0xfb,
837 0x37, 0x94, 0xc7, 0x15, 0x84, 0xae, 0xe8, 0x05,
838 0xa0, 0xf7, 0x30, 0x11, 0x5c, 0xe4, 0x5d, 0x3e,
839 0x12, 0x54, 0x80, 0x54, 0x6b, 0x09, 0x8c, 0xce,
840 0x80, 0x5e, 0xa7, 0xc8, 0x6a, 0x0c, 0x56, 0xe1,
841 0x18, 0x7d, 0xc9, 0x39, 0xc1, 0xef, 0xe3, 0x25,
842 0xa0, 0x8b, 0x2f, 0x60, 0x3a, 0x43, 0x39, 0xa6,
843 0x28, 0x28, 0x7b, 0x4c, 0x77, 0xd4, 0x49, 0x61,
844 0x46, 0xe9, 0x1b, 0x45, 0xd6, 0xb1, 0x56, 0xe1,
845 0x7d, 0x34, 0xcd, 0x06, 0xb6, 0x67, 0x8d, 0x7d,
846 0x7a, 0xe2, 0xbe, 0x68, 0x35, 0xa6, 0x78, 0xe5,
847 0x47, 0x48, 0xb7, 0xc7, 0xde, 0xcd, 0xc9, 0x05,
848 0xb4, 0xe7, 0x50, 0x48, 0xe1, 0x4b, 0xfe, 0x76,
849 0x77, 0xc6, 0xf7, 0x5f, 0xcb, 0xc2, 0xa8, 0xd7,
850 0xd6, 0x8a, 0xe5, 0x49, 0xd9, 0xca, 0x45, 0xf4,
851 0xda, 0xcd, 0x33, 0xd1, 0x59, 0x2d, 0x9e, 0xc1,
852 0x5c, 0xe6, 0x01, 0x18, 0xb8, 0xf0, 0x5e, 0xb1,
853 0x69, 0x95, 0x2f, 0x02, 0x2a, 0xe7, 0x4a, 0xd7,
854 0xd1, 0xc3, 0xd5, 0x6f, 0x15, 0xc8, 0xdc, 0x29,
855 0xde, 0xb9, 0x3f, 0x8b, 0xa6, 0xbc, 0xdd, 0x25,
856 0x84, 0x35, 0x3c, 0x90, 0x2d, 0xc2, 0x1e, 0x98,
857 0x8a, 0x50, 0x09, 0x77, 0x42, 0xe9, 0x35, 0x8a,
858 0x7c, 0x97, 0xbf, 0xe8, 0xbf, 0x56, 0xd0, 0x8b,
859 0x65, 0xd3, 0xaf, 0x1e, 0x05, 0x94, 0xfa, 0xac,
860 0xa8, 0x2b, 0x28, 0xcb, 0x37, 0x3e, 0xe8, 0xbb,
861 0x66, 0x3a, 0xed, 0xb2, 0x48, 0x10, 0x0f, 0x3a,
862 0x5a, 0xc5, 0xdb, 0x26, 0x0e, 0xaa, 0x5e, 0x69,
863 0x15, 0xd6, 0x81, 0xae, 0xbd, 0xe6, 0x03, 0xf1,
864 0xf6, 0x37, 0xc8, 0xde, 0x70, 0x1f, 0x64, 0xb9,
865 0x5e, 0xbf, 0x2e, 0x4f, 0xb1, 0xea, 0xa0, 0x17,
866 0xe6, 0x7c, 0xf9, 0x2f, 0x1e, 0xd8, 0x58, 0xde,
867 0xa7, 0xf0, 0x46, 0x52, 0x95, 0xdf, 0xa4, 0x96,
868 0xd0, 0xc4, 0x97, 0x2b, 0x95, 0xcd, 0x5e, 0x40,
869 0x23, 0x5c, 0x10, 0xee, 0xba, 0x72, 0x9b, 0xcf,
870 0x0b, 0xe8, 0x18, 0x3a, 0x70, 0xd2, 0x5e, 0x07,
871 0x68, 0x93, 0xef, 0x4a, 0x5b, 0x8d, 0x72, 0x41,
872 0x4e, 0xea, 0x33, 0x6a, 0x0a, 0x5e, 0xfb, 0x02,
873 0x3f, 0xd4, 0xed, 0x5b, 0xe0, 0x42, 0x84, 0xd4,
874 0xaa, 0x85, 0xdc, 0x5b, 0x67, 0xee, 0x71, 0x67,
875 0xba, 0x8e, 0xd2, 0xbe, 0x61, 0xdf, 0x5a, 0x26,
876 0xb9, 0xf0, 0x77, 0x81, 0x53, 0x24, 0x16, 0xcb,
877 0x8c, 0xb8, 0x06, 0x6e, 0x68, 0xda, 0xc8, 0x2d,
878 0x17, 0x54, 0xdb, 0x46, 0xcb, 0xfd, 0x1f, 0x3d,
879 0x94, 0x81, 0x09, 0x4b, 0xfa, 0xb1, 0x46, 0xd9,
880 0x11, 0xa3, 0xb7, 0x31, 0x9c, 0xd2, 0x38, 0xd6,
881 0xba, 0x3d, 0xa3, 0x74, 0xd8, 0xf1, 0x24, 0xe8,
882 0x9c, 0xcb, 0x1d, 0xf9, 0x4a, 0xf7, 0xc8, 0x4b,
883 0xfe, 0x97, 0x7c, 0xa1, 0x02, 0xeb, 0x40, 0xc3,
884 0x89, 0x71, 0x01, 0xcd, 0x33, 0x2a, 0xc2, 0x82,
885 0xce, 0x62, 0x8d, 0x53, 0x7c, 0xdf, 0xce, 0xd7,
886 0xf5, 0xa8, 0x4f, 0xf2, 0xf2, 0x2e, 0xc1, 0xeb,
887 0x97, 0x99, 0x37, 0x3c, 0x53, 0xa6, 0xb4, 0x46,
888 0x05, 0x64, 0x92, 0x87, 0x08, 0x3c, 0x23, 0x4b,
889 0x9d, 0x67, 0x18, 0xf9, 0xe2, 0x0b, 0x1c, 0x39,
890 0xd3, 0x87, 0x70, 0xc0, 0xb9, 0x1e, 0x52, 0x0a,
891 0x0f, 0x48, 0xe2, 0xe7, 0x51, 0x72, 0x94, 0xf7,
892 0xa3, 0xdc, 0xe5, 0x66, 0x33, 0x39, 0x54, 0x06,
893 0x55, 0x93, 0x30, 0xf9, 0x5e, 0x76, 0x8f, 0xe0,
894 0x59, 0x4d, 0x0d, 0xa7, 0xf5, 0xbe, 0xdb, 0x20,
895 0xad, 0x0d, 0x76, 0x88, 0x5f, 0x9c, 0x7c, 0x75,
896 0x2f, 0x2a, 0x0b, 0x79, 0x6e, 0xd3, 0xe2, 0x66,
897 0xf5, 0x4a, 0x2d, 0x87, 0x87, 0x49, 0x84, 0x17,
898 0xa2, 0x62, 0x4c, 0xbb, 0xe4, 0x6e, 0x98, 0x10,
899 0xc9, 0xfb, 0x8a, 0x04, 0x68, 0x8d, 0x22, 0x66,
900 0xad, 0xea, 0x2a, 0xc9, 0x97, 0x2d, 0x3c, 0xbc,
901 0xd0, 0x77, 0x5f, 0xe6, 0xb8, 0x7f, 0xe6, 0xf6,
902 0x39, 0xbf, 0x56, 0x0e, 0x26, 0x6d, 0xc5, 0x3e,
903 0x53, 0x19, 0xd6, 0xb4, 0x57, 0x36, 0xa3, 0xc6,
904 0xd3, 0x3d, 0x66, 0x79, 0x30, 0x5c, 0x14, 0x0c,
905 0x0f, 0x3e, 0x96, 0xae, 0x90, 0x97, 0xab, 0x0d,
906 0x9f, 0xc3, 0xe7, 0x66, 0x3e, 0xe0, 0x31, 0x43,
907 0x4b, 0x01, 0xb3, 0x0e, 0x9e, 0x8c, 0x82, 0x4a,
908 0x8c, 0xc7, 0x79, 0x85, 0xdf, 0x75, 0x0d, 0xb4,
909 0x2b, 0x03, 0x14, 0xef, 0x72, 0x58, 0xfd, 0x64,
910 0xc8, 0xe3, 0x0d, 0x9a, 0x14, 0x6f, 0x76, 0xf9,
911 0x46, 0xd1, 0xd2, 0x81, 0xb3, 0x16, 0x6e, 0xc7,
912 0x76, 0x82, 0xce, 0xf4, 0xee, 0x33, 0x00, 0xe6,
913 0x77, 0xc4, 0xad, 0x4f, 0x06, 0xa7, 0x48, 0x80,
914 0x9e, 0x21, 0x66, 0xca, 0x75, 0x69, 0x57, 0xcb,
915 0xf0, 0x67, 0x6a, 0xaa, 0x8f, 0x88, 0x14, 0xbd,
916 0x65, 0x62, 0xe2, 0xad, 0xcc, 0x22, 0x88, 0x7b,
917 0x94, 0xbd, 0x0e, 0xcd, 0xb6, 0x69, 0xa2, 0xcb,
918 0x7d, 0x57, 0x5c, 0xb4, 0x92, 0x80, 0x13, 0x99,
919 0x84, 0xf3, 0x79, 0x0a, 0x2d, 0x70, 0xa4, 0xe0,
920 0xde, 0xc6, 0x32, 0xb0, 0x8a, 0x62, 0xb5, 0xcf,
921 0xfa, 0x5e, 0x5a, 0x92, 0x32, 0x7d, 0x34, 0x07,
922 0xb5, 0x52, 0x3a, 0xb5, 0x7d, 0x0f, 0xa1, 0xba,
923 0x56, 0xd0, 0x07, 0x76, 0x11, 0xf2, 0xc3, 0x33,
924 0x9d, 0xbd, 0x12, 0x35, 0x5e, 0xf7, 0x05, 0x88,
925 0x76, 0x94, 0xa6, 0xbf, 0xed, 0xb8, 0xa4, 0xa2,
926 0x0c, 0xbe, 0x0f, 0x6a, 0xaf, 0xf3, 0x1b, 0x33,
927 0x4a, 0xb7, 0x68, 0x3f, 0xbe, 0x95, 0x13, 0x97,
928 0x0f, 0x15, 0x17, 0x1b, 0x23, 0xaa, 0x08, 0x78,
929 0xa6, 0x5b, 0x08, 0xa2, 0x9d, 0x03, 0xa8, 0xa7,
930 0x39, 0xdc, 0xbc, 0x9a, 0x85, 0xf5, 0xe5, 0x55,
931 0x59, 0x3c, 0xef, 0xf9, 0x3f, 0x22, 0x8e, 0xf8,
932 0xd8, 0x3e, 0x02, 0x0b, 0xd8, 0x78, 0x4b, 0x15,
933 0x7f, 0xaa, 0x2c, 0xff, 0xbe, 0x77, 0x33, 0xc7,
934 0x6a, 0x12, 0xaa, 0xa4, 0xbe, 0xc0, 0x3b, 0xcb,
935 0x13, 0x9d, 0x9c, 0x5a, 0x9f, 0x8a, 0x57, 0x36,
936 0x4f, 0x02, 0x5a, 0xf8, 0x1d, 0x97, 0x77, 0x43,
937 0xc8, 0xa5, 0xb7, 0x9b, 0x10, 0x98, 0xfd, 0x58,
938 0xbf, 0x42, 0xf6, 0xbf, 0xff, 0x6c, 0x40, 0x18,
939 0x18, 0xdf, 0xac, 0x57, 0x71, 0xea, 0xcc, 0x8e,
940 0xfd, 0xfe, 0x10, 0xfb, 0xb9, 0xfe, 0xbc, 0x9a,
941 0x9c, 0x27, 0xe4, 0x10, 0x15, 0x94, 0x41, 0xa1,
942 0xcc, 0xf6, 0x25, 0x49, 0x4f, 0x96, 0xc1, 0x8c,
943 0x9e, 0x3e, 0x18, 0x29, 0x49, 0x92, 0xe7, 0xfe,
944 0x22, 0xff, 0xed, 0x02, 0x16, 0x90, 0xef, 0xac,
945 0xec, 0x95, 0x1d, 0x5b, 0x94, 0x9c, 0xf6, 0x7c,
946 0x1b, 0x5a, 0x9d, 0xb0, 0x9b, 0x05, 0x36, 0xbf,
947 0xef, 0xec, 0x63, 0x35, 0x40, 0x24, 0x45, 0x40,
948 0x30, 0x1a, 0x9b, 0x90, 0xc3, 0xc2, 0xf7, 0x37,
949 0xfb, 0x08, 0x8e, 0x48, 0x19, 0x48, 0xed, 0xa8,
950 0xa8, 0x04, 0x6f, 0xd0, 0x33, 0xe9, 0xb8, 0x8d,
951 0xe7, 0x1e, 0x5c, 0x47, 0x74, 0xc0, 0x66, 0x30,
952 0x4e, 0xa7, 0x86, 0x73, 0xf1, 0xe5, 0x78, 0xa6,
953 0xe0, 0xc1, 0xda, 0x13, 0x72, 0x07, 0x85, 0x34,
954 0x63, 0x95, 0x49, 0x30, 0x4b, 0x9d, 0x03, 0xf1,
955 0x7a, 0x6b, 0x91, 0xa2, 0x85, 0x41, 0xf9, 0x4a,
956 0xd6, 0xff, 0xff, 0x86, 0xf7, 0xf0, 0xce, 0xb9,
957 0x07, 0xf1, 0x88, 0x04, 0x33, 0xaa, 0xeb, 0x54,
958 0xb2, 0x1c, 0x8e, 0x2e, 0x7b, 0x04, 0xa8, 0xcc,
959 0x2c, 0x7a, 0xb3, 0xad, 0x1a, 0x89, 0x38, 0x89,
960 0xd7, 0x11, 0x3a, 0x8c, 0xcf, 0xe3, 0xc5, 0xba,
961 0xb0, 0xcc, 0xc4, 0xe3, 0x33, 0xf3, 0x18, 0xba,
962 0xec, 0x56, 0xd9, 0x1c, 0x40, 0x70, 0x0d, 0x4e,
963 0x97, 0x01, 0x23, 0xf3, 0x5a, 0xdc, 0xbf, 0x68,
964 0x93, 0xc2, 0x1d, 0x8a, 0x96, 0xb7, 0xac, 0x18,
965 0x6f, 0xf7, 0x84, 0x71, 0x0d, 0x3d, 0xf8, 0xba,
966 0xdf, 0xb6, 0x89, 0x1d, 0x78, 0x19, 0xf2, 0x59,
967 0xe9, 0x15, 0x55, 0x29, 0x73, 0x50, 0x59, 0x14,
968 0x02, 0x21, 0x16, 0x8f, 0x0f, 0xdf, 0xa5, 0xf0,
969};
970
971static struct crc_test {
972 uint32_t crc; /* random starting crc */
973 uint32_t start; /* random offset in buf */
974 uint32_t length; /* random length of test */
975 uint32_t crc_le; /* expected crc32_le result */
976 uint32_t crc_be; /* expected crc32_be result */
977} test[] = {
978 {0xffffffff, 0x00000000, 0x00001000, 0x13934bef, 0x14f3b75f},
979 {0xfe7328ea, 0x00000763, 0x00000717, 0xed2c0d70, 0x57531214},
980 {0x4c40684e, 0x00000721, 0x0000011e, 0xd7f46ccc, 0xedf12ec3},
981 {0x6b487f90, 0x00000264, 0x000007bc, 0x759e9939, 0x9af8e387},
982 {0x9f5810db, 0x00000afa, 0x00000255, 0x2685197f, 0x716de6ed},
983 {0xb15c4755, 0x00000d5b, 0x000002a4, 0xd8fadcb5, 0xfc34ae3f},
984 {0x06518253, 0x00000ffb, 0x00000004, 0xabee2433, 0xfa30ac9e},
985 {0xd9e71c55, 0x00000a2a, 0x00000259, 0x96682af2, 0xe5907ea3},
986 {0x0c1ae843, 0x00000ce4, 0x0000031b, 0x7b637c43, 0xe7f71b04},
987 {0xec3cd517, 0x000002ff, 0x00000566, 0x5d719a77, 0xed16e045},
988 {0x77828e95, 0x0000067f, 0x0000038f, 0x43ee5b6c, 0x35999927},
989 {0xec87b4e3, 0x00000d1c, 0x000002e3, 0x2ddd2eee, 0x9452d3f8},
990 {0x412158bb, 0x00000eee, 0x00000111, 0x67b38ba2, 0x177976d0},
991 {0x2e52de3e, 0x00000c4a, 0x000003b5, 0xbcc5d61d, 0xf60fee71},
992 {0x6ddaae8b, 0x00000d99, 0x00000266, 0x8b535544, 0x1dab8596},
993 {0x049b6cb1, 0x000009c5, 0x000000b0, 0xfc22cabc, 0x47ebc954},
994 {0x77d4b954, 0x0000028a, 0x000007fa, 0x71d00923, 0x905585ef},
995 {0x5e192355, 0x00000ac1, 0x000001fa, 0xb966b81a, 0x33c12903},
996 {0x7d80b71d, 0x00000213, 0x000001e0, 0x2bba371a, 0x5f4bd8d9},
997 {0x01f6f1e4, 0x000001d6, 0x00000395, 0xb7e8a647, 0x2a7943a1},
998 {0x1dfabb13, 0x00000e14, 0x000001eb, 0x53917fba, 0x8dee1e5d},
999 {0xb00a4449, 0x00000bf6, 0x00000409, 0xedecb577, 0x628e087d},
1000 {0x7ecd3981, 0x0000083f, 0x0000016b, 0xefef62b9, 0xda4f94e6},
1001 {0xf8f330d2, 0x000004be, 0x00000757, 0x9357c9f3, 0x8e2d5c2f},
1002 {0x03c38af2, 0x00000d23, 0x000002dc, 0x360fa8c0, 0x6294c0d6},
1003 {0x687bb79b, 0x00000f3d, 0x000000c2, 0x448d3be2, 0x08f48f3a},
1004 {0x6710f550, 0x000009e9, 0x00000603, 0xdbfd1998, 0xc950ac29},
1005 {0x873171d1, 0x00000787, 0x000004d5, 0xab7f1b62, 0xe66896ab},
1006 {0x373b1314, 0x00000f0f, 0x000000f0, 0x184098ab, 0x4038e674},
1007 {0x90fad9cd, 0x00000ead, 0x00000152, 0x23ce52ff, 0x9eff3974},
1008 {0x19676fe7, 0x0000007d, 0x0000070d, 0xf8a76f1e, 0xfbc5c8a9},
1009 {0x89facd45, 0x000005f3, 0x00000473, 0x4331a006, 0xb8f0f0cc},
1010 {0x6f173747, 0x00000fc3, 0x0000003c, 0xb012f08e, 0x5126e378},
1011 {0x4b44a106, 0x0000075a, 0x0000008b, 0xf6f7ac38, 0xf9b1781b},
1012 {0xb620ad06, 0x00000774, 0x0000017e, 0xd34558e6, 0xb175edd3},
1013 {0x976f21e9, 0x000008d7, 0x0000034a, 0xe533aa3a, 0x1e4367b9},
1014 {0x687628c0, 0x000006c5, 0x0000061b, 0x3a840b15, 0xfb5989a0},
1015 {0xe24ac108, 0x00000cd0, 0x0000032f, 0x51010ae8, 0xcdd8f182},
1016 {0x361c44a3, 0x00000304, 0x00000719, 0xfd7bd481, 0x12de540f},
1017 {0xd93ff95e, 0x00000db7, 0x0000008e, 0xcfbbc304, 0x42eecd5a},
1018 {0xed752d12, 0x00000883, 0x00000091, 0x65a6c868, 0x9ebfa578},
1019 {0xb4ff4b54, 0x000003d3, 0x000001c1, 0xf82597e7, 0xa8ad2b19},
1020 {0x111b520f, 0x00000708, 0x000000eb, 0xc3e109f3, 0x323ace17},
1021 {0x62c806f2, 0x00000ba3, 0x0000045c, 0x874d3a72, 0xaf1a1360},
1022 {0x40d97470, 0x000005e1, 0x0000058d, 0x87a9684f, 0x524244a8},
1023 {0x4312179c, 0x00000056, 0x0000070e, 0x809a00f5, 0xf9e940b0},
1024 {0x13d5f84c, 0x00000a2d, 0x00000104, 0xf3d27578, 0x5d33341c},
1025 {0x1f302cb2, 0x00000151, 0x00000014, 0x1e162693, 0x53c3cfc3},
1026 {0xe491db24, 0x00000600, 0x000006f6, 0x7ff09615, 0xa300ecf7},
1027 {0xf9a98069, 0x000002ba, 0x000002ad, 0x01af7387, 0x31c0911e},
1028 {0xe9c477ad, 0x0000015f, 0x00000778, 0x6facf9a0, 0x1993b688},
1029 {0x353f32b2, 0x0000087c, 0x00000783, 0x6cc964ea, 0x418db561},
1030 {0x78e1b24f, 0x00000650, 0x000006a8, 0xb3bb7c27, 0xf2aad006},
1031 {0x61aa400e, 0x00000049, 0x00000254, 0xb8cd1681, 0x79150b15},
1032 {0xb84b10b0, 0x00000f73, 0x0000008c, 0x406a6450, 0x0c705222},
1033 {0x9fa99c9c, 0x00000a7c, 0x000004d7, 0xfb3d21b4, 0xe4e789df},
1034 {0x3fc9ebe3, 0x00000cd9, 0x000000d6, 0x43803f9c, 0x5a152be5},
1035 {0x529879cd, 0x000002f2, 0x00000595, 0x78b4c6a6, 0xf7236ec4},
1036 {0x3a933019, 0x00000516, 0x00000266, 0xdcb45436, 0x2c7935f5},
1037 {0x887b4977, 0x00000227, 0x0000038d, 0xc5f7c3d9, 0x0d6d7df6},
1038 {0x770745de, 0x000008c6, 0x00000739, 0xf69145e8, 0x47d5efc9},
1039 {0x28be3b47, 0x00000c46, 0x0000032b, 0x764c028f, 0x1eb70d64},
1040 {0x5013a050, 0x00000cf6, 0x00000309, 0xea8fe164, 0x186affa4},
1041 {0x2ec4c9ba, 0x000006e8, 0x0000078d, 0xa35557a9, 0xb41f49ec},
1042 {0xa9f950c9, 0x00000d33, 0x000002cc, 0x41ea8618, 0xab8dfae3},
1043 {0x5b520229, 0x000007b2, 0x00000484, 0x44569f1f, 0x607a8052},
1044 {0xd8dcbbfc, 0x0000002f, 0x0000048c, 0xdb88ab8b, 0xf1c411f1},
1045 {0x25529792, 0x00000d1d, 0x000002e2, 0x20cda404, 0x32683a2d},
1046 {0x9f3f6d71, 0x00000238, 0x0000079a, 0x0720443e, 0x4b8ba2ff},
1047 {0x64121215, 0x000007ff, 0x0000038f, 0x6aacff2c, 0x3b84233b},
1048 {0xfb6cdde0, 0x00000ef8, 0x00000107, 0xbd43a0f1, 0x926624d0},
1049 {0x221c9d6f, 0x000007b6, 0x0000014f, 0xb67f834b, 0x2bdedda4},
1050 {0x030e1de4, 0x00000836, 0x000004b4, 0x0d67d26a, 0x75a73b73},
1051 {0xb56fa6cf, 0x00000c07, 0x000003f8, 0x60601ac1, 0x10a43f35},
1052 {0xb55c89f5, 0x0000098e, 0x000001d4, 0x2400efbe, 0x006e28eb},
1053 {0x5e90b6d5, 0x0000070b, 0x000003ea, 0x3bb5d6ea, 0xb175fa6b},
1054 {0x2a7045ae, 0x00000961, 0x00000633, 0xfca89e4b, 0x962cd6d2},
1055 {0x8b374ea9, 0x000006ba, 0x00000780, 0xbce036ed, 0x4dc8279b},
1056 {0x8bd90bc9, 0x00000562, 0x00000369, 0xcb26a24b, 0x50dee743},
1057 {0x5b1b1762, 0x000000fd, 0x0000051a, 0x33cdda07, 0xee75ff7b},
1058 {0xa4153555, 0x0000058f, 0x000005c7, 0xbe50eeca, 0xe73fffcc},
1059 {0x0be1f931, 0x00000651, 0x00000672, 0x95a25753, 0x4ad6270f},
1060 {0xb7e78618, 0x00000a7f, 0x000002bb, 0xe06bcc1c, 0x1a35ee59},
1061 {0x4a9bc41b, 0x00000e51, 0x000001ae, 0x709e8d2c, 0x75080ca8},
1062 {0xfc359d13, 0x00000440, 0x000002f8, 0x0a58451f, 0x6fa3cfbf},
1063 {0x5aa48619, 0x000006d1, 0x00000284, 0x928ead83, 0xbd600efc},
1064 {0xa609afa8, 0x0000053e, 0x00000272, 0xb048c141, 0x184f80bb},
1065 {0x3f108afb, 0x00000949, 0x00000150, 0x9a6bb5bc, 0x0ea02be1},
1066 {0x79bec2d3, 0x000008ed, 0x00000712, 0x32692d57, 0x2eb13289},
1067 {0x9429e067, 0x00000bc3, 0x0000043c, 0x5295ceff, 0x8a9014a7},
1068 {0xae58b96a, 0x0000082d, 0x000007d2, 0xc2a681ba, 0x6af94089},
1069 {0x95df24be, 0x00000985, 0x000004c1, 0x3a287765, 0x379fcb42},
1070 {0x5e94976f, 0x00000596, 0x000004ed, 0xff00c489, 0x991fc1f5},
1071 {0xf5e5f1de, 0x00000d31, 0x000002ce, 0x35f28e91, 0x543def1a},
1072 {0xa2c219cf, 0x00000a3c, 0x00000374, 0x707d21eb, 0xa6d28bc1},
1073 {0xf21b6ceb, 0x00000919, 0x00000135, 0x0847fb8b, 0x224468c2},
1074 {0xaa988728, 0x00000787, 0x00000771, 0x885aeaa4, 0x814db00b},
1075 {0xaa5dfaac, 0x000003e5, 0x0000051b, 0x52c48ab7, 0x725bef8a},
1076 {0x0a053968, 0x00000d2a, 0x000002d5, 0x7a90256d, 0xc53b9402},
1077 {0x1421dc20, 0x00000eef, 0x00000110, 0x97d6da24, 0x10846935},
1078 {0xb47c2166, 0x00000a6a, 0x00000209, 0xcfd6cc52, 0x46e2797e},
1079 {0x77dd1955, 0x000000de, 0x00000266, 0xba74bcaa, 0x4fa3fe9c},
1080 {0x68a03cc2, 0x0000082f, 0x000007b0, 0x752bd5d8, 0x4f760c63},
1081 {0x0226b0a3, 0x00000a5f, 0x000005a0, 0x82de4970, 0x8ee1310e},
1082 {0x637bf3b1, 0x00000d93, 0x0000026c, 0x5c7115cb, 0x9f6a0ced},
1083 {0x3b120edf, 0x00000c13, 0x000003ec, 0x80d7d20f, 0x241657d5},
1084 {0xe2456780, 0x000002eb, 0x00000641, 0xc0a5d289, 0x74df96b4},
1085 {0x9b2e7125, 0x00000c0c, 0x000003f3, 0xcc15f57e, 0x03e290bf},
1086 {0x153033ef, 0x00000787, 0x000006b6, 0x3cde443b, 0x7bf1d121},
1087 {0x18458b3f, 0x0000066c, 0x00000561, 0x9a2bd8c6, 0x9d564bef},
1088 {0x4ff9d4b9, 0x00000c8f, 0x0000033a, 0xd0ee6d6d, 0xee00aa0b},
1089 {0xdf84b5d9, 0x00000802, 0x0000029a, 0xdab0d74a, 0xd0cb63dc},
1090 {0x81ee15df, 0x000003ce, 0x00000725, 0x9942e2de, 0xe48fb26b},
1091 {0x5c768e04, 0x00000afd, 0x00000160, 0x36110831, 0x8dc74483},
1092 {0xe5e18094, 0x00000b4b, 0x000000a0, 0xffa3e4a7, 0xc0145e1b},
1093 {0xed7263b6, 0x00000d0d, 0x000002f2, 0xb0006a35, 0x5468ae3a},
1094 {0x5bfde7d7, 0x000006fb, 0x00000554, 0xa4193b76, 0xb73d34b2},
1095 {0x67f4a743, 0x00000b85, 0x0000047a, 0xf05c8d8f, 0x4f843e49},
1096 {0xf13bdf22, 0x00000ff7, 0x00000008, 0x816351eb, 0x41f537f6},
1097 {0x08ecc608, 0x00000d5d, 0x00000098, 0x90492772, 0xf5172204},
1098 {0x296f52ba, 0x000004f9, 0x00000788, 0x5e5a4896, 0xe01d5b46},
1099 {0xbe4624c2, 0x00000427, 0x000004ef, 0xcd267b94, 0x7b9069f4},
1100 {0x906f7c7c, 0x00000a05, 0x0000003f, 0x03fcfc33, 0x7b6ff563},
1101 {0x8f7b323e, 0x00000458, 0x000004c7, 0xcd4969c8, 0xd4c22ada},
1102 {0x88d6593d, 0x00000597, 0x000005b5, 0xf199cd3b, 0x5c3e8ca2},
1103 {0x978a7768, 0x00000268, 0x000001d3, 0xb28c95bd, 0x49a2cc67},
1104 {0x857a621e, 0x000007a7, 0x000003a8, 0xf4bf84ab, 0xde26f369},
1105 {0xb0e121ef, 0x000005be, 0x00000644, 0x28747c14, 0x61d4dc6b},
1106 {0, 0, 0, 0, 0},
1107};
1108
1109static int test_crc32c(void)
1110{
1111 struct crc_test *t = test;
1112 int failures = 0;
1113
1114 while (t->length) {
1115 uint32_t be, le;
1116 le = ext2fs_crc32c_le(t->crc, test_buf + t->start, t->length);
1117 be = ext2fs_crc32c_be(t->crc, test_buf + t->start, t->length);
1118 if (le != t->crc_le) {
1119 printf("Test %d LE fails, %x != %x\n",
Andreas Dilger00eb0ee2012-11-29 05:47:53 -07001120 (int) (t - test), le, t->crc_le);
Darrick J. Wongdb8bbf22011-09-15 23:46:37 -04001121 failures++;
1122 }
1123 if (be != t->crc_be) {
1124 printf("Test %d BE fails, %x != %x\n",
Andreas Dilger00eb0ee2012-11-29 05:47:53 -07001125 (int) (t - test), be, t->crc_be);
Darrick J. Wongdb8bbf22011-09-15 23:46:37 -04001126 failures++;
1127 }
1128 t++;
1129 }
1130
1131 return failures;
1132}
1133
1134int main(int argc, char *argv[])
1135{
1136 int ret;
1137
1138 ret = test_crc32c();
1139 if (!ret)
1140 printf("No failures.\n");
1141
1142 return ret;
1143}
1144#endif /* UNITTEST */