blob: 410093dbe51cba0e430301530eb4f567abc720ee [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Bob Pearson78dff412012-03-23 15:02:24 -07002 * Aug 8, 2011 Bob Pearson with help from Joakim Tjernlund and George Spelvin
3 * cleaned up code to current version of sparse and added the slicing-by-8
4 * algorithm to the closely similar existing slicing-by-4 algorithm.
5 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07006 * Oct 15, 2000 Matt Domsch <Matt_Domsch@dell.com>
7 * Nicer crc32 functions/docs submitted by linux@horizon.com. Thanks!
8 * Code was from the public domain, copyright abandoned. Code was
9 * subsequently included in the kernel, thus was re-licensed under the
10 * GNU GPL v2.
11 *
12 * Oct 12, 2000 Matt Domsch <Matt_Domsch@dell.com>
13 * Same crc32 function was used in 5 other places in the kernel.
14 * I made one version, and deleted the others.
15 * There are various incantations of crc32(). Some use a seed of 0 or ~0.
16 * Some xor at the end with ~0. The generic crc32() function takes
17 * seed as an argument, and doesn't xor at the end. Then individual
18 * users can do whatever they need.
19 * drivers/net/smc9194.c uses seed ~0, doesn't xor with ~0.
20 * fs/jffs2 uses seed 0, doesn't xor with ~0.
21 * fs/partitions/efi.c uses seed ~0, xor's with ~0.
22 *
23 * This source code is licensed under the GNU General Public License,
24 * Version 2. See the file COPYING for more details.
25 */
26
Bob Pearsonfbedceb2012-03-23 15:02:22 -070027/* see: Documentation/crc32.txt for a description of algorithms */
28
Linus Torvalds1da177e2005-04-16 15:20:36 -070029#include <linux/crc32.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070030#include <linux/module.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070031#include <linux/types.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070032#include "crc32defs.h"
Bob Pearson60e58d52012-03-23 15:02:22 -070033
Bob Pearson9a1dbf62012-03-23 15:02:23 -070034#if CRC_LE_BITS > 8
Bob Pearsonce4320d2012-03-23 15:02:23 -070035# define tole(x) ((__force u32) __constant_cpu_to_le32(x))
Linus Torvalds1da177e2005-04-16 15:20:36 -070036#else
Joakim Tjernlund4f2a94632010-03-05 13:43:55 -080037# define tole(x) (x)
38#endif
39
Bob Pearson9a1dbf62012-03-23 15:02:23 -070040#if CRC_BE_BITS > 8
Bob Pearsonce4320d2012-03-23 15:02:23 -070041# define tobe(x) ((__force u32) __constant_cpu_to_be32(x))
Joakim Tjernlund4f2a94632010-03-05 13:43:55 -080042#else
43# define tobe(x) (x)
Linus Torvalds1da177e2005-04-16 15:20:36 -070044#endif
Bob Pearson60e58d52012-03-23 15:02:22 -070045
Linus Torvalds1da177e2005-04-16 15:20:36 -070046#include "crc32table.h"
47
48MODULE_AUTHOR("Matt Domsch <Matt_Domsch@dell.com>");
Darrick J. Wong46c58012012-03-23 15:02:25 -070049MODULE_DESCRIPTION("Various CRC32 calculations");
Linus Torvalds1da177e2005-04-16 15:20:36 -070050MODULE_LICENSE("GPL");
51
Bob Pearson9a1dbf62012-03-23 15:02:23 -070052#if CRC_LE_BITS > 8 || CRC_BE_BITS > 8
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080053
Bob Pearson324eb0f2012-03-23 15:02:24 -070054/* implements slicing-by-4 or slicing-by-8 algorithm */
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080055static inline u32
Joakim Tjernlund836e2af2010-05-24 14:33:31 -070056crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256])
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080057{
Andrew Morton0d2daf52010-05-25 23:43:03 -070058# ifdef __LITTLE_ENDIAN
Joakim Tjernlund57423322012-01-10 15:10:18 -080059# define DO_CRC(x) crc = t0[(crc ^ (x)) & 255] ^ (crc >> 8)
Bob Pearson324eb0f2012-03-23 15:02:24 -070060# define DO_CRC4 (t3[(q) & 255] ^ t2[(q >> 8) & 255] ^ \
61 t1[(q >> 16) & 255] ^ t0[(q >> 24) & 255])
62# define DO_CRC8 (t7[(q) & 255] ^ t6[(q >> 8) & 255] ^ \
63 t5[(q >> 16) & 255] ^ t4[(q >> 24) & 255])
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080064# else
Joakim Tjernlund57423322012-01-10 15:10:18 -080065# define DO_CRC(x) crc = t0[((crc >> 24) ^ (x)) & 255] ^ (crc << 8)
Bob Pearson324eb0f2012-03-23 15:02:24 -070066# define DO_CRC4 (t0[(q) & 255] ^ t1[(q >> 8) & 255] ^ \
67 t2[(q >> 16) & 255] ^ t3[(q >> 24) & 255])
68# define DO_CRC8 (t4[(q) & 255] ^ t5[(q >> 8) & 255] ^ \
69 t6[(q >> 16) & 255] ^ t7[(q >> 24) & 255])
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080070# endif
Joakim Tjernlund4f2a94632010-03-05 13:43:55 -080071 const u32 *b;
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080072 size_t rem_len;
Bob Pearson0292c492012-03-23 15:02:24 -070073# ifdef CONFIG_X86
74 size_t i;
75# endif
Joakim Tjernlund57423322012-01-10 15:10:18 -080076 const u32 *t0=tab[0], *t1=tab[1], *t2=tab[2], *t3=tab[3];
Thiago Rafael Becker49ac5722012-07-30 14:41:26 -070077# if CRC_LE_BITS != 32
Bob Pearson324eb0f2012-03-23 15:02:24 -070078 const u32 *t4 = tab[4], *t5 = tab[5], *t6 = tab[6], *t7 = tab[7];
Thiago Rafael Becker49ac5722012-07-30 14:41:26 -070079# endif
Bob Pearson324eb0f2012-03-23 15:02:24 -070080 u32 q;
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080081
82 /* Align it */
Joakim Tjernlund4f2a94632010-03-05 13:43:55 -080083 if (unlikely((long)buf & 3 && len)) {
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080084 do {
Joakim Tjernlund4f2a94632010-03-05 13:43:55 -080085 DO_CRC(*buf++);
86 } while ((--len) && ((long)buf)&3);
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080087 }
Bob Pearson324eb0f2012-03-23 15:02:24 -070088
89# if CRC_LE_BITS == 32
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080090 rem_len = len & 3;
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -080091 len = len >> 2;
Bob Pearson324eb0f2012-03-23 15:02:24 -070092# else
93 rem_len = len & 7;
94 len = len >> 3;
95# endif
96
Joakim Tjernlund4f2a94632010-03-05 13:43:55 -080097 b = (const u32 *)buf;
Bob Pearson0292c492012-03-23 15:02:24 -070098# ifdef CONFIG_X86
99 --b;
100 for (i = 0; i < len; i++) {
101# else
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800102 for (--b; len; --len) {
Bob Pearson0292c492012-03-23 15:02:24 -0700103# endif
Bob Pearson324eb0f2012-03-23 15:02:24 -0700104 q = crc ^ *++b; /* use pre increment for speed */
105# if CRC_LE_BITS == 32
106 crc = DO_CRC4;
107# else
108 crc = DO_CRC8;
109 q = *++b;
110 crc ^= DO_CRC4;
111# endif
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800112 }
113 len = rem_len;
114 /* And the last few bytes */
115 if (len) {
116 u8 *p = (u8 *)(b + 1) - 1;
Bob Pearson0292c492012-03-23 15:02:24 -0700117# ifdef CONFIG_X86
118 for (i = 0; i < len; i++)
119 DO_CRC(*++p); /* use pre increment for speed */
120# else
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800121 do {
122 DO_CRC(*++p); /* use pre increment for speed */
123 } while (--len);
Bob Pearson0292c492012-03-23 15:02:24 -0700124# endif
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800125 }
126 return crc;
Joakim Tjernlund4f2a94632010-03-05 13:43:55 -0800127#undef DO_CRC
Joakim Tjernlund836e2af2010-05-24 14:33:31 -0700128#undef DO_CRC4
Bob Pearson324eb0f2012-03-23 15:02:24 -0700129#undef DO_CRC8
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800130}
131#endif
Bob Pearson60e58d52012-03-23 15:02:22 -0700132
Randy Dunlap2f721002006-06-25 05:48:59 -0700133/**
Gu Zhengf2e1d2a2013-09-11 14:23:52 -0700134 * crc32_le_generic() - Calculate bitwise little-endian Ethernet AUTODIN II
135 * CRC32/CRC32C
136 * @crc: seed value for computation. ~0 for Ethernet, sometimes 0 for other
137 * uses, or the previous crc32/crc32c value if computing incrementally.
138 * @p: pointer to buffer over which CRC32/CRC32C is run
Randy Dunlap2f721002006-06-25 05:48:59 -0700139 * @len: length of buffer @p
Gu Zhengf2e1d2a2013-09-11 14:23:52 -0700140 * @tab: little-endian Ethernet table
141 * @polynomial: CRC32/CRC32c LE polynomial
Randy Dunlap2f721002006-06-25 05:48:59 -0700142 */
Darrick J. Wong46c58012012-03-23 15:02:25 -0700143static inline u32 __pure crc32_le_generic(u32 crc, unsigned char const *p,
144 size_t len, const u32 (*tab)[256],
145 u32 polynomial)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700146{
Bob Pearson60e58d52012-03-23 15:02:22 -0700147#if CRC_LE_BITS == 1
Linus Torvalds1da177e2005-04-16 15:20:36 -0700148 int i;
149 while (len--) {
150 crc ^= *p++;
151 for (i = 0; i < 8; i++)
Darrick J. Wong46c58012012-03-23 15:02:25 -0700152 crc = (crc >> 1) ^ ((crc & 1) ? polynomial : 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700153 }
Bob Pearson60e58d52012-03-23 15:02:22 -0700154# elif CRC_LE_BITS == 2
155 while (len--) {
156 crc ^= *p++;
Darrick J. Wong46c58012012-03-23 15:02:25 -0700157 crc = (crc >> 2) ^ tab[0][crc & 3];
158 crc = (crc >> 2) ^ tab[0][crc & 3];
159 crc = (crc >> 2) ^ tab[0][crc & 3];
160 crc = (crc >> 2) ^ tab[0][crc & 3];
Bob Pearson60e58d52012-03-23 15:02:22 -0700161 }
162# elif CRC_LE_BITS == 4
163 while (len--) {
164 crc ^= *p++;
Darrick J. Wong46c58012012-03-23 15:02:25 -0700165 crc = (crc >> 4) ^ tab[0][crc & 15];
166 crc = (crc >> 4) ^ tab[0][crc & 15];
Bob Pearson60e58d52012-03-23 15:02:22 -0700167 }
168# elif CRC_LE_BITS == 8
Bob Pearson9a1dbf62012-03-23 15:02:23 -0700169 /* aka Sarwate algorithm */
170 while (len--) {
171 crc ^= *p++;
Darrick J. Wong46c58012012-03-23 15:02:25 -0700172 crc = (crc >> 8) ^ tab[0][crc & 255];
Bob Pearson9a1dbf62012-03-23 15:02:23 -0700173 }
174# else
Bob Pearsonce4320d2012-03-23 15:02:23 -0700175 crc = (__force u32) __cpu_to_le32(crc);
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800176 crc = crc32_body(crc, p, len, tab);
Bob Pearsonce4320d2012-03-23 15:02:23 -0700177 crc = __le32_to_cpu((__force __le32)crc);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700178#endif
Bob Pearson60e58d52012-03-23 15:02:22 -0700179 return crc;
180}
Darrick J. Wong46c58012012-03-23 15:02:25 -0700181
182#if CRC_LE_BITS == 1
183u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)
184{
185 return crc32_le_generic(crc, p, len, NULL, CRCPOLY_LE);
186}
187u32 __pure __crc32c_le(u32 crc, unsigned char const *p, size_t len)
188{
189 return crc32_le_generic(crc, p, len, NULL, CRC32C_POLY_LE);
190}
191#else
192u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)
193{
Joe Mario8f243af2012-10-04 17:12:15 -0700194 return crc32_le_generic(crc, p, len,
195 (const u32 (*)[256])crc32table_le, CRCPOLY_LE);
Darrick J. Wong46c58012012-03-23 15:02:25 -0700196}
197u32 __pure __crc32c_le(u32 crc, unsigned char const *p, size_t len)
198{
Joe Mario8f243af2012-10-04 17:12:15 -0700199 return crc32_le_generic(crc, p, len,
200 (const u32 (*)[256])crc32ctable_le, CRC32C_POLY_LE);
Darrick J. Wong46c58012012-03-23 15:02:25 -0700201}
202#endif
Bob Pearson60e58d52012-03-23 15:02:22 -0700203EXPORT_SYMBOL(crc32_le);
Darrick J. Wong46c58012012-03-23 15:02:25 -0700204EXPORT_SYMBOL(__crc32c_le);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700205
Randy Dunlap2f721002006-06-25 05:48:59 -0700206/**
Gu Zhengf2e1d2a2013-09-11 14:23:52 -0700207 * crc32_be_generic() - Calculate bitwise big-endian Ethernet AUTODIN II CRC32
Randy Dunlap2f721002006-06-25 05:48:59 -0700208 * @crc: seed value for computation. ~0 for Ethernet, sometimes 0 for
209 * other uses, or the previous crc32 value if computing incrementally.
Gu Zhengf2e1d2a2013-09-11 14:23:52 -0700210 * @p: pointer to buffer over which CRC32 is run
Randy Dunlap2f721002006-06-25 05:48:59 -0700211 * @len: length of buffer @p
Gu Zhengf2e1d2a2013-09-11 14:23:52 -0700212 * @tab: big-endian Ethernet table
213 * @polynomial: CRC32 BE polynomial
Randy Dunlap2f721002006-06-25 05:48:59 -0700214 */
Darrick J. Wong46c58012012-03-23 15:02:25 -0700215static inline u32 __pure crc32_be_generic(u32 crc, unsigned char const *p,
216 size_t len, const u32 (*tab)[256],
217 u32 polynomial)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700218{
Bob Pearson60e58d52012-03-23 15:02:22 -0700219#if CRC_BE_BITS == 1
Linus Torvalds1da177e2005-04-16 15:20:36 -0700220 int i;
221 while (len--) {
222 crc ^= *p++ << 24;
223 for (i = 0; i < 8; i++)
224 crc =
Darrick J. Wong46c58012012-03-23 15:02:25 -0700225 (crc << 1) ^ ((crc & 0x80000000) ? polynomial :
Linus Torvalds1da177e2005-04-16 15:20:36 -0700226 0);
227 }
Bob Pearson60e58d52012-03-23 15:02:22 -0700228# elif CRC_BE_BITS == 2
229 while (len--) {
230 crc ^= *p++ << 24;
Darrick J. Wong46c58012012-03-23 15:02:25 -0700231 crc = (crc << 2) ^ tab[0][crc >> 30];
232 crc = (crc << 2) ^ tab[0][crc >> 30];
233 crc = (crc << 2) ^ tab[0][crc >> 30];
234 crc = (crc << 2) ^ tab[0][crc >> 30];
Bob Pearson60e58d52012-03-23 15:02:22 -0700235 }
236# elif CRC_BE_BITS == 4
237 while (len--) {
238 crc ^= *p++ << 24;
Darrick J. Wong46c58012012-03-23 15:02:25 -0700239 crc = (crc << 4) ^ tab[0][crc >> 28];
240 crc = (crc << 4) ^ tab[0][crc >> 28];
Bob Pearson60e58d52012-03-23 15:02:22 -0700241 }
242# elif CRC_BE_BITS == 8
Bob Pearson9a1dbf62012-03-23 15:02:23 -0700243 while (len--) {
244 crc ^= *p++ << 24;
Darrick J. Wong46c58012012-03-23 15:02:25 -0700245 crc = (crc << 8) ^ tab[0][crc >> 24];
Bob Pearson9a1dbf62012-03-23 15:02:23 -0700246 }
247# else
Bob Pearsonce4320d2012-03-23 15:02:23 -0700248 crc = (__force u32) __cpu_to_be32(crc);
Joakim Tjernlundddcaccb2009-12-14 18:01:33 -0800249 crc = crc32_body(crc, p, len, tab);
Bob Pearsonce4320d2012-03-23 15:02:23 -0700250 crc = __be32_to_cpu((__force __be32)crc);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700251# endif
Bob Pearson60e58d52012-03-23 15:02:22 -0700252 return crc;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700253}
Darrick J. Wong46c58012012-03-23 15:02:25 -0700254
255#if CRC_LE_BITS == 1
256u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len)
257{
258 return crc32_be_generic(crc, p, len, NULL, CRCPOLY_BE);
259}
260#else
261u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len)
262{
Joe Mario8f243af2012-10-04 17:12:15 -0700263 return crc32_be_generic(crc, p, len,
264 (const u32 (*)[256])crc32table_be, CRCPOLY_BE);
Darrick J. Wong46c58012012-03-23 15:02:25 -0700265}
266#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700267EXPORT_SYMBOL(crc32_be);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700268
Bob Pearson3863ef32012-03-23 15:02:22 -0700269#ifdef CONFIG_CRC32_SELFTEST
Linus Torvalds1da177e2005-04-16 15:20:36 -0700270
Bob Pearson3863ef32012-03-23 15:02:22 -0700271/* 4096 random bytes */
272static u8 __attribute__((__aligned__(8))) test_buf[] =
Linus Torvalds1da177e2005-04-16 15:20:36 -0700273{
Bob Pearson3863ef32012-03-23 15:02:22 -0700274 0x5b, 0x85, 0x21, 0xcb, 0x09, 0x68, 0x7d, 0x30,
275 0xc7, 0x69, 0xd7, 0x30, 0x92, 0xde, 0x59, 0xe4,
276 0xc9, 0x6e, 0x8b, 0xdb, 0x98, 0x6b, 0xaa, 0x60,
277 0xa8, 0xb5, 0xbc, 0x6c, 0xa9, 0xb1, 0x5b, 0x2c,
278 0xea, 0xb4, 0x92, 0x6a, 0x3f, 0x79, 0x91, 0xe4,
279 0xe9, 0x70, 0x51, 0x8c, 0x7f, 0x95, 0x6f, 0x1a,
280 0x56, 0xa1, 0x5c, 0x27, 0x03, 0x67, 0x9f, 0x3a,
281 0xe2, 0x31, 0x11, 0x29, 0x6b, 0x98, 0xfc, 0xc4,
282 0x53, 0x24, 0xc5, 0x8b, 0xce, 0x47, 0xb2, 0xb9,
283 0x32, 0xcb, 0xc1, 0xd0, 0x03, 0x57, 0x4e, 0xd4,
284 0xe9, 0x3c, 0xa1, 0x63, 0xcf, 0x12, 0x0e, 0xca,
285 0xe1, 0x13, 0xd1, 0x93, 0xa6, 0x88, 0x5c, 0x61,
286 0x5b, 0xbb, 0xf0, 0x19, 0x46, 0xb4, 0xcf, 0x9e,
287 0xb6, 0x6b, 0x4c, 0x3a, 0xcf, 0x60, 0xf9, 0x7a,
288 0x8d, 0x07, 0x63, 0xdb, 0x40, 0xe9, 0x0b, 0x6f,
289 0xad, 0x97, 0xf1, 0xed, 0xd0, 0x1e, 0x26, 0xfd,
290 0xbf, 0xb7, 0xc8, 0x04, 0x94, 0xf8, 0x8b, 0x8c,
291 0xf1, 0xab, 0x7a, 0xd4, 0xdd, 0xf3, 0xe8, 0x88,
292 0xc3, 0xed, 0x17, 0x8a, 0x9b, 0x40, 0x0d, 0x53,
293 0x62, 0x12, 0x03, 0x5f, 0x1b, 0x35, 0x32, 0x1f,
294 0xb4, 0x7b, 0x93, 0x78, 0x0d, 0xdb, 0xce, 0xa4,
295 0xc0, 0x47, 0xd5, 0xbf, 0x68, 0xe8, 0x5d, 0x74,
296 0x8f, 0x8e, 0x75, 0x1c, 0xb2, 0x4f, 0x9a, 0x60,
297 0xd1, 0xbe, 0x10, 0xf4, 0x5c, 0xa1, 0x53, 0x09,
298 0xa5, 0xe0, 0x09, 0x54, 0x85, 0x5c, 0xdc, 0x07,
299 0xe7, 0x21, 0x69, 0x7b, 0x8a, 0xfd, 0x90, 0xf1,
300 0x22, 0xd0, 0xb4, 0x36, 0x28, 0xe6, 0xb8, 0x0f,
301 0x39, 0xde, 0xc8, 0xf3, 0x86, 0x60, 0x34, 0xd2,
302 0x5e, 0xdf, 0xfd, 0xcf, 0x0f, 0xa9, 0x65, 0xf0,
303 0xd5, 0x4d, 0x96, 0x40, 0xe3, 0xdf, 0x3f, 0x95,
304 0x5a, 0x39, 0x19, 0x93, 0xf4, 0x75, 0xce, 0x22,
305 0x00, 0x1c, 0x93, 0xe2, 0x03, 0x66, 0xf4, 0x93,
306 0x73, 0x86, 0x81, 0x8e, 0x29, 0x44, 0x48, 0x86,
307 0x61, 0x7c, 0x48, 0xa3, 0x43, 0xd2, 0x9c, 0x8d,
308 0xd4, 0x95, 0xdd, 0xe1, 0x22, 0x89, 0x3a, 0x40,
309 0x4c, 0x1b, 0x8a, 0x04, 0xa8, 0x09, 0x69, 0x8b,
310 0xea, 0xc6, 0x55, 0x8e, 0x57, 0xe6, 0x64, 0x35,
311 0xf0, 0xc7, 0x16, 0x9f, 0x5d, 0x5e, 0x86, 0x40,
312 0x46, 0xbb, 0xe5, 0x45, 0x88, 0xfe, 0xc9, 0x63,
313 0x15, 0xfb, 0xf5, 0xbd, 0x71, 0x61, 0xeb, 0x7b,
314 0x78, 0x70, 0x07, 0x31, 0x03, 0x9f, 0xb2, 0xc8,
315 0xa7, 0xab, 0x47, 0xfd, 0xdf, 0xa0, 0x78, 0x72,
316 0xa4, 0x2a, 0xe4, 0xb6, 0xba, 0xc0, 0x1e, 0x86,
317 0x71, 0xe6, 0x3d, 0x18, 0x37, 0x70, 0xe6, 0xff,
318 0xe0, 0xbc, 0x0b, 0x22, 0xa0, 0x1f, 0xd3, 0xed,
319 0xa2, 0x55, 0x39, 0xab, 0xa8, 0x13, 0x73, 0x7c,
320 0x3f, 0xb2, 0xd6, 0x19, 0xac, 0xff, 0x99, 0xed,
321 0xe8, 0xe6, 0xa6, 0x22, 0xe3, 0x9c, 0xf1, 0x30,
322 0xdc, 0x01, 0x0a, 0x56, 0xfa, 0xe4, 0xc9, 0x99,
323 0xdd, 0xa8, 0xd8, 0xda, 0x35, 0x51, 0x73, 0xb4,
324 0x40, 0x86, 0x85, 0xdb, 0x5c, 0xd5, 0x85, 0x80,
325 0x14, 0x9c, 0xfd, 0x98, 0xa9, 0x82, 0xc5, 0x37,
326 0xff, 0x32, 0x5d, 0xd0, 0x0b, 0xfa, 0xdc, 0x04,
327 0x5e, 0x09, 0xd2, 0xca, 0x17, 0x4b, 0x1a, 0x8e,
328 0x15, 0xe1, 0xcc, 0x4e, 0x52, 0x88, 0x35, 0xbd,
329 0x48, 0xfe, 0x15, 0xa0, 0x91, 0xfd, 0x7e, 0x6c,
330 0x0e, 0x5d, 0x79, 0x1b, 0x81, 0x79, 0xd2, 0x09,
331 0x34, 0x70, 0x3d, 0x81, 0xec, 0xf6, 0x24, 0xbb,
332 0xfb, 0xf1, 0x7b, 0xdf, 0x54, 0xea, 0x80, 0x9b,
333 0xc7, 0x99, 0x9e, 0xbd, 0x16, 0x78, 0x12, 0x53,
334 0x5e, 0x01, 0xa7, 0x4e, 0xbd, 0x67, 0xe1, 0x9b,
335 0x4c, 0x0e, 0x61, 0x45, 0x97, 0xd2, 0xf0, 0x0f,
336 0xfe, 0x15, 0x08, 0xb7, 0x11, 0x4c, 0xe7, 0xff,
337 0x81, 0x53, 0xff, 0x91, 0x25, 0x38, 0x7e, 0x40,
338 0x94, 0xe5, 0xe0, 0xad, 0xe6, 0xd9, 0x79, 0xb6,
339 0x92, 0xc9, 0xfc, 0xde, 0xc3, 0x1a, 0x23, 0xbb,
340 0xdd, 0xc8, 0x51, 0x0c, 0x3a, 0x72, 0xfa, 0x73,
341 0x6f, 0xb7, 0xee, 0x61, 0x39, 0x03, 0x01, 0x3f,
342 0x7f, 0x94, 0x2e, 0x2e, 0xba, 0x3a, 0xbb, 0xb4,
343 0xfa, 0x6a, 0x17, 0xfe, 0xea, 0xef, 0x5e, 0x66,
344 0x97, 0x3f, 0x32, 0x3d, 0xd7, 0x3e, 0xb1, 0xf1,
345 0x6c, 0x14, 0x4c, 0xfd, 0x37, 0xd3, 0x38, 0x80,
346 0xfb, 0xde, 0xa6, 0x24, 0x1e, 0xc8, 0xca, 0x7f,
347 0x3a, 0x93, 0xd8, 0x8b, 0x18, 0x13, 0xb2, 0xe5,
348 0xe4, 0x93, 0x05, 0x53, 0x4f, 0x84, 0x66, 0xa7,
349 0x58, 0x5c, 0x7b, 0x86, 0x52, 0x6d, 0x0d, 0xce,
350 0xa4, 0x30, 0x7d, 0xb6, 0x18, 0x9f, 0xeb, 0xff,
351 0x22, 0xbb, 0x72, 0x29, 0xb9, 0x44, 0x0b, 0x48,
352 0x1e, 0x84, 0x71, 0x81, 0xe3, 0x6d, 0x73, 0x26,
353 0x92, 0xb4, 0x4d, 0x2a, 0x29, 0xb8, 0x1f, 0x72,
354 0xed, 0xd0, 0xe1, 0x64, 0x77, 0xea, 0x8e, 0x88,
355 0x0f, 0xef, 0x3f, 0xb1, 0x3b, 0xad, 0xf9, 0xc9,
356 0x8b, 0xd0, 0xac, 0xc6, 0xcc, 0xa9, 0x40, 0xcc,
357 0x76, 0xf6, 0x3b, 0x53, 0xb5, 0x88, 0xcb, 0xc8,
358 0x37, 0xf1, 0xa2, 0xba, 0x23, 0x15, 0x99, 0x09,
359 0xcc, 0xe7, 0x7a, 0x3b, 0x37, 0xf7, 0x58, 0xc8,
360 0x46, 0x8c, 0x2b, 0x2f, 0x4e, 0x0e, 0xa6, 0x5c,
361 0xea, 0x85, 0x55, 0xba, 0x02, 0x0e, 0x0e, 0x48,
362 0xbc, 0xe1, 0xb1, 0x01, 0x35, 0x79, 0x13, 0x3d,
363 0x1b, 0xc0, 0x53, 0x68, 0x11, 0xe7, 0x95, 0x0f,
364 0x9d, 0x3f, 0x4c, 0x47, 0x7b, 0x4d, 0x1c, 0xae,
365 0x50, 0x9b, 0xcb, 0xdd, 0x05, 0x8d, 0x9a, 0x97,
366 0xfd, 0x8c, 0xef, 0x0c, 0x1d, 0x67, 0x73, 0xa8,
367 0x28, 0x36, 0xd5, 0xb6, 0x92, 0x33, 0x40, 0x75,
368 0x0b, 0x51, 0xc3, 0x64, 0xba, 0x1d, 0xc2, 0xcc,
369 0xee, 0x7d, 0x54, 0x0f, 0x27, 0x69, 0xa7, 0x27,
370 0x63, 0x30, 0x29, 0xd9, 0xc8, 0x84, 0xd8, 0xdf,
371 0x9f, 0x68, 0x8d, 0x04, 0xca, 0xa6, 0xc5, 0xc7,
372 0x7a, 0x5c, 0xc8, 0xd1, 0xcb, 0x4a, 0xec, 0xd0,
373 0xd8, 0x20, 0x69, 0xc5, 0x17, 0xcd, 0x78, 0xc8,
374 0x75, 0x23, 0x30, 0x69, 0xc9, 0xd4, 0xea, 0x5c,
375 0x4f, 0x6b, 0x86, 0x3f, 0x8b, 0xfe, 0xee, 0x44,
376 0xc9, 0x7c, 0xb7, 0xdd, 0x3e, 0xe5, 0xec, 0x54,
377 0x03, 0x3e, 0xaa, 0x82, 0xc6, 0xdf, 0xb2, 0x38,
378 0x0e, 0x5d, 0xb3, 0x88, 0xd9, 0xd3, 0x69, 0x5f,
379 0x8f, 0x70, 0x8a, 0x7e, 0x11, 0xd9, 0x1e, 0x7b,
380 0x38, 0xf1, 0x42, 0x1a, 0xc0, 0x35, 0xf5, 0xc7,
381 0x36, 0x85, 0xf5, 0xf7, 0xb8, 0x7e, 0xc7, 0xef,
382 0x18, 0xf1, 0x63, 0xd6, 0x7a, 0xc6, 0xc9, 0x0e,
383 0x4d, 0x69, 0x4f, 0x84, 0xef, 0x26, 0x41, 0x0c,
384 0xec, 0xc7, 0xe0, 0x7e, 0x3c, 0x67, 0x01, 0x4c,
385 0x62, 0x1a, 0x20, 0x6f, 0xee, 0x47, 0x4d, 0xc0,
386 0x99, 0x13, 0x8d, 0x91, 0x4a, 0x26, 0xd4, 0x37,
387 0x28, 0x90, 0x58, 0x75, 0x66, 0x2b, 0x0a, 0xdf,
388 0xda, 0xee, 0x92, 0x25, 0x90, 0x62, 0x39, 0x9e,
389 0x44, 0x98, 0xad, 0xc1, 0x88, 0xed, 0xe4, 0xb4,
390 0xaf, 0xf5, 0x8c, 0x9b, 0x48, 0x4d, 0x56, 0x60,
391 0x97, 0x0f, 0x61, 0x59, 0x9e, 0xa6, 0x27, 0xfe,
392 0xc1, 0x91, 0x15, 0x38, 0xb8, 0x0f, 0xae, 0x61,
393 0x7d, 0x26, 0x13, 0x5a, 0x73, 0xff, 0x1c, 0xa3,
394 0x61, 0x04, 0x58, 0x48, 0x55, 0x44, 0x11, 0xfe,
395 0x15, 0xca, 0xc3, 0xbd, 0xca, 0xc5, 0xb4, 0x40,
396 0x5d, 0x1b, 0x7f, 0x39, 0xb5, 0x9c, 0x35, 0xec,
397 0x61, 0x15, 0x32, 0x32, 0xb8, 0x4e, 0x40, 0x9f,
398 0x17, 0x1f, 0x0a, 0x4d, 0xa9, 0x91, 0xef, 0xb7,
399 0xb0, 0xeb, 0xc2, 0x83, 0x9a, 0x6c, 0xd2, 0x79,
400 0x43, 0x78, 0x5e, 0x2f, 0xe5, 0xdd, 0x1a, 0x3c,
401 0x45, 0xab, 0x29, 0x40, 0x3a, 0x37, 0x5b, 0x6f,
402 0xd7, 0xfc, 0x48, 0x64, 0x3c, 0x49, 0xfb, 0x21,
403 0xbe, 0xc3, 0xff, 0x07, 0xfb, 0x17, 0xe9, 0xc9,
404 0x0c, 0x4c, 0x5c, 0x15, 0x9e, 0x8e, 0x22, 0x30,
405 0x0a, 0xde, 0x48, 0x7f, 0xdb, 0x0d, 0xd1, 0x2b,
406 0x87, 0x38, 0x9e, 0xcc, 0x5a, 0x01, 0x16, 0xee,
407 0x75, 0x49, 0x0d, 0x30, 0x01, 0x34, 0x6a, 0xb6,
408 0x9a, 0x5a, 0x2a, 0xec, 0xbb, 0x48, 0xac, 0xd3,
409 0x77, 0x83, 0xd8, 0x08, 0x86, 0x4f, 0x48, 0x09,
410 0x29, 0x41, 0x79, 0xa1, 0x03, 0x12, 0xc4, 0xcd,
411 0x90, 0x55, 0x47, 0x66, 0x74, 0x9a, 0xcc, 0x4f,
412 0x35, 0x8c, 0xd6, 0x98, 0xef, 0xeb, 0x45, 0xb9,
413 0x9a, 0x26, 0x2f, 0x39, 0xa5, 0x70, 0x6d, 0xfc,
414 0xb4, 0x51, 0xee, 0xf4, 0x9c, 0xe7, 0x38, 0x59,
415 0xad, 0xf4, 0xbc, 0x46, 0xff, 0x46, 0x8e, 0x60,
416 0x9c, 0xa3, 0x60, 0x1d, 0xf8, 0x26, 0x72, 0xf5,
417 0x72, 0x9d, 0x68, 0x80, 0x04, 0xf6, 0x0b, 0xa1,
418 0x0a, 0xd5, 0xa7, 0x82, 0x3a, 0x3e, 0x47, 0xa8,
419 0x5a, 0xde, 0x59, 0x4f, 0x7b, 0x07, 0xb3, 0xe9,
420 0x24, 0x19, 0x3d, 0x34, 0x05, 0xec, 0xf1, 0xab,
421 0x6e, 0x64, 0x8f, 0xd3, 0xe6, 0x41, 0x86, 0x80,
422 0x70, 0xe3, 0x8d, 0x60, 0x9c, 0x34, 0x25, 0x01,
423 0x07, 0x4d, 0x19, 0x41, 0x4e, 0x3d, 0x5c, 0x7e,
424 0xa8, 0xf5, 0xcc, 0xd5, 0x7b, 0xe2, 0x7d, 0x3d,
425 0x49, 0x86, 0x7d, 0x07, 0xb7, 0x10, 0xe3, 0x35,
426 0xb8, 0x84, 0x6d, 0x76, 0xab, 0x17, 0xc6, 0x38,
427 0xb4, 0xd3, 0x28, 0x57, 0xad, 0xd3, 0x88, 0x5a,
428 0xda, 0xea, 0xc8, 0x94, 0xcc, 0x37, 0x19, 0xac,
429 0x9c, 0x9f, 0x4b, 0x00, 0x15, 0xc0, 0xc8, 0xca,
430 0x1f, 0x15, 0xaa, 0xe0, 0xdb, 0xf9, 0x2f, 0x57,
431 0x1b, 0x24, 0xc7, 0x6f, 0x76, 0x29, 0xfb, 0xed,
432 0x25, 0x0d, 0xc0, 0xfe, 0xbd, 0x5a, 0xbf, 0x20,
433 0x08, 0x51, 0x05, 0xec, 0x71, 0xa3, 0xbf, 0xef,
434 0x5e, 0x99, 0x75, 0xdb, 0x3c, 0x5f, 0x9a, 0x8c,
435 0xbb, 0x19, 0x5c, 0x0e, 0x93, 0x19, 0xf8, 0x6a,
436 0xbc, 0xf2, 0x12, 0x54, 0x2f, 0xcb, 0x28, 0x64,
437 0x88, 0xb3, 0x92, 0x0d, 0x96, 0xd1, 0xa6, 0xe4,
438 0x1f, 0xf1, 0x4d, 0xa4, 0xab, 0x1c, 0xee, 0x54,
439 0xf2, 0xad, 0x29, 0x6d, 0x32, 0x37, 0xb2, 0x16,
440 0x77, 0x5c, 0xdc, 0x2e, 0x54, 0xec, 0x75, 0x26,
441 0xc6, 0x36, 0xd9, 0x17, 0x2c, 0xf1, 0x7a, 0xdc,
442 0x4b, 0xf1, 0xe2, 0xd9, 0x95, 0xba, 0xac, 0x87,
443 0xc1, 0xf3, 0x8e, 0x58, 0x08, 0xd8, 0x87, 0x60,
444 0xc9, 0xee, 0x6a, 0xde, 0xa4, 0xd2, 0xfc, 0x0d,
445 0xe5, 0x36, 0xc4, 0x5c, 0x52, 0xb3, 0x07, 0x54,
446 0x65, 0x24, 0xc1, 0xb1, 0xd1, 0xb1, 0x53, 0x13,
447 0x31, 0x79, 0x7f, 0x05, 0x76, 0xeb, 0x37, 0x59,
448 0x15, 0x2b, 0xd1, 0x3f, 0xac, 0x08, 0x97, 0xeb,
449 0x91, 0x98, 0xdf, 0x6c, 0x09, 0x0d, 0x04, 0x9f,
450 0xdc, 0x3b, 0x0e, 0x60, 0x68, 0x47, 0x23, 0x15,
451 0x16, 0xc6, 0x0b, 0x35, 0xf8, 0x77, 0xa2, 0x78,
452 0x50, 0xd4, 0x64, 0x22, 0x33, 0xff, 0xfb, 0x93,
453 0x71, 0x46, 0x50, 0x39, 0x1b, 0x9c, 0xea, 0x4e,
454 0x8d, 0x0c, 0x37, 0xe5, 0x5c, 0x51, 0x3a, 0x31,
455 0xb2, 0x85, 0x84, 0x3f, 0x41, 0xee, 0xa2, 0xc1,
456 0xc6, 0x13, 0x3b, 0x54, 0x28, 0xd2, 0x18, 0x37,
457 0xcc, 0x46, 0x9f, 0x6a, 0x91, 0x3d, 0x5a, 0x15,
458 0x3c, 0x89, 0xa3, 0x61, 0x06, 0x7d, 0x2e, 0x78,
459 0xbe, 0x7d, 0x40, 0xba, 0x2f, 0x95, 0xb1, 0x2f,
460 0x87, 0x3b, 0x8a, 0xbe, 0x6a, 0xf4, 0xc2, 0x31,
461 0x74, 0xee, 0x91, 0xe0, 0x23, 0xaa, 0x5d, 0x7f,
462 0xdd, 0xf0, 0x44, 0x8c, 0x0b, 0x59, 0x2b, 0xfc,
463 0x48, 0x3a, 0xdf, 0x07, 0x05, 0x38, 0x6c, 0xc9,
464 0xeb, 0x18, 0x24, 0x68, 0x8d, 0x58, 0x98, 0xd3,
465 0x31, 0xa3, 0xe4, 0x70, 0x59, 0xb1, 0x21, 0xbe,
466 0x7e, 0x65, 0x7d, 0xb8, 0x04, 0xab, 0xf6, 0xe4,
467 0xd7, 0xda, 0xec, 0x09, 0x8f, 0xda, 0x6d, 0x24,
468 0x07, 0xcc, 0x29, 0x17, 0x05, 0x78, 0x1a, 0xc1,
469 0xb1, 0xce, 0xfc, 0xaa, 0x2d, 0xe7, 0xcc, 0x85,
470 0x84, 0x84, 0x03, 0x2a, 0x0c, 0x3f, 0xa9, 0xf8,
471 0xfd, 0x84, 0x53, 0x59, 0x5c, 0xf0, 0xd4, 0x09,
472 0xf0, 0xd2, 0x6c, 0x32, 0x03, 0xb0, 0xa0, 0x8c,
473 0x52, 0xeb, 0x23, 0x91, 0x88, 0x43, 0x13, 0x46,
474 0xf6, 0x1e, 0xb4, 0x1b, 0xf5, 0x8e, 0x3a, 0xb5,
475 0x3d, 0x00, 0xf6, 0xe5, 0x08, 0x3d, 0x5f, 0x39,
476 0xd3, 0x21, 0x69, 0xbc, 0x03, 0x22, 0x3a, 0xd2,
477 0x5c, 0x84, 0xf8, 0x15, 0xc4, 0x80, 0x0b, 0xbc,
478 0x29, 0x3c, 0xf3, 0x95, 0x98, 0xcd, 0x8f, 0x35,
479 0xbc, 0xa5, 0x3e, 0xfc, 0xd4, 0x13, 0x9e, 0xde,
480 0x4f, 0xce, 0x71, 0x9d, 0x09, 0xad, 0xf2, 0x80,
481 0x6b, 0x65, 0x7f, 0x03, 0x00, 0x14, 0x7c, 0x15,
482 0x85, 0x40, 0x6d, 0x70, 0xea, 0xdc, 0xb3, 0x63,
483 0x35, 0x4f, 0x4d, 0xe0, 0xd9, 0xd5, 0x3c, 0x58,
484 0x56, 0x23, 0x80, 0xe2, 0x36, 0xdd, 0x75, 0x1d,
485 0x94, 0x11, 0x41, 0x8e, 0xe0, 0x81, 0x8e, 0xcf,
486 0xe0, 0xe5, 0xf6, 0xde, 0xd1, 0xe7, 0x04, 0x12,
487 0x79, 0x92, 0x2b, 0x71, 0x2a, 0x79, 0x8b, 0x7c,
488 0x44, 0x79, 0x16, 0x30, 0x4e, 0xf4, 0xf6, 0x9b,
489 0xb7, 0x40, 0xa3, 0x5a, 0xa7, 0x69, 0x3e, 0xc1,
490 0x3a, 0x04, 0xd0, 0x88, 0xa0, 0x3b, 0xdd, 0xc6,
491 0x9e, 0x7e, 0x1e, 0x1e, 0x8f, 0x44, 0xf7, 0x73,
492 0x67, 0x1e, 0x1a, 0x78, 0xfa, 0x62, 0xf4, 0xa9,
493 0xa8, 0xc6, 0x5b, 0xb8, 0xfa, 0x06, 0x7d, 0x5e,
494 0x38, 0x1c, 0x9a, 0x39, 0xe9, 0x39, 0x98, 0x22,
495 0x0b, 0xa7, 0xac, 0x0b, 0xf3, 0xbc, 0xf1, 0xeb,
496 0x8c, 0x81, 0xe3, 0x48, 0x8a, 0xed, 0x42, 0xc2,
497 0x38, 0xcf, 0x3e, 0xda, 0xd2, 0x89, 0x8d, 0x9c,
498 0x53, 0xb5, 0x2f, 0x41, 0x01, 0x26, 0x84, 0x9c,
499 0xa3, 0x56, 0xf6, 0x49, 0xc7, 0xd4, 0x9f, 0x93,
500 0x1b, 0x96, 0x49, 0x5e, 0xad, 0xb3, 0x84, 0x1f,
501 0x3c, 0xa4, 0xe0, 0x9b, 0xd1, 0x90, 0xbc, 0x38,
502 0x6c, 0xdd, 0x95, 0x4d, 0x9d, 0xb1, 0x71, 0x57,
503 0x2d, 0x34, 0xe8, 0xb8, 0x42, 0xc7, 0x99, 0x03,
504 0xc7, 0x07, 0x30, 0x65, 0x91, 0x55, 0xd5, 0x90,
505 0x70, 0x97, 0x37, 0x68, 0xd4, 0x11, 0xf9, 0xe8,
506 0xce, 0xec, 0xdc, 0x34, 0xd5, 0xd3, 0xb7, 0xc4,
507 0xb8, 0x97, 0x05, 0x92, 0xad, 0xf8, 0xe2, 0x36,
508 0x64, 0x41, 0xc9, 0xc5, 0x41, 0x77, 0x52, 0xd7,
509 0x2c, 0xa5, 0x24, 0x2f, 0xd9, 0x34, 0x0b, 0x47,
510 0x35, 0xa7, 0x28, 0x8b, 0xc5, 0xcd, 0xe9, 0x46,
511 0xac, 0x39, 0x94, 0x3c, 0x10, 0xc6, 0x29, 0x73,
512 0x0e, 0x0e, 0x5d, 0xe0, 0x71, 0x03, 0x8a, 0x72,
513 0x0e, 0x26, 0xb0, 0x7d, 0x84, 0xed, 0x95, 0x23,
514 0x49, 0x5a, 0x45, 0x83, 0x45, 0x60, 0x11, 0x4a,
515 0x46, 0x31, 0xd4, 0xd8, 0x16, 0x54, 0x98, 0x58,
516 0xed, 0x6d, 0xcc, 0x5d, 0xd6, 0x50, 0x61, 0x9f,
517 0x9d, 0xc5, 0x3e, 0x9d, 0x32, 0x47, 0xde, 0x96,
518 0xe1, 0x5d, 0xd8, 0xf8, 0xb4, 0x69, 0x6f, 0xb9,
519 0x15, 0x90, 0x57, 0x7a, 0xf6, 0xad, 0xb0, 0x5b,
520 0xf5, 0xa6, 0x36, 0x94, 0xfd, 0x84, 0xce, 0x1c,
521 0x0f, 0x4b, 0xd0, 0xc2, 0x5b, 0x6b, 0x56, 0xef,
522 0x73, 0x93, 0x0b, 0xc3, 0xee, 0xd9, 0xcf, 0xd3,
523 0xa4, 0x22, 0x58, 0xcd, 0x50, 0x6e, 0x65, 0xf4,
524 0xe9, 0xb7, 0x71, 0xaf, 0x4b, 0xb3, 0xb6, 0x2f,
525 0x0f, 0x0e, 0x3b, 0xc9, 0x85, 0x14, 0xf5, 0x17,
526 0xe8, 0x7a, 0x3a, 0xbf, 0x5f, 0x5e, 0xf8, 0x18,
527 0x48, 0xa6, 0x72, 0xab, 0x06, 0x95, 0xe9, 0xc8,
528 0xa7, 0xf4, 0x32, 0x44, 0x04, 0x0c, 0x84, 0x98,
529 0x73, 0xe3, 0x89, 0x8d, 0x5f, 0x7e, 0x4a, 0x42,
530 0x8f, 0xc5, 0x28, 0xb1, 0x82, 0xef, 0x1c, 0x97,
531 0x31, 0x3b, 0x4d, 0xe0, 0x0e, 0x10, 0x10, 0x97,
532 0x93, 0x49, 0x78, 0x2f, 0x0d, 0x86, 0x8b, 0xa1,
533 0x53, 0xa9, 0x81, 0x20, 0x79, 0xe7, 0x07, 0x77,
534 0xb6, 0xac, 0x5e, 0xd2, 0x05, 0xcd, 0xe9, 0xdb,
535 0x8a, 0x94, 0x82, 0x8a, 0x23, 0xb9, 0x3d, 0x1c,
536 0xa9, 0x7d, 0x72, 0x4a, 0xed, 0x33, 0xa3, 0xdb,
537 0x21, 0xa7, 0x86, 0x33, 0x45, 0xa5, 0xaa, 0x56,
538 0x45, 0xb5, 0x83, 0x29, 0x40, 0x47, 0x79, 0x04,
539 0x6e, 0xb9, 0x95, 0xd0, 0x81, 0x77, 0x2d, 0x48,
540 0x1e, 0xfe, 0xc3, 0xc2, 0x1e, 0xe5, 0xf2, 0xbe,
541 0xfd, 0x3b, 0x94, 0x9f, 0xc4, 0xc4, 0x26, 0x9d,
542 0xe4, 0x66, 0x1e, 0x19, 0xee, 0x6c, 0x79, 0x97,
543 0x11, 0x31, 0x4b, 0x0d, 0x01, 0xcb, 0xde, 0xa8,
544 0xf6, 0x6d, 0x7c, 0x39, 0x46, 0x4e, 0x7e, 0x3f,
545 0x94, 0x17, 0xdf, 0xa1, 0x7d, 0xd9, 0x1c, 0x8e,
546 0xbc, 0x7d, 0x33, 0x7d, 0xe3, 0x12, 0x40, 0xca,
547 0xab, 0x37, 0x11, 0x46, 0xd4, 0xae, 0xef, 0x44,
548 0xa2, 0xb3, 0x6a, 0x66, 0x0e, 0x0c, 0x90, 0x7f,
549 0xdf, 0x5c, 0x66, 0x5f, 0xf2, 0x94, 0x9f, 0xa6,
550 0x73, 0x4f, 0xeb, 0x0d, 0xad, 0xbf, 0xc0, 0x63,
551 0x5c, 0xdc, 0x46, 0x51, 0xe8, 0x8e, 0x90, 0x19,
552 0xa8, 0xa4, 0x3c, 0x91, 0x79, 0xfa, 0x7e, 0x58,
553 0x85, 0x13, 0x55, 0xc5, 0x19, 0x82, 0x37, 0x1b,
554 0x0a, 0x02, 0x1f, 0x99, 0x6b, 0x18, 0xf1, 0x28,
555 0x08, 0xa2, 0x73, 0xb8, 0x0f, 0x2e, 0xcd, 0xbf,
556 0xf3, 0x86, 0x7f, 0xea, 0xef, 0xd0, 0xbb, 0xa6,
557 0x21, 0xdf, 0x49, 0x73, 0x51, 0xcc, 0x36, 0xd3,
558 0x3e, 0xa0, 0xf8, 0x44, 0xdf, 0xd3, 0xa6, 0xbe,
559 0x8a, 0xd4, 0x57, 0xdd, 0x72, 0x94, 0x61, 0x0f,
560 0x82, 0xd1, 0x07, 0xb8, 0x7c, 0x18, 0x83, 0xdf,
561 0x3a, 0xe5, 0x50, 0x6a, 0x82, 0x20, 0xac, 0xa9,
562 0xa8, 0xff, 0xd9, 0xf3, 0x77, 0x33, 0x5a, 0x9e,
563 0x7f, 0x6d, 0xfe, 0x5d, 0x33, 0x41, 0x42, 0xe7,
564 0x6c, 0x19, 0xe0, 0x44, 0x8a, 0x15, 0xf6, 0x70,
565 0x98, 0xb7, 0x68, 0x4d, 0xfa, 0x97, 0x39, 0xb0,
566 0x8e, 0xe8, 0x84, 0x8b, 0x75, 0x30, 0xb7, 0x7d,
567 0x92, 0x69, 0x20, 0x9c, 0x81, 0xfb, 0x4b, 0xf4,
568 0x01, 0x50, 0xeb, 0xce, 0x0c, 0x1c, 0x6c, 0xb5,
569 0x4a, 0xd7, 0x27, 0x0c, 0xce, 0xbb, 0xe5, 0x85,
570 0xf0, 0xb6, 0xee, 0xd5, 0x70, 0xdd, 0x3b, 0xfc,
571 0xd4, 0x99, 0xf1, 0x33, 0xdd, 0x8b, 0xc4, 0x2f,
572 0xae, 0xab, 0x74, 0x96, 0x32, 0xc7, 0x4c, 0x56,
573 0x3c, 0x89, 0x0f, 0x96, 0x0b, 0x42, 0xc0, 0xcb,
574 0xee, 0x0f, 0x0b, 0x8c, 0xfb, 0x7e, 0x47, 0x7b,
575 0x64, 0x48, 0xfd, 0xb2, 0x00, 0x80, 0x89, 0xa5,
576 0x13, 0x55, 0x62, 0xfc, 0x8f, 0xe2, 0x42, 0x03,
577 0xb7, 0x4e, 0x2a, 0x79, 0xb4, 0x82, 0xea, 0x23,
578 0x49, 0xda, 0xaf, 0x52, 0x63, 0x1e, 0x60, 0x03,
579 0x89, 0x06, 0x44, 0x46, 0x08, 0xc3, 0xc4, 0x87,
580 0x70, 0x2e, 0xda, 0x94, 0xad, 0x6b, 0xe0, 0xe4,
581 0xd1, 0x8a, 0x06, 0xc2, 0xa8, 0xc0, 0xa7, 0x43,
582 0x3c, 0x47, 0x52, 0x0e, 0xc3, 0x77, 0x81, 0x11,
583 0x67, 0x0e, 0xa0, 0x70, 0x04, 0x47, 0x29, 0x40,
584 0x86, 0x0d, 0x34, 0x56, 0xa7, 0xc9, 0x35, 0x59,
585 0x68, 0xdc, 0x93, 0x81, 0x70, 0xee, 0x86, 0xd9,
586 0x80, 0x06, 0x40, 0x4f, 0x1a, 0x0d, 0x40, 0x30,
587 0x0b, 0xcb, 0x96, 0x47, 0xc1, 0xb7, 0x52, 0xfd,
588 0x56, 0xe0, 0x72, 0x4b, 0xfb, 0xbd, 0x92, 0x45,
589 0x61, 0x71, 0xc2, 0x33, 0x11, 0xbf, 0x52, 0x83,
590 0x79, 0x26, 0xe0, 0x49, 0x6b, 0xb7, 0x05, 0x8b,
591 0xe8, 0x0e, 0x87, 0x31, 0xd7, 0x9d, 0x8a, 0xf5,
592 0xc0, 0x5f, 0x2e, 0x58, 0x4a, 0xdb, 0x11, 0xb3,
593 0x6c, 0x30, 0x2a, 0x46, 0x19, 0xe3, 0x27, 0x84,
594 0x1f, 0x63, 0x6e, 0xf6, 0x57, 0xc7, 0xc9, 0xd8,
595 0x5e, 0xba, 0xb3, 0x87, 0xd5, 0x83, 0x26, 0x34,
596 0x21, 0x9e, 0x65, 0xde, 0x42, 0xd3, 0xbe, 0x7b,
597 0xbc, 0x91, 0x71, 0x44, 0x4d, 0x99, 0x3b, 0x31,
598 0xe5, 0x3f, 0x11, 0x4e, 0x7f, 0x13, 0x51, 0x3b,
599 0xae, 0x79, 0xc9, 0xd3, 0x81, 0x8e, 0x25, 0x40,
600 0x10, 0xfc, 0x07, 0x1e, 0xf9, 0x7b, 0x9a, 0x4b,
601 0x6c, 0xe3, 0xb3, 0xad, 0x1a, 0x0a, 0xdd, 0x9e,
602 0x59, 0x0c, 0xa2, 0xcd, 0xae, 0x48, 0x4a, 0x38,
603 0x5b, 0x47, 0x41, 0x94, 0x65, 0x6b, 0xbb, 0xeb,
604 0x5b, 0xe3, 0xaf, 0x07, 0x5b, 0xd4, 0x4a, 0xa2,
605 0xc9, 0x5d, 0x2f, 0x64, 0x03, 0xd7, 0x3a, 0x2c,
606 0x6e, 0xce, 0x76, 0x95, 0xb4, 0xb3, 0xc0, 0xf1,
607 0xe2, 0x45, 0x73, 0x7a, 0x5c, 0xab, 0xc1, 0xfc,
608 0x02, 0x8d, 0x81, 0x29, 0xb3, 0xac, 0x07, 0xec,
609 0x40, 0x7d, 0x45, 0xd9, 0x7a, 0x59, 0xee, 0x34,
610 0xf0, 0xe9, 0xd5, 0x7b, 0x96, 0xb1, 0x3d, 0x95,
611 0xcc, 0x86, 0xb5, 0xb6, 0x04, 0x2d, 0xb5, 0x92,
612 0x7e, 0x76, 0xf4, 0x06, 0xa9, 0xa3, 0x12, 0x0f,
613 0xb1, 0xaf, 0x26, 0xba, 0x7c, 0xfc, 0x7e, 0x1c,
614 0xbc, 0x2c, 0x49, 0x97, 0x53, 0x60, 0x13, 0x0b,
615 0xa6, 0x61, 0x83, 0x89, 0x42, 0xd4, 0x17, 0x0c,
616 0x6c, 0x26, 0x52, 0xc3, 0xb3, 0xd4, 0x67, 0xf5,
617 0xe3, 0x04, 0xb7, 0xf4, 0xcb, 0x80, 0xb8, 0xcb,
618 0x77, 0x56, 0x3e, 0xaa, 0x57, 0x54, 0xee, 0xb4,
619 0x2c, 0x67, 0xcf, 0xf2, 0xdc, 0xbe, 0x55, 0xf9,
620 0x43, 0x1f, 0x6e, 0x22, 0x97, 0x67, 0x7f, 0xc4,
621 0xef, 0xb1, 0x26, 0x31, 0x1e, 0x27, 0xdf, 0x41,
622 0x80, 0x47, 0x6c, 0xe2, 0xfa, 0xa9, 0x8c, 0x2a,
623 0xf6, 0xf2, 0xab, 0xf0, 0x15, 0xda, 0x6c, 0xc8,
624 0xfe, 0xb5, 0x23, 0xde, 0xa9, 0x05, 0x3f, 0x06,
625 0x54, 0x4c, 0xcd, 0xe1, 0xab, 0xfc, 0x0e, 0x62,
626 0x33, 0x31, 0x73, 0x2c, 0x76, 0xcb, 0xb4, 0x47,
627 0x1e, 0x20, 0xad, 0xd8, 0xf2, 0x31, 0xdd, 0xc4,
628 0x8b, 0x0c, 0x77, 0xbe, 0xe1, 0x8b, 0x26, 0x00,
629 0x02, 0x58, 0xd6, 0x8d, 0xef, 0xad, 0x74, 0x67,
630 0xab, 0x3f, 0xef, 0xcb, 0x6f, 0xb0, 0xcc, 0x81,
631 0x44, 0x4c, 0xaf, 0xe9, 0x49, 0x4f, 0xdb, 0xa0,
632 0x25, 0xa4, 0xf0, 0x89, 0xf1, 0xbe, 0xd8, 0x10,
633 0xff, 0xb1, 0x3b, 0x4b, 0xfa, 0x98, 0xf5, 0x79,
634 0x6d, 0x1e, 0x69, 0x4d, 0x57, 0xb1, 0xc8, 0x19,
635 0x1b, 0xbd, 0x1e, 0x8c, 0x84, 0xb7, 0x7b, 0xe8,
636 0xd2, 0x2d, 0x09, 0x41, 0x41, 0x37, 0x3d, 0xb1,
637 0x6f, 0x26, 0x5d, 0x71, 0x16, 0x3d, 0xb7, 0x83,
638 0x27, 0x2c, 0xa7, 0xb6, 0x50, 0xbd, 0x91, 0x86,
639 0xab, 0x24, 0xa1, 0x38, 0xfd, 0xea, 0x71, 0x55,
640 0x7e, 0x9a, 0x07, 0x77, 0x4b, 0xfa, 0x61, 0x66,
641 0x20, 0x1e, 0x28, 0x95, 0x18, 0x1b, 0xa4, 0xa0,
642 0xfd, 0xc0, 0x89, 0x72, 0x43, 0xd9, 0x3b, 0x49,
643 0x5a, 0x3f, 0x9d, 0xbf, 0xdb, 0xb4, 0x46, 0xea,
644 0x42, 0x01, 0x77, 0x23, 0x68, 0x95, 0xb6, 0x24,
645 0xb3, 0xa8, 0x6c, 0x28, 0x3b, 0x11, 0x40, 0x7e,
646 0x18, 0x65, 0x6d, 0xd8, 0x24, 0x42, 0x7d, 0x88,
647 0xc0, 0x52, 0xd9, 0x05, 0xe4, 0x95, 0x90, 0x87,
648 0x8c, 0xf4, 0xd0, 0x6b, 0xb9, 0x83, 0x99, 0x34,
649 0x6d, 0xfe, 0x54, 0x40, 0x94, 0x52, 0x21, 0x4f,
650 0x14, 0x25, 0xc5, 0xd6, 0x5e, 0x95, 0xdc, 0x0a,
651 0x2b, 0x89, 0x20, 0x11, 0x84, 0x48, 0xd6, 0x3a,
652 0xcd, 0x5c, 0x24, 0xad, 0x62, 0xe3, 0xb1, 0x93,
653 0x25, 0x8d, 0xcd, 0x7e, 0xfc, 0x27, 0xa3, 0x37,
654 0xfd, 0x84, 0xfc, 0x1b, 0xb2, 0xf1, 0x27, 0x38,
655 0x5a, 0xb7, 0xfc, 0xf2, 0xfa, 0x95, 0x66, 0xd4,
656 0xfb, 0xba, 0xa7, 0xd7, 0xa3, 0x72, 0x69, 0x48,
657 0x48, 0x8c, 0xeb, 0x28, 0x89, 0xfe, 0x33, 0x65,
658 0x5a, 0x36, 0x01, 0x7e, 0x06, 0x79, 0x0a, 0x09,
659 0x3b, 0x74, 0x11, 0x9a, 0x6e, 0xbf, 0xd4, 0x9e,
660 0x58, 0x90, 0x49, 0x4f, 0x4d, 0x08, 0xd4, 0xe5,
661 0x4a, 0x09, 0x21, 0xef, 0x8b, 0xb8, 0x74, 0x3b,
662 0x91, 0xdd, 0x36, 0x85, 0x60, 0x2d, 0xfa, 0xd4,
663 0x45, 0x7b, 0x45, 0x53, 0xf5, 0x47, 0x87, 0x7e,
664 0xa6, 0x37, 0xc8, 0x78, 0x7a, 0x68, 0x9d, 0x8d,
665 0x65, 0x2c, 0x0e, 0x91, 0x5c, 0xa2, 0x60, 0xf0,
666 0x8e, 0x3f, 0xe9, 0x1a, 0xcd, 0xaa, 0xe7, 0xd5,
667 0x77, 0x18, 0xaf, 0xc9, 0xbc, 0x18, 0xea, 0x48,
668 0x1b, 0xfb, 0x22, 0x48, 0x70, 0x16, 0x29, 0x9e,
669 0x5b, 0xc1, 0x2c, 0x66, 0x23, 0xbc, 0xf0, 0x1f,
670 0xef, 0xaf, 0xe4, 0xd6, 0x04, 0x19, 0x82, 0x7a,
671 0x0b, 0xba, 0x4b, 0x46, 0xb1, 0x6a, 0x85, 0x5d,
672 0xb4, 0x73, 0xd6, 0x21, 0xa1, 0x71, 0x60, 0x14,
673 0xee, 0x0a, 0x77, 0xc4, 0x66, 0x2e, 0xf9, 0x69,
674 0x30, 0xaf, 0x41, 0x0b, 0xc8, 0x83, 0x3c, 0x53,
675 0x99, 0x19, 0x27, 0x46, 0xf7, 0x41, 0x6e, 0x56,
676 0xdc, 0x94, 0x28, 0x67, 0x4e, 0xb7, 0x25, 0x48,
677 0x8a, 0xc2, 0xe0, 0x60, 0x96, 0xcc, 0x18, 0xf4,
678 0x84, 0xdd, 0xa7, 0x5e, 0x3e, 0x05, 0x0b, 0x26,
679 0x26, 0xb2, 0x5c, 0x1f, 0x57, 0x1a, 0x04, 0x7e,
680 0x6a, 0xe3, 0x2f, 0xb4, 0x35, 0xb6, 0x38, 0x40,
681 0x40, 0xcd, 0x6f, 0x87, 0x2e, 0xef, 0xa3, 0xd7,
682 0xa9, 0xc2, 0xe8, 0x0d, 0x27, 0xdf, 0x44, 0x62,
683 0x99, 0xa0, 0xfc, 0xcf, 0x81, 0x78, 0xcb, 0xfe,
684 0xe5, 0xa0, 0x03, 0x4e, 0x6c, 0xd7, 0xf4, 0xaf,
685 0x7a, 0xbb, 0x61, 0x82, 0xfe, 0x71, 0x89, 0xb2,
686 0x22, 0x7c, 0x8e, 0x83, 0x04, 0xce, 0xf6, 0x5d,
687 0x84, 0x8f, 0x95, 0x6a, 0x7f, 0xad, 0xfd, 0x32,
688 0x9c, 0x5e, 0xe4, 0x9c, 0x89, 0x60, 0x54, 0xaa,
689 0x96, 0x72, 0xd2, 0xd7, 0x36, 0x85, 0xa9, 0x45,
690 0xd2, 0x2a, 0xa1, 0x81, 0x49, 0x6f, 0x7e, 0x04,
691 0xfa, 0xe2, 0xfe, 0x90, 0x26, 0x77, 0x5a, 0x33,
692 0xb8, 0x04, 0x9a, 0x7a, 0xe6, 0x4c, 0x4f, 0xad,
693 0x72, 0x96, 0x08, 0x28, 0x58, 0x13, 0xf8, 0xc4,
694 0x1c, 0xf0, 0xc3, 0x45, 0x95, 0x49, 0x20, 0x8c,
695 0x9f, 0x39, 0x70, 0xe1, 0x77, 0xfe, 0xd5, 0x4b,
696 0xaf, 0x86, 0xda, 0xef, 0x22, 0x06, 0x83, 0x36,
697 0x29, 0x12, 0x11, 0x40, 0xbc, 0x3b, 0x86, 0xaa,
698 0xaa, 0x65, 0x60, 0xc3, 0x80, 0xca, 0xed, 0xa9,
699 0xf3, 0xb0, 0x79, 0x96, 0xa2, 0x55, 0x27, 0x28,
700 0x55, 0x73, 0x26, 0xa5, 0x50, 0xea, 0x92, 0x4b,
701 0x3c, 0x5c, 0x82, 0x33, 0xf0, 0x01, 0x3f, 0x03,
702 0xc1, 0x08, 0x05, 0xbf, 0x98, 0xf4, 0x9b, 0x6d,
703 0xa5, 0xa8, 0xb4, 0x82, 0x0c, 0x06, 0xfa, 0xff,
704 0x2d, 0x08, 0xf3, 0x05, 0x4f, 0x57, 0x2a, 0x39,
705 0xd4, 0x83, 0x0d, 0x75, 0x51, 0xd8, 0x5b, 0x1b,
706 0xd3, 0x51, 0x5a, 0x32, 0x2a, 0x9b, 0x32, 0xb2,
707 0xf2, 0xa4, 0x96, 0x12, 0xf2, 0xae, 0x40, 0x34,
708 0x67, 0xa8, 0xf5, 0x44, 0xd5, 0x35, 0x53, 0xfe,
709 0xa3, 0x60, 0x96, 0x63, 0x0f, 0x1f, 0x6e, 0xb0,
710 0x5a, 0x42, 0xa6, 0xfc, 0x51, 0x0b, 0x60, 0x27,
711 0xbc, 0x06, 0x71, 0xed, 0x65, 0x5b, 0x23, 0x86,
712 0x4a, 0x07, 0x3b, 0x22, 0x07, 0x46, 0xe6, 0x90,
713 0x3e, 0xf3, 0x25, 0x50, 0x1b, 0x4c, 0x7f, 0x03,
714 0x08, 0xa8, 0x36, 0x6b, 0x87, 0xe5, 0xe3, 0xdb,
715 0x9a, 0x38, 0x83, 0xff, 0x9f, 0x1a, 0x9f, 0x57,
716 0xa4, 0x2a, 0xf6, 0x37, 0xbc, 0x1a, 0xff, 0xc9,
717 0x1e, 0x35, 0x0c, 0xc3, 0x7c, 0xa3, 0xb2, 0xe5,
718 0xd2, 0xc6, 0xb4, 0x57, 0x47, 0xe4, 0x32, 0x16,
719 0x6d, 0xa9, 0xae, 0x64, 0xe6, 0x2d, 0x8d, 0xc5,
720 0x8d, 0x50, 0x8e, 0xe8, 0x1a, 0x22, 0x34, 0x2a,
721 0xd9, 0xeb, 0x51, 0x90, 0x4a, 0xb1, 0x41, 0x7d,
722 0x64, 0xf9, 0xb9, 0x0d, 0xf6, 0x23, 0x33, 0xb0,
723 0x33, 0xf4, 0xf7, 0x3f, 0x27, 0x84, 0xc6, 0x0f,
724 0x54, 0xa5, 0xc0, 0x2e, 0xec, 0x0b, 0x3a, 0x48,
725 0x6e, 0x80, 0x35, 0x81, 0x43, 0x9b, 0x90, 0xb1,
726 0xd0, 0x2b, 0xea, 0x21, 0xdc, 0xda, 0x5b, 0x09,
727 0xf4, 0xcc, 0x10, 0xb4, 0xc7, 0xfe, 0x79, 0x51,
728 0xc3, 0xc5, 0xac, 0x88, 0x74, 0x84, 0x0b, 0x4b,
729 0xca, 0x79, 0x16, 0x29, 0xfb, 0x69, 0x54, 0xdf,
730 0x41, 0x7e, 0xe9, 0xc7, 0x8e, 0xea, 0xa5, 0xfe,
731 0xfc, 0x76, 0x0e, 0x90, 0xc4, 0x92, 0x38, 0xad,
732 0x7b, 0x48, 0xe6, 0x6e, 0xf7, 0x21, 0xfd, 0x4e,
733 0x93, 0x0a, 0x7b, 0x41, 0x83, 0x68, 0xfb, 0x57,
734 0x51, 0x76, 0x34, 0xa9, 0x6c, 0x00, 0xaa, 0x4f,
735 0x66, 0x65, 0x98, 0x4a, 0x4f, 0xa3, 0xa0, 0xef,
736 0x69, 0x3f, 0xe3, 0x1c, 0x92, 0x8c, 0xfd, 0xd8,
737 0xe8, 0xde, 0x7c, 0x7f, 0x3e, 0x84, 0x8e, 0x69,
738 0x3c, 0xf1, 0xf2, 0x05, 0x46, 0xdc, 0x2f, 0x9d,
739 0x5e, 0x6e, 0x4c, 0xfb, 0xb5, 0x99, 0x2a, 0x59,
740 0x63, 0xc1, 0x34, 0xbc, 0x57, 0xc0, 0x0d, 0xb9,
741 0x61, 0x25, 0xf3, 0x33, 0x23, 0x51, 0xb6, 0x0d,
742 0x07, 0xa6, 0xab, 0x94, 0x4a, 0xb7, 0x2a, 0xea,
743 0xee, 0xac, 0xa3, 0xc3, 0x04, 0x8b, 0x0e, 0x56,
744 0xfe, 0x44, 0xa7, 0x39, 0xe2, 0xed, 0xed, 0xb4,
745 0x22, 0x2b, 0xac, 0x12, 0x32, 0x28, 0x91, 0xd8,
746 0xa5, 0xab, 0xff, 0x5f, 0xe0, 0x4b, 0xda, 0x78,
747 0x17, 0xda, 0xf1, 0x01, 0x5b, 0xcd, 0xe2, 0x5f,
748 0x50, 0x45, 0x73, 0x2b, 0xe4, 0x76, 0x77, 0xf4,
749 0x64, 0x1d, 0x43, 0xfb, 0x84, 0x7a, 0xea, 0x91,
750 0xae, 0xf9, 0x9e, 0xb7, 0xb4, 0xb0, 0x91, 0x5f,
751 0x16, 0x35, 0x9a, 0x11, 0xb8, 0xc7, 0xc1, 0x8c,
752 0xc6, 0x10, 0x8d, 0x2f, 0x63, 0x4a, 0xa7, 0x57,
753 0x3a, 0x51, 0xd6, 0x32, 0x2d, 0x64, 0x72, 0xd4,
754 0x66, 0xdc, 0x10, 0xa6, 0x67, 0xd6, 0x04, 0x23,
755 0x9d, 0x0a, 0x11, 0x77, 0xdd, 0x37, 0x94, 0x17,
756 0x3c, 0xbf, 0x8b, 0x65, 0xb0, 0x2e, 0x5e, 0x66,
757 0x47, 0x64, 0xac, 0xdd, 0xf0, 0x84, 0xfd, 0x39,
758 0xfa, 0x15, 0x5d, 0xef, 0xae, 0xca, 0xc1, 0x36,
759 0xa7, 0x5c, 0xbf, 0xc7, 0x08, 0xc2, 0x66, 0x00,
760 0x74, 0x74, 0x4e, 0x27, 0x3f, 0x55, 0x8a, 0xb7,
761 0x38, 0x66, 0x83, 0x6d, 0xcf, 0x99, 0x9e, 0x60,
762 0x8f, 0xdd, 0x2e, 0x62, 0x22, 0x0e, 0xef, 0x0c,
763 0x98, 0xa7, 0x85, 0x74, 0x3b, 0x9d, 0xec, 0x9e,
764 0xa9, 0x19, 0x72, 0xa5, 0x7f, 0x2c, 0x39, 0xb7,
765 0x7d, 0xb7, 0xf1, 0x12, 0x65, 0x27, 0x4b, 0x5a,
766 0xde, 0x17, 0xfe, 0xad, 0x44, 0xf3, 0x20, 0x4d,
767 0xfd, 0xe4, 0x1f, 0xb5, 0x81, 0xb0, 0x36, 0x37,
768 0x08, 0x6f, 0xc3, 0x0c, 0xe9, 0x85, 0x98, 0x82,
769 0xa9, 0x62, 0x0c, 0xc4, 0x97, 0xc0, 0x50, 0xc8,
770 0xa7, 0x3c, 0x50, 0x9f, 0x43, 0xb9, 0xcd, 0x5e,
771 0x4d, 0xfa, 0x1c, 0x4b, 0x0b, 0xa9, 0x98, 0x85,
772 0x38, 0x92, 0xac, 0x8d, 0xe4, 0xad, 0x9b, 0x98,
773 0xab, 0xd9, 0x38, 0xac, 0x62, 0x52, 0xa3, 0x22,
774 0x63, 0x0f, 0xbf, 0x95, 0x48, 0xdf, 0x69, 0xe7,
775 0x8b, 0x33, 0xd5, 0xb2, 0xbd, 0x05, 0x49, 0x49,
776 0x9d, 0x57, 0x73, 0x19, 0x33, 0xae, 0xfa, 0x33,
777 0xf1, 0x19, 0xa8, 0x80, 0xce, 0x04, 0x9f, 0xbc,
778 0x1d, 0x65, 0x82, 0x1b, 0xe5, 0x3a, 0x51, 0xc8,
779 0x1c, 0x21, 0xe3, 0x5d, 0xf3, 0x7d, 0x9b, 0x2f,
780 0x2c, 0x1d, 0x4a, 0x7f, 0x9b, 0x68, 0x35, 0xa3,
781 0xb2, 0x50, 0xf7, 0x62, 0x79, 0xcd, 0xf4, 0x98,
782 0x4f, 0xe5, 0x63, 0x7c, 0x3e, 0x45, 0x31, 0x8c,
783 0x16, 0xa0, 0x12, 0xc8, 0x58, 0xce, 0x39, 0xa6,
784 0xbc, 0x54, 0xdb, 0xc5, 0xe0, 0xd5, 0xba, 0xbc,
785 0xb9, 0x04, 0xf4, 0x8d, 0xe8, 0x2f, 0x15, 0x9d,
786};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700787
Bob Pearson3863ef32012-03-23 15:02:22 -0700788/* 100 test cases */
789static struct crc_test {
790 u32 crc; /* random starting crc */
791 u32 start; /* random 6 bit offset in buf */
792 u32 length; /* random 11 bit length of test */
793 u32 crc_le; /* expected crc32_le result */
794 u32 crc_be; /* expected crc32_be result */
Darrick J. Wong577eba92012-03-23 15:02:26 -0700795 u32 crc32c_le; /* expected crc32c_le result */
Bob Pearson3863ef32012-03-23 15:02:22 -0700796} test[] =
Linus Torvalds1da177e2005-04-16 15:20:36 -0700797{
Darrick J. Wong577eba92012-03-23 15:02:26 -0700798 {0x674bf11d, 0x00000038, 0x00000542, 0x0af6d466, 0xd8b6e4c1,
799 0xf6e93d6c},
800 {0x35c672c6, 0x0000003a, 0x000001aa, 0xc6d3dfba, 0x28aaf3ad,
801 0x0fe92aca},
802 {0x496da28e, 0x00000039, 0x000005af, 0xd933660f, 0x5d57e81f,
803 0x52e1ebb8},
804 {0x09a9b90e, 0x00000027, 0x000001f8, 0xb45fe007, 0xf45fca9a,
805 0x0798af9a},
806 {0xdc97e5a9, 0x00000025, 0x000003b6, 0xf81a3562, 0xe0126ba2,
807 0x18eb3152},
808 {0x47c58900, 0x0000000a, 0x000000b9, 0x8e58eccf, 0xf3afc793,
809 0xd00d08c7},
810 {0x292561e8, 0x0000000c, 0x00000403, 0xa2ba8aaf, 0x0b797aed,
811 0x8ba966bc},
812 {0x415037f6, 0x00000003, 0x00000676, 0xa17d52e8, 0x7f0fdf35,
813 0x11d694a2},
814 {0x3466e707, 0x00000026, 0x00000042, 0x258319be, 0x75c484a2,
815 0x6ab3208d},
816 {0xafd1281b, 0x00000023, 0x000002ee, 0x4428eaf8, 0x06c7ad10,
817 0xba4603c5},
818 {0xd3857b18, 0x00000028, 0x000004a2, 0x5c430821, 0xb062b7cb,
819 0xe6071c6f},
820 {0x1d825a8f, 0x0000002b, 0x0000050b, 0xd2c45f0c, 0xd68634e0,
821 0x179ec30a},
822 {0x5033e3bc, 0x0000000b, 0x00000078, 0xa3ea4113, 0xac6d31fb,
823 0x0903beb8},
824 {0x94f1fb5e, 0x0000000f, 0x000003a2, 0xfbfc50b1, 0x3cfe50ed,
825 0x6a7cb4fa},
826 {0xc9a0fe14, 0x00000009, 0x00000473, 0x5fb61894, 0x87070591,
827 0xdb535801},
828 {0x88a034b1, 0x0000001c, 0x000005ad, 0xc1b16053, 0x46f95c67,
829 0x92bed597},
830 {0xf0f72239, 0x00000020, 0x0000026d, 0xa6fa58f3, 0xf8c2c1dd,
831 0x192a3f1b},
832 {0xcc20a5e3, 0x0000003b, 0x0000067a, 0x7740185a, 0x308b979a,
833 0xccbaec1a},
834 {0xce589c95, 0x0000002b, 0x00000641, 0xd055e987, 0x40aae25b,
835 0x7eabae4d},
836 {0x78edc885, 0x00000035, 0x000005be, 0xa39cb14b, 0x035b0d1f,
837 0x28c72982},
838 {0x9d40a377, 0x0000003b, 0x00000038, 0x1f47ccd2, 0x197fbc9d,
839 0xc3cd4d18},
840 {0x703d0e01, 0x0000003c, 0x000006f1, 0x88735e7c, 0xfed57c5a,
841 0xbca8f0e7},
842 {0x776bf505, 0x0000000f, 0x000005b2, 0x5cc4fc01, 0xf32efb97,
843 0x713f60b3},
844 {0x4a3e7854, 0x00000027, 0x000004b8, 0x8d923c82, 0x0cbfb4a2,
845 0xebd08fd5},
846 {0x209172dd, 0x0000003b, 0x00000356, 0xb89e9c2b, 0xd7868138,
847 0x64406c59},
848 {0x3ba4cc5b, 0x0000002f, 0x00000203, 0xe51601a9, 0x5b2a1032,
849 0x7421890e},
850 {0xfc62f297, 0x00000000, 0x00000079, 0x71a8e1a2, 0x5d88685f,
851 0xe9347603},
852 {0x64280b8b, 0x00000016, 0x000007ab, 0x0fa7a30c, 0xda3a455f,
853 0x1bef9060},
854 {0x97dd724b, 0x00000033, 0x000007ad, 0x5788b2f4, 0xd7326d32,
855 0x34720072},
856 {0x61394b52, 0x00000035, 0x00000571, 0xc66525f1, 0xcabe7fef,
857 0x48310f59},
858 {0x29b4faff, 0x00000024, 0x0000006e, 0xca13751e, 0x993648e0,
859 0x783a4213},
860 {0x29bfb1dc, 0x0000000b, 0x00000244, 0x436c43f7, 0x429f7a59,
861 0x9e8efd41},
862 {0x86ae934b, 0x00000035, 0x00000104, 0x0760ec93, 0x9cf7d0f4,
863 0xfc3d34a5},
864 {0xc4c1024e, 0x0000002e, 0x000006b1, 0x6516a3ec, 0x19321f9c,
865 0x17a52ae2},
866 {0x3287a80a, 0x00000026, 0x00000496, 0x0b257eb1, 0x754ebd51,
867 0x886d935a},
868 {0xa4db423e, 0x00000023, 0x0000045d, 0x9b3a66dc, 0x873e9f11,
869 0xeaaeaeb2},
870 {0x7a1078df, 0x00000015, 0x0000014a, 0x8c2484c5, 0x6a628659,
871 0x8e900a4b},
872 {0x6048bd5b, 0x00000006, 0x0000006a, 0x897e3559, 0xac9961af,
873 0xd74662b1},
874 {0xd8f9ea20, 0x0000003d, 0x00000277, 0x60eb905b, 0xed2aaf99,
875 0xd26752ba},
876 {0xea5ec3b4, 0x0000002a, 0x000004fe, 0x869965dc, 0x6c1f833b,
877 0x8b1fcd62},
878 {0x2dfb005d, 0x00000016, 0x00000345, 0x6a3b117e, 0xf05e8521,
879 0xf54342fe},
880 {0x5a214ade, 0x00000020, 0x000005b6, 0x467f70be, 0xcb22ccd3,
881 0x5b95b988},
882 {0xf0ab9cca, 0x00000032, 0x00000515, 0xed223df3, 0x7f3ef01d,
883 0x2e1176be},
884 {0x91b444f9, 0x0000002e, 0x000007f8, 0x84e9a983, 0x5676756f,
885 0x66120546},
886 {0x1b5d2ddb, 0x0000002e, 0x0000012c, 0xba638c4c, 0x3f42047b,
887 0xf256a5cc},
888 {0xd824d1bb, 0x0000003a, 0x000007b5, 0x6288653b, 0x3a3ebea0,
889 0x4af1dd69},
890 {0x0470180c, 0x00000034, 0x000001f0, 0x9d5b80d6, 0x3de08195,
891 0x56f0a04a},
892 {0xffaa3a3f, 0x00000036, 0x00000299, 0xf3a82ab8, 0x53e0c13d,
893 0x74f6b6b2},
894 {0x6406cfeb, 0x00000023, 0x00000600, 0xa920b8e8, 0xe4e2acf4,
895 0x085951fd},
896 {0xb24aaa38, 0x0000003e, 0x000004a1, 0x657cc328, 0x5077b2c3,
897 0xc65387eb},
898 {0x58b2ab7c, 0x00000039, 0x000002b4, 0x3a17ee7e, 0x9dcb3643,
899 0x1ca9257b},
900 {0x3db85970, 0x00000006, 0x000002b6, 0x95268b59, 0xb9812c10,
901 0xfd196d76},
902 {0x857830c5, 0x00000003, 0x00000590, 0x4ef439d5, 0xf042161d,
903 0x5ef88339},
904 {0xe1fcd978, 0x0000003e, 0x000007d8, 0xae8d8699, 0xce0a1ef5,
905 0x2c3714d9},
906 {0xb982a768, 0x00000016, 0x000006e0, 0x62fad3df, 0x5f8a067b,
907 0x58576548},
908 {0x1d581ce8, 0x0000001e, 0x0000058b, 0xf0f5da53, 0x26e39eee,
909 0xfd7c57de},
910 {0x2456719b, 0x00000025, 0x00000503, 0x4296ac64, 0xd50e4c14,
911 0xd5fedd59},
912 {0xfae6d8f2, 0x00000000, 0x0000055d, 0x057fdf2e, 0x2a31391a,
913 0x1cc3b17b},
914 {0xcba828e3, 0x00000039, 0x000002ce, 0xe3f22351, 0x8f00877b,
915 0x270eed73},
916 {0x13d25952, 0x0000000a, 0x0000072d, 0x76d4b4cc, 0x5eb67ec3,
917 0x91ecbb11},
918 {0x0342be3f, 0x00000015, 0x00000599, 0xec75d9f1, 0x9d4d2826,
919 0x05ed8d0c},
920 {0xeaa344e0, 0x00000014, 0x000004d8, 0x72a4c981, 0x2064ea06,
921 0x0b09ad5b},
922 {0xbbb52021, 0x0000003b, 0x00000272, 0x04af99fc, 0xaf042d35,
923 0xf8d511fb},
924 {0xb66384dc, 0x0000001d, 0x000007fc, 0xd7629116, 0x782bd801,
925 0x5ad832cc},
926 {0x616c01b6, 0x00000022, 0x000002c8, 0x5b1dab30, 0x783ce7d2,
927 0x1214d196},
928 {0xce2bdaad, 0x00000016, 0x0000062a, 0x932535c8, 0x3f02926d,
929 0x5747218a},
930 {0x00fe84d7, 0x00000005, 0x00000205, 0x850e50aa, 0x753d649c,
931 0xde8f14de},
932 {0xbebdcb4c, 0x00000006, 0x0000055d, 0xbeaa37a2, 0x2d8c9eba,
933 0x3563b7b9},
934 {0xd8b1a02a, 0x00000010, 0x00000387, 0x5017d2fc, 0x503541a5,
935 0x071475d0},
936 {0x3b96cad2, 0x00000036, 0x00000347, 0x1d2372ae, 0x926cd90b,
937 0x54c79d60},
938 {0xc94c1ed7, 0x00000005, 0x0000038b, 0x9e9fdb22, 0x144a9178,
939 0x4c53eee6},
940 {0x1aad454e, 0x00000025, 0x000002b2, 0xc3f6315c, 0x5c7a35b3,
941 0x10137a3c},
942 {0xa4fec9a6, 0x00000000, 0x000006d6, 0x90be5080, 0xa4107605,
943 0xaa9d6c73},
944 {0x1bbe71e2, 0x0000001f, 0x000002fd, 0x4e504c3b, 0x284ccaf1,
945 0xb63d23e7},
946 {0x4201c7e4, 0x00000002, 0x000002b7, 0x7822e3f9, 0x0cc912a9,
947 0x7f53e9cf},
948 {0x23fddc96, 0x00000003, 0x00000627, 0x8a385125, 0x07767e78,
949 0x13c1cd83},
950 {0xd82ba25c, 0x00000016, 0x0000063e, 0x98e4148a, 0x283330c9,
951 0x49ff5867},
952 {0x786f2032, 0x0000002d, 0x0000060f, 0xf201600a, 0xf561bfcd,
953 0x8467f211},
954 {0xfebe4e1f, 0x0000002a, 0x000004f2, 0x95e51961, 0xfd80dcab,
955 0x3f9683b2},
956 {0x1a6e0a39, 0x00000008, 0x00000672, 0x8af6c2a5, 0x78dd84cb,
957 0x76a3f874},
958 {0x56000ab8, 0x0000000e, 0x000000e5, 0x36bacb8f, 0x22ee1f77,
959 0x863b702f},
960 {0x4717fe0c, 0x00000000, 0x000006ec, 0x8439f342, 0x5c8e03da,
961 0xdc6c58ff},
962 {0xd5d5d68e, 0x0000003c, 0x000003a3, 0x46fff083, 0x177d1b39,
963 0x0622cc95},
964 {0xc25dd6c6, 0x00000024, 0x000006c0, 0x5ceb8eb4, 0x892b0d16,
965 0xe85605cd},
966 {0xe9b11300, 0x00000023, 0x00000683, 0x07a5d59a, 0x6c6a3208,
967 0x31da5f06},
968 {0x95cd285e, 0x00000001, 0x00000047, 0x7b3a4368, 0x0202c07e,
969 0xa1f2e784},
970 {0xd9245a25, 0x0000001e, 0x000003a6, 0xd33c1841, 0x1936c0d5,
971 0xb07cc616},
972 {0x103279db, 0x00000006, 0x0000039b, 0xca09b8a0, 0x77d62892,
973 0xbf943b6c},
974 {0x1cba3172, 0x00000027, 0x000001c8, 0xcb377194, 0xebe682db,
975 0x2c01af1c},
976 {0x8f613739, 0x0000000c, 0x000001df, 0xb4b0bc87, 0x7710bd43,
977 0x0fe5f56d},
978 {0x1c6aa90d, 0x0000001b, 0x0000053c, 0x70559245, 0xda7894ac,
979 0xf8943b2d},
980 {0xaabe5b93, 0x0000003d, 0x00000715, 0xcdbf42fa, 0x0c3b99e7,
981 0xe4d89272},
982 {0xf15dd038, 0x00000006, 0x000006db, 0x6e104aea, 0x8d5967f2,
983 0x7c2f6bbb},
984 {0x584dd49c, 0x00000020, 0x000007bc, 0x36b6cfd6, 0xad4e23b2,
985 0xabbf388b},
986 {0x5d8c9506, 0x00000020, 0x00000470, 0x4c62378e, 0x31d92640,
987 0x1dca1f4e},
988 {0xb80d17b0, 0x00000032, 0x00000346, 0x22a5bb88, 0x9a7ec89f,
989 0x5c170e23},
990 {0xdaf0592e, 0x00000023, 0x000007b0, 0x3cab3f99, 0x9b1fdd99,
991 0xc0e9d672},
992 {0x4793cc85, 0x0000000d, 0x00000706, 0xe82e04f6, 0xed3db6b7,
993 0xc18bdc86},
994 {0x82ebf64e, 0x00000009, 0x000007c3, 0x69d590a9, 0x9efa8499,
995 0xa874fcdd},
996 {0xb18a0319, 0x00000026, 0x000007db, 0x1cf98dcc, 0x8fa9ad6a,
997 0x9dc0bb48},
Bob Pearson3863ef32012-03-23 15:02:22 -0700998};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700999
Bob Pearson3863ef32012-03-23 15:02:22 -07001000#include <linux/time.h>
1001
Darrick J. Wong577eba92012-03-23 15:02:26 -07001002static int __init crc32c_test(void)
1003{
1004 int i;
1005 int errors = 0;
1006 int bytes = 0;
1007 struct timespec start, stop;
1008 u64 nsec;
1009 unsigned long flags;
1010
1011 /* keep static to prevent cache warming code from
1012 * getting eliminated by the compiler */
1013 static u32 crc;
1014
1015 /* pre-warm the cache */
1016 for (i = 0; i < 100; i++) {
1017 bytes += 2*test[i].length;
1018
1019 crc ^= __crc32c_le(test[i].crc, test_buf +
1020 test[i].start, test[i].length);
1021 }
1022
1023 /* reduce OS noise */
1024 local_irq_save(flags);
1025 local_irq_disable();
1026
1027 getnstimeofday(&start);
1028 for (i = 0; i < 100; i++) {
1029 if (test[i].crc32c_le != __crc32c_le(test[i].crc, test_buf +
1030 test[i].start, test[i].length))
1031 errors++;
1032 }
1033 getnstimeofday(&stop);
1034
1035 local_irq_restore(flags);
1036 local_irq_enable();
1037
1038 nsec = stop.tv_nsec - start.tv_nsec +
1039 1000000000 * (stop.tv_sec - start.tv_sec);
1040
1041 pr_info("crc32c: CRC_LE_BITS = %d\n", CRC_LE_BITS);
1042
1043 if (errors)
1044 pr_warn("crc32c: %d self tests failed\n", errors);
1045 else {
1046 pr_info("crc32c: self tests passed, processed %d bytes in %lld nsec\n",
1047 bytes, nsec);
1048 }
1049
1050 return 0;
1051}
1052
1053static int __init crc32_test(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001054{
Bob Pearson3863ef32012-03-23 15:02:22 -07001055 int i;
1056 int errors = 0;
1057 int bytes = 0;
1058 struct timespec start, stop;
1059 u64 nsec;
1060 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001061
Bob Pearson3863ef32012-03-23 15:02:22 -07001062 /* keep static to prevent cache warming code from
1063 * getting eliminated by the compiler */
1064 static u32 crc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001065
Bob Pearson3863ef32012-03-23 15:02:22 -07001066 /* pre-warm the cache */
1067 for (i = 0; i < 100; i++) {
1068 bytes += 2*test[i].length;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001069
Bob Pearson3863ef32012-03-23 15:02:22 -07001070 crc ^= crc32_le(test[i].crc, test_buf +
1071 test[i].start, test[i].length);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001072
Bob Pearson3863ef32012-03-23 15:02:22 -07001073 crc ^= crc32_be(test[i].crc, test_buf +
1074 test[i].start, test[i].length);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001075 }
1076
Bob Pearson3863ef32012-03-23 15:02:22 -07001077 /* reduce OS noise */
1078 local_irq_save(flags);
1079 local_irq_disable();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001080
Bob Pearson3863ef32012-03-23 15:02:22 -07001081 getnstimeofday(&start);
1082 for (i = 0; i < 100; i++) {
1083 if (test[i].crc_le != crc32_le(test[i].crc, test_buf +
1084 test[i].start, test[i].length))
1085 errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001086
Bob Pearson3863ef32012-03-23 15:02:22 -07001087 if (test[i].crc_be != crc32_be(test[i].crc, test_buf +
1088 test[i].start, test[i].length))
1089 errors++;
1090 }
1091 getnstimeofday(&stop);
1092
1093 local_irq_restore(flags);
1094 local_irq_enable();
1095
1096 nsec = stop.tv_nsec - start.tv_nsec +
1097 1000000000 * (stop.tv_sec - start.tv_sec);
1098
1099 pr_info("crc32: CRC_LE_BITS = %d, CRC_BE BITS = %d\n",
1100 CRC_LE_BITS, CRC_BE_BITS);
1101
1102 if (errors)
1103 pr_warn("crc32: %d self tests failed\n", errors);
1104 else {
1105 pr_info("crc32: self tests passed, processed %d bytes in %lld nsec\n",
1106 bytes, nsec);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001107 }
1108
Linus Torvalds1da177e2005-04-16 15:20:36 -07001109 return 0;
1110}
1111
Darrick J. Wong577eba92012-03-23 15:02:26 -07001112static int __init crc32test_init(void)
1113{
1114 crc32_test();
1115 crc32c_test();
1116 return 0;
1117}
1118
Bob Pearson3863ef32012-03-23 15:02:22 -07001119static void __exit crc32_exit(void)
1120{
1121}
1122
Darrick J. Wong577eba92012-03-23 15:02:26 -07001123module_init(crc32test_init);
Bob Pearson3863ef32012-03-23 15:02:22 -07001124module_exit(crc32_exit);
1125#endif /* CONFIG_CRC32_SELFTEST */