1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
//! This module contains functions for calculating CRCs as defined in
//! the CD-DA and CD-ROM standards.
//!
//! The CD standards use [CRCs (cyclic redundancy checks)](https://en.wikipedia.org/wiki/Cyclic_redundancy_check)
//! as a way to allow a player to check for corruption of low-level metadata.
//! Since CDs are a physical medium that can suffer from scratches, dust, and other
//! damage, it's important to be able to know that playback metadata is actually
//! accurate before trying to read it.
//!
//! The CD-DA and CD-ROM standards use two types of CRC functions in different
//! parts of each sector:
//!
//! 1. A 32-bit CRC within the error correction metadata located within each sector.
//! 2. A 16-bit CRC within the second [subcode](https://en.wikipedia.org/wiki/Compact_Disc_subcode).
//!
//! This crate currently only provides the 16-bit CRC.
//!
//! This crate incorporates an adaptation of a CRC function from the
//! [Ruby crc gem](https://rubygems.org/gems/crc) by dearblue.

/*
 * A CRC calculator for {CRC-16-0x1021 init=0 xor=~0}.
 *
 * This code is auto generated by <https://rubygems.org/gems/crc>.
 *
 * * License:: Creative Commons License Zero (CC0 / Public Domain)
 *             See <https://creativecommons.org/publicdomain/zero/1.0/>
 * * Version:: crc-0.4.1 (powered by ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin17])
 * * Generated at:: 2018-04-30
 * * Algorithm:: slicing-by-16 (with byte-order free), based Intel's slicing-by-8
 * * Need available memory:: about 1 MiB
 *
 * Translated into Rust with minimal changes.
 * This is a variant of the CCITT CRC16 routine.
 * With an initial CRC of 0xFFFF, this produces data suitable for use in
 * CD-ROM subchannels.
 */

pub const CRC16_BITSIZE:        usize = 16;
pub const CRC16_BITMASK:        u16   = 0xFFFFu16;
pub const CRC16_POLYNOMIAL:     u16   = 0x1021u16;
pub const CRC16_INITIAL_CRC:    u16   = 0xFFFFu16;
pub const CRC16_XOR_OUTPUT:     u16   = 0xFFFFu16;
pub const CRC16_REFLECT_INPUT:  bool  = false;
pub const CRC16_REFLECT_OUTPUT: bool  = false;

/// Calculates a 16-bit CRC for the supplied data.
/// This is the form of CRC used by the CD standard's Q subcode data.
/// `initial_crc` is an initial CRC value which will be updated as
/// calculations are performed; for Q subcode data, use the value
/// of the `CRC16_INITIAL_CRC` constant.
///
/// # Example
/// ```
/// use cdrom_crc::{crc16, CRC16_INITIAL_CRC};
///
/// let result = crc16(&[0, 1, 2, 3], CRC16_INITIAL_CRC);
/// assert_eq!(result, 0x9ECE);
/// ```
///
/// # Notes
///
/// This form of CRC is defined in section 22.3.6 of the
/// [CD-ROM standard](http://www.ecma-international.org/publications/standards/Ecma-130.htm)
/// (ECMA-130, the “Yellow Book”).
pub fn crc16(data: &[u8], initial_crc: u16) -> u16
{
    static TABLE: [[u16; 256]; 16] = [
        [
            0x0000u16, 0x1021u16, 0x2042u16, 0x3063u16, 0x4084u16, 0x50A5u16, 0x60C6u16, 0x70E7u16,
            0x8108u16, 0x9129u16, 0xA14Au16, 0xB16Bu16, 0xC18Cu16, 0xD1ADu16, 0xE1CEu16, 0xF1EFu16,
            0x1231u16, 0x0210u16, 0x3273u16, 0x2252u16, 0x52B5u16, 0x4294u16, 0x72F7u16, 0x62D6u16,
            0x9339u16, 0x8318u16, 0xB37Bu16, 0xA35Au16, 0xD3BDu16, 0xC39Cu16, 0xF3FFu16, 0xE3DEu16,
            0x2462u16, 0x3443u16, 0x0420u16, 0x1401u16, 0x64E6u16, 0x74C7u16, 0x44A4u16, 0x5485u16,
            0xA56Au16, 0xB54Bu16, 0x8528u16, 0x9509u16, 0xE5EEu16, 0xF5CFu16, 0xC5ACu16, 0xD58Du16,
            0x3653u16, 0x2672u16, 0x1611u16, 0x0630u16, 0x76D7u16, 0x66F6u16, 0x5695u16, 0x46B4u16,
            0xB75Bu16, 0xA77Au16, 0x9719u16, 0x8738u16, 0xF7DFu16, 0xE7FEu16, 0xD79Du16, 0xC7BCu16,
            0x48C4u16, 0x58E5u16, 0x6886u16, 0x78A7u16, 0x0840u16, 0x1861u16, 0x2802u16, 0x3823u16,
            0xC9CCu16, 0xD9EDu16, 0xE98Eu16, 0xF9AFu16, 0x8948u16, 0x9969u16, 0xA90Au16, 0xB92Bu16,
            0x5AF5u16, 0x4AD4u16, 0x7AB7u16, 0x6A96u16, 0x1A71u16, 0x0A50u16, 0x3A33u16, 0x2A12u16,
            0xDBFDu16, 0xCBDCu16, 0xFBBFu16, 0xEB9Eu16, 0x9B79u16, 0x8B58u16, 0xBB3Bu16, 0xAB1Au16,
            0x6CA6u16, 0x7C87u16, 0x4CE4u16, 0x5CC5u16, 0x2C22u16, 0x3C03u16, 0x0C60u16, 0x1C41u16,
            0xEDAEu16, 0xFD8Fu16, 0xCDECu16, 0xDDCDu16, 0xAD2Au16, 0xBD0Bu16, 0x8D68u16, 0x9D49u16,
            0x7E97u16, 0x6EB6u16, 0x5ED5u16, 0x4EF4u16, 0x3E13u16, 0x2E32u16, 0x1E51u16, 0x0E70u16,
            0xFF9Fu16, 0xEFBEu16, 0xDFDDu16, 0xCFFCu16, 0xBF1Bu16, 0xAF3Au16, 0x9F59u16, 0x8F78u16,
            0x9188u16, 0x81A9u16, 0xB1CAu16, 0xA1EBu16, 0xD10Cu16, 0xC12Du16, 0xF14Eu16, 0xE16Fu16,
            0x1080u16, 0x00A1u16, 0x30C2u16, 0x20E3u16, 0x5004u16, 0x4025u16, 0x7046u16, 0x6067u16,
            0x83B9u16, 0x9398u16, 0xA3FBu16, 0xB3DAu16, 0xC33Du16, 0xD31Cu16, 0xE37Fu16, 0xF35Eu16,
            0x02B1u16, 0x1290u16, 0x22F3u16, 0x32D2u16, 0x4235u16, 0x5214u16, 0x6277u16, 0x7256u16,
            0xB5EAu16, 0xA5CBu16, 0x95A8u16, 0x8589u16, 0xF56Eu16, 0xE54Fu16, 0xD52Cu16, 0xC50Du16,
            0x34E2u16, 0x24C3u16, 0x14A0u16, 0x0481u16, 0x7466u16, 0x6447u16, 0x5424u16, 0x4405u16,
            0xA7DBu16, 0xB7FAu16, 0x8799u16, 0x97B8u16, 0xE75Fu16, 0xF77Eu16, 0xC71Du16, 0xD73Cu16,
            0x26D3u16, 0x36F2u16, 0x0691u16, 0x16B0u16, 0x6657u16, 0x7676u16, 0x4615u16, 0x5634u16,
            0xD94Cu16, 0xC96Du16, 0xF90Eu16, 0xE92Fu16, 0x99C8u16, 0x89E9u16, 0xB98Au16, 0xA9ABu16,
            0x5844u16, 0x4865u16, 0x7806u16, 0x6827u16, 0x18C0u16, 0x08E1u16, 0x3882u16, 0x28A3u16,
            0xCB7Du16, 0xDB5Cu16, 0xEB3Fu16, 0xFB1Eu16, 0x8BF9u16, 0x9BD8u16, 0xABBBu16, 0xBB9Au16,
            0x4A75u16, 0x5A54u16, 0x6A37u16, 0x7A16u16, 0x0AF1u16, 0x1AD0u16, 0x2AB3u16, 0x3A92u16,
            0xFD2Eu16, 0xED0Fu16, 0xDD6Cu16, 0xCD4Du16, 0xBDAAu16, 0xAD8Bu16, 0x9DE8u16, 0x8DC9u16,
            0x7C26u16, 0x6C07u16, 0x5C64u16, 0x4C45u16, 0x3CA2u16, 0x2C83u16, 0x1CE0u16, 0x0CC1u16,
            0xEF1Fu16, 0xFF3Eu16, 0xCF5Du16, 0xDF7Cu16, 0xAF9Bu16, 0xBFBAu16, 0x8FD9u16, 0x9FF8u16,
            0x6E17u16, 0x7E36u16, 0x4E55u16, 0x5E74u16, 0x2E93u16, 0x3EB2u16, 0x0ED1u16, 0x1EF0u16
        ],
        [
            0x0000u16, 0x3331u16, 0x6662u16, 0x5553u16, 0xCCC4u16, 0xFFF5u16, 0xAAA6u16, 0x9997u16,
            0x89A9u16, 0xBA98u16, 0xEFCBu16, 0xDCFAu16, 0x456Du16, 0x765Cu16, 0x230Fu16, 0x103Eu16,
            0x0373u16, 0x3042u16, 0x6511u16, 0x5620u16, 0xCFB7u16, 0xFC86u16, 0xA9D5u16, 0x9AE4u16,
            0x8ADAu16, 0xB9EBu16, 0xECB8u16, 0xDF89u16, 0x461Eu16, 0x752Fu16, 0x207Cu16, 0x134Du16,
            0x06E6u16, 0x35D7u16, 0x6084u16, 0x53B5u16, 0xCA22u16, 0xF913u16, 0xAC40u16, 0x9F71u16,
            0x8F4Fu16, 0xBC7Eu16, 0xE92Du16, 0xDA1Cu16, 0x438Bu16, 0x70BAu16, 0x25E9u16, 0x16D8u16,
            0x0595u16, 0x36A4u16, 0x63F7u16, 0x50C6u16, 0xC951u16, 0xFA60u16, 0xAF33u16, 0x9C02u16,
            0x8C3Cu16, 0xBF0Du16, 0xEA5Eu16, 0xD96Fu16, 0x40F8u16, 0x73C9u16, 0x269Au16, 0x15ABu16,
            0x0DCCu16, 0x3EFDu16, 0x6BAEu16, 0x589Fu16, 0xC108u16, 0xF239u16, 0xA76Au16, 0x945Bu16,
            0x8465u16, 0xB754u16, 0xE207u16, 0xD136u16, 0x48A1u16, 0x7B90u16, 0x2EC3u16, 0x1DF2u16,
            0x0EBFu16, 0x3D8Eu16, 0x68DDu16, 0x5BECu16, 0xC27Bu16, 0xF14Au16, 0xA419u16, 0x9728u16,
            0x8716u16, 0xB427u16, 0xE174u16, 0xD245u16, 0x4BD2u16, 0x78E3u16, 0x2DB0u16, 0x1E81u16,
            0x0B2Au16, 0x381Bu16, 0x6D48u16, 0x5E79u16, 0xC7EEu16, 0xF4DFu16, 0xA18Cu16, 0x92BDu16,
            0x8283u16, 0xB1B2u16, 0xE4E1u16, 0xD7D0u16, 0x4E47u16, 0x7D76u16, 0x2825u16, 0x1B14u16,
            0x0859u16, 0x3B68u16, 0x6E3Bu16, 0x5D0Au16, 0xC49Du16, 0xF7ACu16, 0xA2FFu16, 0x91CEu16,
            0x81F0u16, 0xB2C1u16, 0xE792u16, 0xD4A3u16, 0x4D34u16, 0x7E05u16, 0x2B56u16, 0x1867u16,
            0x1B98u16, 0x28A9u16, 0x7DFAu16, 0x4ECBu16, 0xD75Cu16, 0xE46Du16, 0xB13Eu16, 0x820Fu16,
            0x9231u16, 0xA100u16, 0xF453u16, 0xC762u16, 0x5EF5u16, 0x6DC4u16, 0x3897u16, 0x0BA6u16,
            0x18EBu16, 0x2BDAu16, 0x7E89u16, 0x4DB8u16, 0xD42Fu16, 0xE71Eu16, 0xB24Du16, 0x817Cu16,
            0x9142u16, 0xA273u16, 0xF720u16, 0xC411u16, 0x5D86u16, 0x6EB7u16, 0x3BE4u16, 0x08D5u16,
            0x1D7Eu16, 0x2E4Fu16, 0x7B1Cu16, 0x482Du16, 0xD1BAu16, 0xE28Bu16, 0xB7D8u16, 0x84E9u16,
            0x94D7u16, 0xA7E6u16, 0xF2B5u16, 0xC184u16, 0x5813u16, 0x6B22u16, 0x3E71u16, 0x0D40u16,
            0x1E0Du16, 0x2D3Cu16, 0x786Fu16, 0x4B5Eu16, 0xD2C9u16, 0xE1F8u16, 0xB4ABu16, 0x879Au16,
            0x97A4u16, 0xA495u16, 0xF1C6u16, 0xC2F7u16, 0x5B60u16, 0x6851u16, 0x3D02u16, 0x0E33u16,
            0x1654u16, 0x2565u16, 0x7036u16, 0x4307u16, 0xDA90u16, 0xE9A1u16, 0xBCF2u16, 0x8FC3u16,
            0x9FFDu16, 0xACCCu16, 0xF99Fu16, 0xCAAEu16, 0x5339u16, 0x6008u16, 0x355Bu16, 0x066Au16,
            0x1527u16, 0x2616u16, 0x7345u16, 0x4074u16, 0xD9E3u16, 0xEAD2u16, 0xBF81u16, 0x8CB0u16,
            0x9C8Eu16, 0xAFBFu16, 0xFAECu16, 0xC9DDu16, 0x504Au16, 0x637Bu16, 0x3628u16, 0x0519u16,
            0x10B2u16, 0x2383u16, 0x76D0u16, 0x45E1u16, 0xDC76u16, 0xEF47u16, 0xBA14u16, 0x8925u16,
            0x991Bu16, 0xAA2Au16, 0xFF79u16, 0xCC48u16, 0x55DFu16, 0x66EEu16, 0x33BDu16, 0x008Cu16,
            0x13C1u16, 0x20F0u16, 0x75A3u16, 0x4692u16, 0xDF05u16, 0xEC34u16, 0xB967u16, 0x8A56u16,
            0x9A68u16, 0xA959u16, 0xFC0Au16, 0xCF3Bu16, 0x56ACu16, 0x659Du16, 0x30CEu16, 0x03FFu16
        ],
        [
            0x0000u16, 0x3730u16, 0x6E60u16, 0x5950u16, 0xDCC0u16, 0xEBF0u16, 0xB2A0u16, 0x8590u16,
            0xA9A1u16, 0x9E91u16, 0xC7C1u16, 0xF0F1u16, 0x7561u16, 0x4251u16, 0x1B01u16, 0x2C31u16,
            0x4363u16, 0x7453u16, 0x2D03u16, 0x1A33u16, 0x9FA3u16, 0xA893u16, 0xF1C3u16, 0xC6F3u16,
            0xEAC2u16, 0xDDF2u16, 0x84A2u16, 0xB392u16, 0x3602u16, 0x0132u16, 0x5862u16, 0x6F52u16,
            0x86C6u16, 0xB1F6u16, 0xE8A6u16, 0xDF96u16, 0x5A06u16, 0x6D36u16, 0x3466u16, 0x0356u16,
            0x2F67u16, 0x1857u16, 0x4107u16, 0x7637u16, 0xF3A7u16, 0xC497u16, 0x9DC7u16, 0xAAF7u16,
            0xC5A5u16, 0xF295u16, 0xABC5u16, 0x9CF5u16, 0x1965u16, 0x2E55u16, 0x7705u16, 0x4035u16,
            0x6C04u16, 0x5B34u16, 0x0264u16, 0x3554u16, 0xB0C4u16, 0x87F4u16, 0xDEA4u16, 0xE994u16,
            0x1DADu16, 0x2A9Du16, 0x73CDu16, 0x44FDu16, 0xC16Du16, 0xF65Du16, 0xAF0Du16, 0x983Du16,
            0xB40Cu16, 0x833Cu16, 0xDA6Cu16, 0xED5Cu16, 0x68CCu16, 0x5FFCu16, 0x06ACu16, 0x319Cu16,
            0x5ECEu16, 0x69FEu16, 0x30AEu16, 0x079Eu16, 0x820Eu16, 0xB53Eu16, 0xEC6Eu16, 0xDB5Eu16,
            0xF76Fu16, 0xC05Fu16, 0x990Fu16, 0xAE3Fu16, 0x2BAFu16, 0x1C9Fu16, 0x45CFu16, 0x72FFu16,
            0x9B6Bu16, 0xAC5Bu16, 0xF50Bu16, 0xC23Bu16, 0x47ABu16, 0x709Bu16, 0x29CBu16, 0x1EFBu16,
            0x32CAu16, 0x05FAu16, 0x5CAAu16, 0x6B9Au16, 0xEE0Au16, 0xD93Au16, 0x806Au16, 0xB75Au16,
            0xD808u16, 0xEF38u16, 0xB668u16, 0x8158u16, 0x04C8u16, 0x33F8u16, 0x6AA8u16, 0x5D98u16,
            0x71A9u16, 0x4699u16, 0x1FC9u16, 0x28F9u16, 0xAD69u16, 0x9A59u16, 0xC309u16, 0xF439u16,
            0x3B5Au16, 0x0C6Au16, 0x553Au16, 0x620Au16, 0xE79Au16, 0xD0AAu16, 0x89FAu16, 0xBECAu16,
            0x92FBu16, 0xA5CBu16, 0xFC9Bu16, 0xCBABu16, 0x4E3Bu16, 0x790Bu16, 0x205Bu16, 0x176Bu16,
            0x7839u16, 0x4F09u16, 0x1659u16, 0x2169u16, 0xA4F9u16, 0x93C9u16, 0xCA99u16, 0xFDA9u16,
            0xD198u16, 0xE6A8u16, 0xBFF8u16, 0x88C8u16, 0x0D58u16, 0x3A68u16, 0x6338u16, 0x5408u16,
            0xBD9Cu16, 0x8AACu16, 0xD3FCu16, 0xE4CCu16, 0x615Cu16, 0x566Cu16, 0x0F3Cu16, 0x380Cu16,
            0x143Du16, 0x230Du16, 0x7A5Du16, 0x4D6Du16, 0xC8FDu16, 0xFFCDu16, 0xA69Du16, 0x91ADu16,
            0xFEFFu16, 0xC9CFu16, 0x909Fu16, 0xA7AFu16, 0x223Fu16, 0x150Fu16, 0x4C5Fu16, 0x7B6Fu16,
            0x575Eu16, 0x606Eu16, 0x393Eu16, 0x0E0Eu16, 0x8B9Eu16, 0xBCAEu16, 0xE5FEu16, 0xD2CEu16,
            0x26F7u16, 0x11C7u16, 0x4897u16, 0x7FA7u16, 0xFA37u16, 0xCD07u16, 0x9457u16, 0xA367u16,
            0x8F56u16, 0xB866u16, 0xE136u16, 0xD606u16, 0x5396u16, 0x64A6u16, 0x3DF6u16, 0x0AC6u16,
            0x6594u16, 0x52A4u16, 0x0BF4u16, 0x3CC4u16, 0xB954u16, 0x8E64u16, 0xD734u16, 0xE004u16,
            0xCC35u16, 0xFB05u16, 0xA255u16, 0x9565u16, 0x10F5u16, 0x27C5u16, 0x7E95u16, 0x49A5u16,
            0xA031u16, 0x9701u16, 0xCE51u16, 0xF961u16, 0x7CF1u16, 0x4BC1u16, 0x1291u16, 0x25A1u16,
            0x0990u16, 0x3EA0u16, 0x67F0u16, 0x50C0u16, 0xD550u16, 0xE260u16, 0xBB30u16, 0x8C00u16,
            0xE352u16, 0xD462u16, 0x8D32u16, 0xBA02u16, 0x3F92u16, 0x08A2u16, 0x51F2u16, 0x66C2u16,
            0x4AF3u16, 0x7DC3u16, 0x2493u16, 0x13A3u16, 0x9633u16, 0xA103u16, 0xF853u16, 0xCF63u16
        ],
        [
            0x0000u16, 0x76B4u16, 0xED68u16, 0x9BDCu16, 0xCAF1u16, 0xBC45u16, 0x2799u16, 0x512Du16,
            0x85C3u16, 0xF377u16, 0x68ABu16, 0x1E1Fu16, 0x4F32u16, 0x3986u16, 0xA25Au16, 0xD4EEu16,
            0x1BA7u16, 0x6D13u16, 0xF6CFu16, 0x807Bu16, 0xD156u16, 0xA7E2u16, 0x3C3Eu16, 0x4A8Au16,
            0x9E64u16, 0xE8D0u16, 0x730Cu16, 0x05B8u16, 0x5495u16, 0x2221u16, 0xB9FDu16, 0xCF49u16,
            0x374Eu16, 0x41FAu16, 0xDA26u16, 0xAC92u16, 0xFDBFu16, 0x8B0Bu16, 0x10D7u16, 0x6663u16,
            0xB28Du16, 0xC439u16, 0x5FE5u16, 0x2951u16, 0x787Cu16, 0x0EC8u16, 0x9514u16, 0xE3A0u16,
            0x2CE9u16, 0x5A5Du16, 0xC181u16, 0xB735u16, 0xE618u16, 0x90ACu16, 0x0B70u16, 0x7DC4u16,
            0xA92Au16, 0xDF9Eu16, 0x4442u16, 0x32F6u16, 0x63DBu16, 0x156Fu16, 0x8EB3u16, 0xF807u16,
            0x6E9Cu16, 0x1828u16, 0x83F4u16, 0xF540u16, 0xA46Du16, 0xD2D9u16, 0x4905u16, 0x3FB1u16,
            0xEB5Fu16, 0x9DEBu16, 0x0637u16, 0x7083u16, 0x21AEu16, 0x571Au16, 0xCCC6u16, 0xBA72u16,
            0x753Bu16, 0x038Fu16, 0x9853u16, 0xEEE7u16, 0xBFCAu16, 0xC97Eu16, 0x52A2u16, 0x2416u16,
            0xF0F8u16, 0x864Cu16, 0x1D90u16, 0x6B24u16, 0x3A09u16, 0x4CBDu16, 0xD761u16, 0xA1D5u16,
            0x59D2u16, 0x2F66u16, 0xB4BAu16, 0xC20Eu16, 0x9323u16, 0xE597u16, 0x7E4Bu16, 0x08FFu16,
            0xDC11u16, 0xAAA5u16, 0x3179u16, 0x47CDu16, 0x16E0u16, 0x6054u16, 0xFB88u16, 0x8D3Cu16,
            0x4275u16, 0x34C1u16, 0xAF1Du16, 0xD9A9u16, 0x8884u16, 0xFE30u16, 0x65ECu16, 0x1358u16,
            0xC7B6u16, 0xB102u16, 0x2ADEu16, 0x5C6Au16, 0x0D47u16, 0x7BF3u16, 0xE02Fu16, 0x969Bu16,
            0xDD38u16, 0xAB8Cu16, 0x3050u16, 0x46E4u16, 0x17C9u16, 0x617Du16, 0xFAA1u16, 0x8C15u16,
            0x58FBu16, 0x2E4Fu16, 0xB593u16, 0xC327u16, 0x920Au16, 0xE4BEu16, 0x7F62u16, 0x09D6u16,
            0xC69Fu16, 0xB02Bu16, 0x2BF7u16, 0x5D43u16, 0x0C6Eu16, 0x7ADAu16, 0xE106u16, 0x97B2u16,
            0x435Cu16, 0x35E8u16, 0xAE34u16, 0xD880u16, 0x89ADu16, 0xFF19u16, 0x64C5u16, 0x1271u16,
            0xEA76u16, 0x9CC2u16, 0x071Eu16, 0x71AAu16, 0x2087u16, 0x5633u16, 0xCDEFu16, 0xBB5Bu16,
            0x6FB5u16, 0x1901u16, 0x82DDu16, 0xF469u16, 0xA544u16, 0xD3F0u16, 0x482Cu16, 0x3E98u16,
            0xF1D1u16, 0x8765u16, 0x1CB9u16, 0x6A0Du16, 0x3B20u16, 0x4D94u16, 0xD648u16, 0xA0FCu16,
            0x7412u16, 0x02A6u16, 0x997Au16, 0xEFCEu16, 0xBEE3u16, 0xC857u16, 0x538Bu16, 0x253Fu16,
            0xB3A4u16, 0xC510u16, 0x5ECCu16, 0x2878u16, 0x7955u16, 0x0FE1u16, 0x943Du16, 0xE289u16,
            0x3667u16, 0x40D3u16, 0xDB0Fu16, 0xADBBu16, 0xFC96u16, 0x8A22u16, 0x11FEu16, 0x674Au16,
            0xA803u16, 0xDEB7u16, 0x456Bu16, 0x33DFu16, 0x62F2u16, 0x1446u16, 0x8F9Au16, 0xF92Eu16,
            0x2DC0u16, 0x5B74u16, 0xC0A8u16, 0xB61Cu16, 0xE731u16, 0x9185u16, 0x0A59u16, 0x7CEDu16,
            0x84EAu16, 0xF25Eu16, 0x6982u16, 0x1F36u16, 0x4E1Bu16, 0x38AFu16, 0xA373u16, 0xD5C7u16,
            0x0129u16, 0x779Du16, 0xEC41u16, 0x9AF5u16, 0xCBD8u16, 0xBD6Cu16, 0x26B0u16, 0x5004u16,
            0x9F4Du16, 0xE9F9u16, 0x7225u16, 0x0491u16, 0x55BCu16, 0x2308u16, 0xB8D4u16, 0xCE60u16,
            0x1A8Eu16, 0x6C3Au16, 0xF7E6u16, 0x8152u16, 0xD07Fu16, 0xA6CBu16, 0x3D17u16, 0x4BA3u16
        ],
        [
            0x0000u16, 0xAA51u16, 0x4483u16, 0xEED2u16, 0x8906u16, 0x2357u16, 0xCD85u16, 0x67D4u16,
            0x022Du16, 0xA87Cu16, 0x46AEu16, 0xECFFu16, 0x8B2Bu16, 0x217Au16, 0xCFA8u16, 0x65F9u16,
            0x045Au16, 0xAE0Bu16, 0x40D9u16, 0xEA88u16, 0x8D5Cu16, 0x270Du16, 0xC9DFu16, 0x638Eu16,
            0x0677u16, 0xAC26u16, 0x42F4u16, 0xE8A5u16, 0x8F71u16, 0x2520u16, 0xCBF2u16, 0x61A3u16,
            0x08B4u16, 0xA2E5u16, 0x4C37u16, 0xE666u16, 0x81B2u16, 0x2BE3u16, 0xC531u16, 0x6F60u16,
            0x0A99u16, 0xA0C8u16, 0x4E1Au16, 0xE44Bu16, 0x839Fu16, 0x29CEu16, 0xC71Cu16, 0x6D4Du16,
            0x0CEEu16, 0xA6BFu16, 0x486Du16, 0xE23Cu16, 0x85E8u16, 0x2FB9u16, 0xC16Bu16, 0x6B3Au16,
            0x0EC3u16, 0xA492u16, 0x4A40u16, 0xE011u16, 0x87C5u16, 0x2D94u16, 0xC346u16, 0x6917u16,
            0x1168u16, 0xBB39u16, 0x55EBu16, 0xFFBAu16, 0x986Eu16, 0x323Fu16, 0xDCEDu16, 0x76BCu16,
            0x1345u16, 0xB914u16, 0x57C6u16, 0xFD97u16, 0x9A43u16, 0x3012u16, 0xDEC0u16, 0x7491u16,
            0x1532u16, 0xBF63u16, 0x51B1u16, 0xFBE0u16, 0x9C34u16, 0x3665u16, 0xD8B7u16, 0x72E6u16,
            0x171Fu16, 0xBD4Eu16, 0x539Cu16, 0xF9CDu16, 0x9E19u16, 0x3448u16, 0xDA9Au16, 0x70CBu16,
            0x19DCu16, 0xB38Du16, 0x5D5Fu16, 0xF70Eu16, 0x90DAu16, 0x3A8Bu16, 0xD459u16, 0x7E08u16,
            0x1BF1u16, 0xB1A0u16, 0x5F72u16, 0xF523u16, 0x92F7u16, 0x38A6u16, 0xD674u16, 0x7C25u16,
            0x1D86u16, 0xB7D7u16, 0x5905u16, 0xF354u16, 0x9480u16, 0x3ED1u16, 0xD003u16, 0x7A52u16,
            0x1FABu16, 0xB5FAu16, 0x5B28u16, 0xF179u16, 0x96ADu16, 0x3CFCu16, 0xD22Eu16, 0x787Fu16,
            0x22D0u16, 0x8881u16, 0x6653u16, 0xCC02u16, 0xABD6u16, 0x0187u16, 0xEF55u16, 0x4504u16,
            0x20FDu16, 0x8AACu16, 0x647Eu16, 0xCE2Fu16, 0xA9FBu16, 0x03AAu16, 0xED78u16, 0x4729u16,
            0x268Au16, 0x8CDBu16, 0x6209u16, 0xC858u16, 0xAF8Cu16, 0x05DDu16, 0xEB0Fu16, 0x415Eu16,
            0x24A7u16, 0x8EF6u16, 0x6024u16, 0xCA75u16, 0xADA1u16, 0x07F0u16, 0xE922u16, 0x4373u16,
            0x2A64u16, 0x8035u16, 0x6EE7u16, 0xC4B6u16, 0xA362u16, 0x0933u16, 0xE7E1u16, 0x4DB0u16,
            0x2849u16, 0x8218u16, 0x6CCAu16, 0xC69Bu16, 0xA14Fu16, 0x0B1Eu16, 0xE5CCu16, 0x4F9Du16,
            0x2E3Eu16, 0x846Fu16, 0x6ABDu16, 0xC0ECu16, 0xA738u16, 0x0D69u16, 0xE3BBu16, 0x49EAu16,
            0x2C13u16, 0x8642u16, 0x6890u16, 0xC2C1u16, 0xA515u16, 0x0F44u16, 0xE196u16, 0x4BC7u16,
            0x33B8u16, 0x99E9u16, 0x773Bu16, 0xDD6Au16, 0xBABEu16, 0x10EFu16, 0xFE3Du16, 0x546Cu16,
            0x3195u16, 0x9BC4u16, 0x7516u16, 0xDF47u16, 0xB893u16, 0x12C2u16, 0xFC10u16, 0x5641u16,
            0x37E2u16, 0x9DB3u16, 0x7361u16, 0xD930u16, 0xBEE4u16, 0x14B5u16, 0xFA67u16, 0x5036u16,
            0x35CFu16, 0x9F9Eu16, 0x714Cu16, 0xDB1Du16, 0xBCC9u16, 0x1698u16, 0xF84Au16, 0x521Bu16,
            0x3B0Cu16, 0x915Du16, 0x7F8Fu16, 0xD5DEu16, 0xB20Au16, 0x185Bu16, 0xF689u16, 0x5CD8u16,
            0x3921u16, 0x9370u16, 0x7DA2u16, 0xD7F3u16, 0xB027u16, 0x1A76u16, 0xF4A4u16, 0x5EF5u16,
            0x3F56u16, 0x9507u16, 0x7BD5u16, 0xD184u16, 0xB650u16, 0x1C01u16, 0xF2D3u16, 0x5882u16,
            0x3D7Bu16, 0x972Au16, 0x79F8u16, 0xD3A9u16, 0xB47Du16, 0x1E2Cu16, 0xF0FEu16, 0x5AAFu16
        ],
        [
            0x0000u16, 0x45A0u16, 0x8B40u16, 0xCEE0u16, 0x06A1u16, 0x4301u16, 0x8DE1u16, 0xC841u16,
            0x0D42u16, 0x48E2u16, 0x8602u16, 0xC3A2u16, 0x0BE3u16, 0x4E43u16, 0x80A3u16, 0xC503u16,
            0x1A84u16, 0x5F24u16, 0x91C4u16, 0xD464u16, 0x1C25u16, 0x5985u16, 0x9765u16, 0xD2C5u16,
            0x17C6u16, 0x5266u16, 0x9C86u16, 0xD926u16, 0x1167u16, 0x54C7u16, 0x9A27u16, 0xDF87u16,
            0x3508u16, 0x70A8u16, 0xBE48u16, 0xFBE8u16, 0x33A9u16, 0x7609u16, 0xB8E9u16, 0xFD49u16,
            0x384Au16, 0x7DEAu16, 0xB30Au16, 0xF6AAu16, 0x3EEBu16, 0x7B4Bu16, 0xB5ABu16, 0xF00Bu16,
            0x2F8Cu16, 0x6A2Cu16, 0xA4CCu16, 0xE16Cu16, 0x292Du16, 0x6C8Du16, 0xA26Du16, 0xE7CDu16,
            0x22CEu16, 0x676Eu16, 0xA98Eu16, 0xEC2Eu16, 0x246Fu16, 0x61CFu16, 0xAF2Fu16, 0xEA8Fu16,
            0x6A10u16, 0x2FB0u16, 0xE150u16, 0xA4F0u16, 0x6CB1u16, 0x2911u16, 0xE7F1u16, 0xA251u16,
            0x6752u16, 0x22F2u16, 0xEC12u16, 0xA9B2u16, 0x61F3u16, 0x2453u16, 0xEAB3u16, 0xAF13u16,
            0x7094u16, 0x3534u16, 0xFBD4u16, 0xBE74u16, 0x7635u16, 0x3395u16, 0xFD75u16, 0xB8D5u16,
            0x7DD6u16, 0x3876u16, 0xF696u16, 0xB336u16, 0x7B77u16, 0x3ED7u16, 0xF037u16, 0xB597u16,
            0x5F18u16, 0x1AB8u16, 0xD458u16, 0x91F8u16, 0x59B9u16, 0x1C19u16, 0xD2F9u16, 0x9759u16,
            0x525Au16, 0x17FAu16, 0xD91Au16, 0x9CBAu16, 0x54FBu16, 0x115Bu16, 0xDFBBu16, 0x9A1Bu16,
            0x459Cu16, 0x003Cu16, 0xCEDCu16, 0x8B7Cu16, 0x433Du16, 0x069Du16, 0xC87Du16, 0x8DDDu16,
            0x48DEu16, 0x0D7Eu16, 0xC39Eu16, 0x863Eu16, 0x4E7Fu16, 0x0BDFu16, 0xC53Fu16, 0x809Fu16,
            0xD420u16, 0x9180u16, 0x5F60u16, 0x1AC0u16, 0xD281u16, 0x9721u16, 0x59C1u16, 0x1C61u16,
            0xD962u16, 0x9CC2u16, 0x5222u16, 0x1782u16, 0xDFC3u16, 0x9A63u16, 0x5483u16, 0x1123u16,
            0xCEA4u16, 0x8B04u16, 0x45E4u16, 0x0044u16, 0xC805u16, 0x8DA5u16, 0x4345u16, 0x06E5u16,
            0xC3E6u16, 0x8646u16, 0x48A6u16, 0x0D06u16, 0xC547u16, 0x80E7u16, 0x4E07u16, 0x0BA7u16,
            0xE128u16, 0xA488u16, 0x6A68u16, 0x2FC8u16, 0xE789u16, 0xA229u16, 0x6CC9u16, 0x2969u16,
            0xEC6Au16, 0xA9CAu16, 0x672Au16, 0x228Au16, 0xEACBu16, 0xAF6Bu16, 0x618Bu16, 0x242Bu16,
            0xFBACu16, 0xBE0Cu16, 0x70ECu16, 0x354Cu16, 0xFD0Du16, 0xB8ADu16, 0x764Du16, 0x33EDu16,
            0xF6EEu16, 0xB34Eu16, 0x7DAEu16, 0x380Eu16, 0xF04Fu16, 0xB5EFu16, 0x7B0Fu16, 0x3EAFu16,
            0xBE30u16, 0xFB90u16, 0x3570u16, 0x70D0u16, 0xB891u16, 0xFD31u16, 0x33D1u16, 0x7671u16,
            0xB372u16, 0xF6D2u16, 0x3832u16, 0x7D92u16, 0xB5D3u16, 0xF073u16, 0x3E93u16, 0x7B33u16,
            0xA4B4u16, 0xE114u16, 0x2FF4u16, 0x6A54u16, 0xA215u16, 0xE7B5u16, 0x2955u16, 0x6CF5u16,
            0xA9F6u16, 0xEC56u16, 0x22B6u16, 0x6716u16, 0xAF57u16, 0xEAF7u16, 0x2417u16, 0x61B7u16,
            0x8B38u16, 0xCE98u16, 0x0078u16, 0x45D8u16, 0x8D99u16, 0xC839u16, 0x06D9u16, 0x4379u16,
            0x867Au16, 0xC3DAu16, 0x0D3Au16, 0x489Au16, 0x80DBu16, 0xC57Bu16, 0x0B9Bu16, 0x4E3Bu16,
            0x91BCu16, 0xD41Cu16, 0x1AFCu16, 0x5F5Cu16, 0x971Du16, 0xD2BDu16, 0x1C5Du16, 0x59FDu16,
            0x9CFEu16, 0xD95Eu16, 0x17BEu16, 0x521Eu16, 0x9A5Fu16, 0xDFFFu16, 0x111Fu16, 0x54BFu16
        ],
        [
            0x0000u16, 0xB861u16, 0x60E3u16, 0xD882u16, 0xC1C6u16, 0x79A7u16, 0xA125u16, 0x1944u16,
            0x93ADu16, 0x2BCCu16, 0xF34Eu16, 0x4B2Fu16, 0x526Bu16, 0xEA0Au16, 0x3288u16, 0x8AE9u16,
            0x377Bu16, 0x8F1Au16, 0x5798u16, 0xEFF9u16, 0xF6BDu16, 0x4EDCu16, 0x965Eu16, 0x2E3Fu16,
            0xA4D6u16, 0x1CB7u16, 0xC435u16, 0x7C54u16, 0x6510u16, 0xDD71u16, 0x05F3u16, 0xBD92u16,
            0x6EF6u16, 0xD697u16, 0x0E15u16, 0xB674u16, 0xAF30u16, 0x1751u16, 0xCFD3u16, 0x77B2u16,
            0xFD5Bu16, 0x453Au16, 0x9DB8u16, 0x25D9u16, 0x3C9Du16, 0x84FCu16, 0x5C7Eu16, 0xE41Fu16,
            0x598Du16, 0xE1ECu16, 0x396Eu16, 0x810Fu16, 0x984Bu16, 0x202Au16, 0xF8A8u16, 0x40C9u16,
            0xCA20u16, 0x7241u16, 0xAAC3u16, 0x12A2u16, 0x0BE6u16, 0xB387u16, 0x6B05u16, 0xD364u16,
            0xDDECu16, 0x658Du16, 0xBD0Fu16, 0x056Eu16, 0x1C2Au16, 0xA44Bu16, 0x7CC9u16, 0xC4A8u16,
            0x4E41u16, 0xF620u16, 0x2EA2u16, 0x96C3u16, 0x8F87u16, 0x37E6u16, 0xEF64u16, 0x5705u16,
            0xEA97u16, 0x52F6u16, 0x8A74u16, 0x3215u16, 0x2B51u16, 0x9330u16, 0x4BB2u16, 0xF3D3u16,
            0x793Au16, 0xC15Bu16, 0x19D9u16, 0xA1B8u16, 0xB8FCu16, 0x009Du16, 0xD81Fu16, 0x607Eu16,
            0xB31Au16, 0x0B7Bu16, 0xD3F9u16, 0x6B98u16, 0x72DCu16, 0xCABDu16, 0x123Fu16, 0xAA5Eu16,
            0x20B7u16, 0x98D6u16, 0x4054u16, 0xF835u16, 0xE171u16, 0x5910u16, 0x8192u16, 0x39F3u16,
            0x8461u16, 0x3C00u16, 0xE482u16, 0x5CE3u16, 0x45A7u16, 0xFDC6u16, 0x2544u16, 0x9D25u16,
            0x17CCu16, 0xAFADu16, 0x772Fu16, 0xCF4Eu16, 0xD60Au16, 0x6E6Bu16, 0xB6E9u16, 0x0E88u16,
            0xABF9u16, 0x1398u16, 0xCB1Au16, 0x737Bu16, 0x6A3Fu16, 0xD25Eu16, 0x0ADCu16, 0xB2BDu16,
            0x3854u16, 0x8035u16, 0x58B7u16, 0xE0D6u16, 0xF992u16, 0x41F3u16, 0x9971u16, 0x2110u16,
            0x9C82u16, 0x24E3u16, 0xFC61u16, 0x4400u16, 0x5D44u16, 0xE525u16, 0x3DA7u16, 0x85C6u16,
            0x0F2Fu16, 0xB74Eu16, 0x6FCCu16, 0xD7ADu16, 0xCEE9u16, 0x7688u16, 0xAE0Au16, 0x166Bu16,
            0xC50Fu16, 0x7D6Eu16, 0xA5ECu16, 0x1D8Du16, 0x04C9u16, 0xBCA8u16, 0x642Au16, 0xDC4Bu16,
            0x56A2u16, 0xEEC3u16, 0x3641u16, 0x8E20u16, 0x9764u16, 0x2F05u16, 0xF787u16, 0x4FE6u16,
            0xF274u16, 0x4A15u16, 0x9297u16, 0x2AF6u16, 0x33B2u16, 0x8BD3u16, 0x5351u16, 0xEB30u16,
            0x61D9u16, 0xD9B8u16, 0x013Au16, 0xB95Bu16, 0xA01Fu16, 0x187Eu16, 0xC0FCu16, 0x789Du16,
            0x7615u16, 0xCE74u16, 0x16F6u16, 0xAE97u16, 0xB7D3u16, 0x0FB2u16, 0xD730u16, 0x6F51u16,
            0xE5B8u16, 0x5DD9u16, 0x855Bu16, 0x3D3Au16, 0x247Eu16, 0x9C1Fu16, 0x449Du16, 0xFCFCu16,
            0x416Eu16, 0xF90Fu16, 0x218Du16, 0x99ECu16, 0x80A8u16, 0x38C9u16, 0xE04Bu16, 0x582Au16,
            0xD2C3u16, 0x6AA2u16, 0xB220u16, 0x0A41u16, 0x1305u16, 0xAB64u16, 0x73E6u16, 0xCB87u16,
            0x18E3u16, 0xA082u16, 0x7800u16, 0xC061u16, 0xD925u16, 0x6144u16, 0xB9C6u16, 0x01A7u16,
            0x8B4Eu16, 0x332Fu16, 0xEBADu16, 0x53CCu16, 0x4A88u16, 0xF2E9u16, 0x2A6Bu16, 0x920Au16,
            0x2F98u16, 0x97F9u16, 0x4F7Bu16, 0xF71Au16, 0xEE5Eu16, 0x563Fu16, 0x8EBDu16, 0x36DCu16,
            0xBC35u16, 0x0454u16, 0xDCD6u16, 0x64B7u16, 0x7DF3u16, 0xC592u16, 0x1D10u16, 0xA571u16
        ],
        [
            0x0000u16, 0x47D3u16, 0x8FA6u16, 0xC875u16, 0x0F6Du16, 0x48BEu16, 0x80CBu16, 0xC718u16,
            0x1EDAu16, 0x5909u16, 0x917Cu16, 0xD6AFu16, 0x11B7u16, 0x5664u16, 0x9E11u16, 0xD9C2u16,
            0x3DB4u16, 0x7A67u16, 0xB212u16, 0xF5C1u16, 0x32D9u16, 0x750Au16, 0xBD7Fu16, 0xFAACu16,
            0x236Eu16, 0x64BDu16, 0xACC8u16, 0xEB1Bu16, 0x2C03u16, 0x6BD0u16, 0xA3A5u16, 0xE476u16,
            0x7B68u16, 0x3CBBu16, 0xF4CEu16, 0xB31Du16, 0x7405u16, 0x33D6u16, 0xFBA3u16, 0xBC70u16,
            0x65B2u16, 0x2261u16, 0xEA14u16, 0xADC7u16, 0x6ADFu16, 0x2D0Cu16, 0xE579u16, 0xA2AAu16,
            0x46DCu16, 0x010Fu16, 0xC97Au16, 0x8EA9u16, 0x49B1u16, 0x0E62u16, 0xC617u16, 0x81C4u16,
            0x5806u16, 0x1FD5u16, 0xD7A0u16, 0x9073u16, 0x576Bu16, 0x10B8u16, 0xD8CDu16, 0x9F1Eu16,
            0xF6D0u16, 0xB103u16, 0x7976u16, 0x3EA5u16, 0xF9BDu16, 0xBE6Eu16, 0x761Bu16, 0x31C8u16,
            0xE80Au16, 0xAFD9u16, 0x67ACu16, 0x207Fu16, 0xE767u16, 0xA0B4u16, 0x68C1u16, 0x2F12u16,
            0xCB64u16, 0x8CB7u16, 0x44C2u16, 0x0311u16, 0xC409u16, 0x83DAu16, 0x4BAFu16, 0x0C7Cu16,
            0xD5BEu16, 0x926Du16, 0x5A18u16, 0x1DCBu16, 0xDAD3u16, 0x9D00u16, 0x5575u16, 0x12A6u16,
            0x8DB8u16, 0xCA6Bu16, 0x021Eu16, 0x45CDu16, 0x82D5u16, 0xC506u16, 0x0D73u16, 0x4AA0u16,
            0x9362u16, 0xD4B1u16, 0x1CC4u16, 0x5B17u16, 0x9C0Fu16, 0xDBDCu16, 0x13A9u16, 0x547Au16,
            0xB00Cu16, 0xF7DFu16, 0x3FAAu16, 0x7879u16, 0xBF61u16, 0xF8B2u16, 0x30C7u16, 0x7714u16,
            0xAED6u16, 0xE905u16, 0x2170u16, 0x66A3u16, 0xA1BBu16, 0xE668u16, 0x2E1Du16, 0x69CEu16,
            0xFD81u16, 0xBA52u16, 0x7227u16, 0x35F4u16, 0xF2ECu16, 0xB53Fu16, 0x7D4Au16, 0x3A99u16,
            0xE35Bu16, 0xA488u16, 0x6CFDu16, 0x2B2Eu16, 0xEC36u16, 0xABE5u16, 0x6390u16, 0x2443u16,
            0xC035u16, 0x87E6u16, 0x4F93u16, 0x0840u16, 0xCF58u16, 0x888Bu16, 0x40FEu16, 0x072Du16,
            0xDEEFu16, 0x993Cu16, 0x5149u16, 0x169Au16, 0xD182u16, 0x9651u16, 0x5E24u16, 0x19F7u16,
            0x86E9u16, 0xC13Au16, 0x094Fu16, 0x4E9Cu16, 0x8984u16, 0xCE57u16, 0x0622u16, 0x41F1u16,
            0x9833u16, 0xDFE0u16, 0x1795u16, 0x5046u16, 0x975Eu16, 0xD08Du16, 0x18F8u16, 0x5F2Bu16,
            0xBB5Du16, 0xFC8Eu16, 0x34FBu16, 0x7328u16, 0xB430u16, 0xF3E3u16, 0x3B96u16, 0x7C45u16,
            0xA587u16, 0xE254u16, 0x2A21u16, 0x6DF2u16, 0xAAEAu16, 0xED39u16, 0x254Cu16, 0x629Fu16,
            0x0B51u16, 0x4C82u16, 0x84F7u16, 0xC324u16, 0x043Cu16, 0x43EFu16, 0x8B9Au16, 0xCC49u16,
            0x158Bu16, 0x5258u16, 0x9A2Du16, 0xDDFEu16, 0x1AE6u16, 0x5D35u16, 0x9540u16, 0xD293u16,
            0x36E5u16, 0x7136u16, 0xB943u16, 0xFE90u16, 0x3988u16, 0x7E5Bu16, 0xB62Eu16, 0xF1FDu16,
            0x283Fu16, 0x6FECu16, 0xA799u16, 0xE04Au16, 0x2752u16, 0x6081u16, 0xA8F4u16, 0xEF27u16,
            0x7039u16, 0x37EAu16, 0xFF9Fu16, 0xB84Cu16, 0x7F54u16, 0x3887u16, 0xF0F2u16, 0xB721u16,
            0x6EE3u16, 0x2930u16, 0xE145u16, 0xA696u16, 0x618Eu16, 0x265Du16, 0xEE28u16, 0xA9FBu16,
            0x4D8Du16, 0x0A5Eu16, 0xC22Bu16, 0x85F8u16, 0x42E0u16, 0x0533u16, 0xCD46u16, 0x8A95u16,
            0x5357u16, 0x1484u16, 0xDCF1u16, 0x9B22u16, 0x5C3Au16, 0x1BE9u16, 0xD39Cu16, 0x944Fu16
        ],
        [
            0x0000u16, 0xEB23u16, 0xC667u16, 0x2D44u16, 0x9CEFu16, 0x77CCu16, 0x5A88u16, 0xB1ABu16,
            0x29FFu16, 0xC2DCu16, 0xEF98u16, 0x04BBu16, 0xB510u16, 0x5E33u16, 0x7377u16, 0x9854u16,
            0x53FEu16, 0xB8DDu16, 0x9599u16, 0x7EBAu16, 0xCF11u16, 0x2432u16, 0x0976u16, 0xE255u16,
            0x7A01u16, 0x9122u16, 0xBC66u16, 0x5745u16, 0xE6EEu16, 0x0DCDu16, 0x2089u16, 0xCBAAu16,
            0xA7FCu16, 0x4CDFu16, 0x619Bu16, 0x8AB8u16, 0x3B13u16, 0xD030u16, 0xFD74u16, 0x1657u16,
            0x8E03u16, 0x6520u16, 0x4864u16, 0xA347u16, 0x12ECu16, 0xF9CFu16, 0xD48Bu16, 0x3FA8u16,
            0xF402u16, 0x1F21u16, 0x3265u16, 0xD946u16, 0x68EDu16, 0x83CEu16, 0xAE8Au16, 0x45A9u16,
            0xDDFDu16, 0x36DEu16, 0x1B9Au16, 0xF0B9u16, 0x4112u16, 0xAA31u16, 0x8775u16, 0x6C56u16,
            0x5FD9u16, 0xB4FAu16, 0x99BEu16, 0x729Du16, 0xC336u16, 0x2815u16, 0x0551u16, 0xEE72u16,
            0x7626u16, 0x9D05u16, 0xB041u16, 0x5B62u16, 0xEAC9u16, 0x01EAu16, 0x2CAEu16, 0xC78Du16,
            0x0C27u16, 0xE704u16, 0xCA40u16, 0x2163u16, 0x90C8u16, 0x7BEBu16, 0x56AFu16, 0xBD8Cu16,
            0x25D8u16, 0xCEFBu16, 0xE3BFu16, 0x089Cu16, 0xB937u16, 0x5214u16, 0x7F50u16, 0x9473u16,
            0xF825u16, 0x1306u16, 0x3E42u16, 0xD561u16, 0x64CAu16, 0x8FE9u16, 0xA2ADu16, 0x498Eu16,
            0xD1DAu16, 0x3AF9u16, 0x17BDu16, 0xFC9Eu16, 0x4D35u16, 0xA616u16, 0x8B52u16, 0x6071u16,
            0xABDBu16, 0x40F8u16, 0x6DBCu16, 0x869Fu16, 0x3734u16, 0xDC17u16, 0xF153u16, 0x1A70u16,
            0x8224u16, 0x6907u16, 0x4443u16, 0xAF60u16, 0x1ECBu16, 0xF5E8u16, 0xD8ACu16, 0x338Fu16,
            0xBFB2u16, 0x5491u16, 0x79D5u16, 0x92F6u16, 0x235Du16, 0xC87Eu16, 0xE53Au16, 0x0E19u16,
            0x964Du16, 0x7D6Eu16, 0x502Au16, 0xBB09u16, 0x0AA2u16, 0xE181u16, 0xCCC5u16, 0x27E6u16,
            0xEC4Cu16, 0x076Fu16, 0x2A2Bu16, 0xC108u16, 0x70A3u16, 0x9B80u16, 0xB6C4u16, 0x5DE7u16,
            0xC5B3u16, 0x2E90u16, 0x03D4u16, 0xE8F7u16, 0x595Cu16, 0xB27Fu16, 0x9F3Bu16, 0x7418u16,
            0x184Eu16, 0xF36Du16, 0xDE29u16, 0x350Au16, 0x84A1u16, 0x6F82u16, 0x42C6u16, 0xA9E5u16,
            0x31B1u16, 0xDA92u16, 0xF7D6u16, 0x1CF5u16, 0xAD5Eu16, 0x467Du16, 0x6B39u16, 0x801Au16,
            0x4BB0u16, 0xA093u16, 0x8DD7u16, 0x66F4u16, 0xD75Fu16, 0x3C7Cu16, 0x1138u16, 0xFA1Bu16,
            0x624Fu16, 0x896Cu16, 0xA428u16, 0x4F0Bu16, 0xFEA0u16, 0x1583u16, 0x38C7u16, 0xD3E4u16,
            0xE06Bu16, 0x0B48u16, 0x260Cu16, 0xCD2Fu16, 0x7C84u16, 0x97A7u16, 0xBAE3u16, 0x51C0u16,
            0xC994u16, 0x22B7u16, 0x0FF3u16, 0xE4D0u16, 0x557Bu16, 0xBE58u16, 0x931Cu16, 0x783Fu16,
            0xB395u16, 0x58B6u16, 0x75F2u16, 0x9ED1u16, 0x2F7Au16, 0xC459u16, 0xE91Du16, 0x023Eu16,
            0x9A6Au16, 0x7149u16, 0x5C0Du16, 0xB72Eu16, 0x0685u16, 0xEDA6u16, 0xC0E2u16, 0x2BC1u16,
            0x4797u16, 0xACB4u16, 0x81F0u16, 0x6AD3u16, 0xDB78u16, 0x305Bu16, 0x1D1Fu16, 0xF63Cu16,
            0x6E68u16, 0x854Bu16, 0xA80Fu16, 0x432Cu16, 0xF287u16, 0x19A4u16, 0x34E0u16, 0xDFC3u16,
            0x1469u16, 0xFF4Au16, 0xD20Eu16, 0x392Du16, 0x8886u16, 0x63A5u16, 0x4EE1u16, 0xA5C2u16,
            0x3D96u16, 0xD6B5u16, 0xFBF1u16, 0x10D2u16, 0xA179u16, 0x4A5Au16, 0x671Eu16, 0x8C3Du16
        ],
        [
            0x0000u16, 0x6F45u16, 0xDE8Au16, 0xB1CFu16, 0xAD35u16, 0xC270u16, 0x73BFu16, 0x1CFAu16,
            0x4A4Bu16, 0x250Eu16, 0x94C1u16, 0xFB84u16, 0xE77Eu16, 0x883Bu16, 0x39F4u16, 0x56B1u16,
            0x9496u16, 0xFBD3u16, 0x4A1Cu16, 0x2559u16, 0x39A3u16, 0x56E6u16, 0xE729u16, 0x886Cu16,
            0xDEDDu16, 0xB198u16, 0x0057u16, 0x6F12u16, 0x73E8u16, 0x1CADu16, 0xAD62u16, 0xC227u16,
            0x390Du16, 0x5648u16, 0xE787u16, 0x88C2u16, 0x9438u16, 0xFB7Du16, 0x4AB2u16, 0x25F7u16,
            0x7346u16, 0x1C03u16, 0xADCCu16, 0xC289u16, 0xDE73u16, 0xB136u16, 0x00F9u16, 0x6FBCu16,
            0xAD9Bu16, 0xC2DEu16, 0x7311u16, 0x1C54u16, 0x00AEu16, 0x6FEBu16, 0xDE24u16, 0xB161u16,
            0xE7D0u16, 0x8895u16, 0x395Au16, 0x561Fu16, 0x4AE5u16, 0x25A0u16, 0x946Fu16, 0xFB2Au16,
            0x721Au16, 0x1D5Fu16, 0xAC90u16, 0xC3D5u16, 0xDF2Fu16, 0xB06Au16, 0x01A5u16, 0x6EE0u16,
            0x3851u16, 0x5714u16, 0xE6DBu16, 0x899Eu16, 0x9564u16, 0xFA21u16, 0x4BEEu16, 0x24ABu16,
            0xE68Cu16, 0x89C9u16, 0x3806u16, 0x5743u16, 0x4BB9u16, 0x24FCu16, 0x9533u16, 0xFA76u16,
            0xACC7u16, 0xC382u16, 0x724Du16, 0x1D08u16, 0x01F2u16, 0x6EB7u16, 0xDF78u16, 0xB03Du16,
            0x4B17u16, 0x2452u16, 0x959Du16, 0xFAD8u16, 0xE622u16, 0x8967u16, 0x38A8u16, 0x57EDu16,
            0x015Cu16, 0x6E19u16, 0xDFD6u16, 0xB093u16, 0xAC69u16, 0xC32Cu16, 0x72E3u16, 0x1DA6u16,
            0xDF81u16, 0xB0C4u16, 0x010Bu16, 0x6E4Eu16, 0x72B4u16, 0x1DF1u16, 0xAC3Eu16, 0xC37Bu16,
            0x95CAu16, 0xFA8Fu16, 0x4B40u16, 0x2405u16, 0x38FFu16, 0x57BAu16, 0xE675u16, 0x8930u16,
            0xE434u16, 0x8B71u16, 0x3ABEu16, 0x55FBu16, 0x4901u16, 0x2644u16, 0x978Bu16, 0xF8CEu16,
            0xAE7Fu16, 0xC13Au16, 0x70F5u16, 0x1FB0u16, 0x034Au16, 0x6C0Fu16, 0xDDC0u16, 0xB285u16,
            0x70A2u16, 0x1FE7u16, 0xAE28u16, 0xC16Du16, 0xDD97u16, 0xB2D2u16, 0x031Du16, 0x6C58u16,
            0x3AE9u16, 0x55ACu16, 0xE463u16, 0x8B26u16, 0x97DCu16, 0xF899u16, 0x4956u16, 0x2613u16,
            0xDD39u16, 0xB27Cu16, 0x03B3u16, 0x6CF6u16, 0x700Cu16, 0x1F49u16, 0xAE86u16, 0xC1C3u16,
            0x9772u16, 0xF837u16, 0x49F8u16, 0x26BDu16, 0x3A47u16, 0x5502u16, 0xE4CDu16, 0x8B88u16,
            0x49AFu16, 0x26EAu16, 0x9725u16, 0xF860u16, 0xE49Au16, 0x8BDFu16, 0x3A10u16, 0x5555u16,
            0x03E4u16, 0x6CA1u16, 0xDD6Eu16, 0xB22Bu16, 0xAED1u16, 0xC194u16, 0x705Bu16, 0x1F1Eu16,
            0x962Eu16, 0xF96Bu16, 0x48A4u16, 0x27E1u16, 0x3B1Bu16, 0x545Eu16, 0xE591u16, 0x8AD4u16,
            0xDC65u16, 0xB320u16, 0x02EFu16, 0x6DAAu16, 0x7150u16, 0x1E15u16, 0xAFDAu16, 0xC09Fu16,
            0x02B8u16, 0x6DFDu16, 0xDC32u16, 0xB377u16, 0xAF8Du16, 0xC0C8u16, 0x7107u16, 0x1E42u16,
            0x48F3u16, 0x27B6u16, 0x9679u16, 0xF93Cu16, 0xE5C6u16, 0x8A83u16, 0x3B4Cu16, 0x5409u16,
            0xAF23u16, 0xC066u16, 0x71A9u16, 0x1EECu16, 0x0216u16, 0x6D53u16, 0xDC9Cu16, 0xB3D9u16,
            0xE568u16, 0x8A2Du16, 0x3BE2u16, 0x54A7u16, 0x485Du16, 0x2718u16, 0x96D7u16, 0xF992u16,
            0x3BB5u16, 0x54F0u16, 0xE53Fu16, 0x8A7Au16, 0x9680u16, 0xF9C5u16, 0x480Au16, 0x274Fu16,
            0x71FEu16, 0x1EBBu16, 0xAF74u16, 0xC031u16, 0xDCCBu16, 0xB38Eu16, 0x0241u16, 0x6D04u16
        ],
        [
            0x0000u16, 0xD849u16, 0xA0B3u16, 0x78FAu16, 0x5147u16, 0x890Eu16, 0xF1F4u16, 0x29BDu16,
            0xA28Eu16, 0x7AC7u16, 0x023Du16, 0xDA74u16, 0xF3C9u16, 0x2B80u16, 0x537Au16, 0x8B33u16,
            0x553Du16, 0x8D74u16, 0xF58Eu16, 0x2DC7u16, 0x047Au16, 0xDC33u16, 0xA4C9u16, 0x7C80u16,
            0xF7B3u16, 0x2FFAu16, 0x5700u16, 0x8F49u16, 0xA6F4u16, 0x7EBDu16, 0x0647u16, 0xDE0Eu16,
            0xAA7Au16, 0x7233u16, 0x0AC9u16, 0xD280u16, 0xFB3Du16, 0x2374u16, 0x5B8Eu16, 0x83C7u16,
            0x08F4u16, 0xD0BDu16, 0xA847u16, 0x700Eu16, 0x59B3u16, 0x81FAu16, 0xF900u16, 0x2149u16,
            0xFF47u16, 0x270Eu16, 0x5FF4u16, 0x87BDu16, 0xAE00u16, 0x7649u16, 0x0EB3u16, 0xD6FAu16,
            0x5DC9u16, 0x8580u16, 0xFD7Au16, 0x2533u16, 0x0C8Eu16, 0xD4C7u16, 0xAC3Du16, 0x7474u16,
            0x44D5u16, 0x9C9Cu16, 0xE466u16, 0x3C2Fu16, 0x1592u16, 0xCDDBu16, 0xB521u16, 0x6D68u16,
            0xE65Bu16, 0x3E12u16, 0x46E8u16, 0x9EA1u16, 0xB71Cu16, 0x6F55u16, 0x17AFu16, 0xCFE6u16,
            0x11E8u16, 0xC9A1u16, 0xB15Bu16, 0x6912u16, 0x40AFu16, 0x98E6u16, 0xE01Cu16, 0x3855u16,
            0xB366u16, 0x6B2Fu16, 0x13D5u16, 0xCB9Cu16, 0xE221u16, 0x3A68u16, 0x4292u16, 0x9ADBu16,
            0xEEAFu16, 0x36E6u16, 0x4E1Cu16, 0x9655u16, 0xBFE8u16, 0x67A1u16, 0x1F5Bu16, 0xC712u16,
            0x4C21u16, 0x9468u16, 0xEC92u16, 0x34DBu16, 0x1D66u16, 0xC52Fu16, 0xBDD5u16, 0x659Cu16,
            0xBB92u16, 0x63DBu16, 0x1B21u16, 0xC368u16, 0xEAD5u16, 0x329Cu16, 0x4A66u16, 0x922Fu16,
            0x191Cu16, 0xC155u16, 0xB9AFu16, 0x61E6u16, 0x485Bu16, 0x9012u16, 0xE8E8u16, 0x30A1u16,
            0x89AAu16, 0x51E3u16, 0x2919u16, 0xF150u16, 0xD8EDu16, 0x00A4u16, 0x785Eu16, 0xA017u16,
            0x2B24u16, 0xF36Du16, 0x8B97u16, 0x53DEu16, 0x7A63u16, 0xA22Au16, 0xDAD0u16, 0x0299u16,
            0xDC97u16, 0x04DEu16, 0x7C24u16, 0xA46Du16, 0x8DD0u16, 0x5599u16, 0x2D63u16, 0xF52Au16,
            0x7E19u16, 0xA650u16, 0xDEAAu16, 0x06E3u16, 0x2F5Eu16, 0xF717u16, 0x8FEDu16, 0x57A4u16,
            0x23D0u16, 0xFB99u16, 0x8363u16, 0x5B2Au16, 0x7297u16, 0xAADEu16, 0xD224u16, 0x0A6Du16,
            0x815Eu16, 0x5917u16, 0x21EDu16, 0xF9A4u16, 0xD019u16, 0x0850u16, 0x70AAu16, 0xA8E3u16,
            0x76EDu16, 0xAEA4u16, 0xD65Eu16, 0x0E17u16, 0x27AAu16, 0xFFE3u16, 0x8719u16, 0x5F50u16,
            0xD463u16, 0x0C2Au16, 0x74D0u16, 0xAC99u16, 0x8524u16, 0x5D6Du16, 0x2597u16, 0xFDDEu16,
            0xCD7Fu16, 0x1536u16, 0x6DCCu16, 0xB585u16, 0x9C38u16, 0x4471u16, 0x3C8Bu16, 0xE4C2u16,
            0x6FF1u16, 0xB7B8u16, 0xCF42u16, 0x170Bu16, 0x3EB6u16, 0xE6FFu16, 0x9E05u16, 0x464Cu16,
            0x9842u16, 0x400Bu16, 0x38F1u16, 0xE0B8u16, 0xC905u16, 0x114Cu16, 0x69B6u16, 0xB1FFu16,
            0x3ACCu16, 0xE285u16, 0x9A7Fu16, 0x4236u16, 0x6B8Bu16, 0xB3C2u16, 0xCB38u16, 0x1371u16,
            0x6705u16, 0xBF4Cu16, 0xC7B6u16, 0x1FFFu16, 0x3642u16, 0xEE0Bu16, 0x96F1u16, 0x4EB8u16,
            0xC58Bu16, 0x1DC2u16, 0x6538u16, 0xBD71u16, 0x94CCu16, 0x4C85u16, 0x347Fu16, 0xEC36u16,
            0x3238u16, 0xEA71u16, 0x928Bu16, 0x4AC2u16, 0x637Fu16, 0xBB36u16, 0xC3CCu16, 0x1B85u16,
            0x90B6u16, 0x48FFu16, 0x3005u16, 0xE84Cu16, 0xC1F1u16, 0x19B8u16, 0x6142u16, 0xB90Bu16
        ],
        [
            0x0000u16, 0x0375u16, 0x06EAu16, 0x059Fu16, 0x0DD4u16, 0x0EA1u16, 0x0B3Eu16, 0x084Bu16,
            0x1BA8u16, 0x18DDu16, 0x1D42u16, 0x1E37u16, 0x167Cu16, 0x1509u16, 0x1096u16, 0x13E3u16,
            0x3750u16, 0x3425u16, 0x31BAu16, 0x32CFu16, 0x3A84u16, 0x39F1u16, 0x3C6Eu16, 0x3F1Bu16,
            0x2CF8u16, 0x2F8Du16, 0x2A12u16, 0x2967u16, 0x212Cu16, 0x2259u16, 0x27C6u16, 0x24B3u16,
            0x6EA0u16, 0x6DD5u16, 0x684Au16, 0x6B3Fu16, 0x6374u16, 0x6001u16, 0x659Eu16, 0x66EBu16,
            0x7508u16, 0x767Du16, 0x73E2u16, 0x7097u16, 0x78DCu16, 0x7BA9u16, 0x7E36u16, 0x7D43u16,
            0x59F0u16, 0x5A85u16, 0x5F1Au16, 0x5C6Fu16, 0x5424u16, 0x5751u16, 0x52CEu16, 0x51BBu16,
            0x4258u16, 0x412Du16, 0x44B2u16, 0x47C7u16, 0x4F8Cu16, 0x4CF9u16, 0x4966u16, 0x4A13u16,
            0xDD40u16, 0xDE35u16, 0xDBAAu16, 0xD8DFu16, 0xD094u16, 0xD3E1u16, 0xD67Eu16, 0xD50Bu16,
            0xC6E8u16, 0xC59Du16, 0xC002u16, 0xC377u16, 0xCB3Cu16, 0xC849u16, 0xCDD6u16, 0xCEA3u16,
            0xEA10u16, 0xE965u16, 0xECFAu16, 0xEF8Fu16, 0xE7C4u16, 0xE4B1u16, 0xE12Eu16, 0xE25Bu16,
            0xF1B8u16, 0xF2CDu16, 0xF752u16, 0xF427u16, 0xFC6Cu16, 0xFF19u16, 0xFA86u16, 0xF9F3u16,
            0xB3E0u16, 0xB095u16, 0xB50Au16, 0xB67Fu16, 0xBE34u16, 0xBD41u16, 0xB8DEu16, 0xBBABu16,
            0xA848u16, 0xAB3Du16, 0xAEA2u16, 0xADD7u16, 0xA59Cu16, 0xA6E9u16, 0xA376u16, 0xA003u16,
            0x84B0u16, 0x87C5u16, 0x825Au16, 0x812Fu16, 0x8964u16, 0x8A11u16, 0x8F8Eu16, 0x8CFBu16,
            0x9F18u16, 0x9C6Du16, 0x99F2u16, 0x9A87u16, 0x92CCu16, 0x91B9u16, 0x9426u16, 0x9753u16,
            0xAAA1u16, 0xA9D4u16, 0xAC4Bu16, 0xAF3Eu16, 0xA775u16, 0xA400u16, 0xA19Fu16, 0xA2EAu16,
            0xB109u16, 0xB27Cu16, 0xB7E3u16, 0xB496u16, 0xBCDDu16, 0xBFA8u16, 0xBA37u16, 0xB942u16,
            0x9DF1u16, 0x9E84u16, 0x9B1Bu16, 0x986Eu16, 0x9025u16, 0x9350u16, 0x96CFu16, 0x95BAu16,
            0x8659u16, 0x852Cu16, 0x80B3u16, 0x83C6u16, 0x8B8Du16, 0x88F8u16, 0x8D67u16, 0x8E12u16,
            0xC401u16, 0xC774u16, 0xC2EBu16, 0xC19Eu16, 0xC9D5u16, 0xCAA0u16, 0xCF3Fu16, 0xCC4Au16,
            0xDFA9u16, 0xDCDCu16, 0xD943u16, 0xDA36u16, 0xD27Du16, 0xD108u16, 0xD497u16, 0xD7E2u16,
            0xF351u16, 0xF024u16, 0xF5BBu16, 0xF6CEu16, 0xFE85u16, 0xFDF0u16, 0xF86Fu16, 0xFB1Au16,
            0xE8F9u16, 0xEB8Cu16, 0xEE13u16, 0xED66u16, 0xE52Du16, 0xE658u16, 0xE3C7u16, 0xE0B2u16,
            0x77E1u16, 0x7494u16, 0x710Bu16, 0x727Eu16, 0x7A35u16, 0x7940u16, 0x7CDFu16, 0x7FAAu16,
            0x6C49u16, 0x6F3Cu16, 0x6AA3u16, 0x69D6u16, 0x619Du16, 0x62E8u16, 0x6777u16, 0x6402u16,
            0x40B1u16, 0x43C4u16, 0x465Bu16, 0x452Eu16, 0x4D65u16, 0x4E10u16, 0x4B8Fu16, 0x48FAu16,
            0x5B19u16, 0x586Cu16, 0x5DF3u16, 0x5E86u16, 0x56CDu16, 0x55B8u16, 0x5027u16, 0x5352u16,
            0x1941u16, 0x1A34u16, 0x1FABu16, 0x1CDEu16, 0x1495u16, 0x17E0u16, 0x127Fu16, 0x110Au16,
            0x02E9u16, 0x019Cu16, 0x0403u16, 0x0776u16, 0x0F3Du16, 0x0C48u16, 0x09D7u16, 0x0AA2u16,
            0x2E11u16, 0x2D64u16, 0x28FBu16, 0x2B8Eu16, 0x23C5u16, 0x20B0u16, 0x252Fu16, 0x265Au16,
            0x35B9u16, 0x36CCu16, 0x3353u16, 0x3026u16, 0x386Du16, 0x3B18u16, 0x3E87u16, 0x3DF2u16
        ],
        [
            0x0000u16, 0x4563u16, 0x8AC6u16, 0xCFA5u16, 0x05ADu16, 0x40CEu16, 0x8F6Bu16, 0xCA08u16,
            0x0B5Au16, 0x4E39u16, 0x819Cu16, 0xC4FFu16, 0x0EF7u16, 0x4B94u16, 0x8431u16, 0xC152u16,
            0x16B4u16, 0x53D7u16, 0x9C72u16, 0xD911u16, 0x1319u16, 0x567Au16, 0x99DFu16, 0xDCBCu16,
            0x1DEEu16, 0x588Du16, 0x9728u16, 0xD24Bu16, 0x1843u16, 0x5D20u16, 0x9285u16, 0xD7E6u16,
            0x2D68u16, 0x680Bu16, 0xA7AEu16, 0xE2CDu16, 0x28C5u16, 0x6DA6u16, 0xA203u16, 0xE760u16,
            0x2632u16, 0x6351u16, 0xACF4u16, 0xE997u16, 0x239Fu16, 0x66FCu16, 0xA959u16, 0xEC3Au16,
            0x3BDCu16, 0x7EBFu16, 0xB11Au16, 0xF479u16, 0x3E71u16, 0x7B12u16, 0xB4B7u16, 0xF1D4u16,
            0x3086u16, 0x75E5u16, 0xBA40u16, 0xFF23u16, 0x352Bu16, 0x7048u16, 0xBFEDu16, 0xFA8Eu16,
            0x5AD0u16, 0x1FB3u16, 0xD016u16, 0x9575u16, 0x5F7Du16, 0x1A1Eu16, 0xD5BBu16, 0x90D8u16,
            0x518Au16, 0x14E9u16, 0xDB4Cu16, 0x9E2Fu16, 0x5427u16, 0x1144u16, 0xDEE1u16, 0x9B82u16,
            0x4C64u16, 0x0907u16, 0xC6A2u16, 0x83C1u16, 0x49C9u16, 0x0CAAu16, 0xC30Fu16, 0x866Cu16,
            0x473Eu16, 0x025Du16, 0xCDF8u16, 0x889Bu16, 0x4293u16, 0x07F0u16, 0xC855u16, 0x8D36u16,
            0x77B8u16, 0x32DBu16, 0xFD7Eu16, 0xB81Du16, 0x7215u16, 0x3776u16, 0xF8D3u16, 0xBDB0u16,
            0x7CE2u16, 0x3981u16, 0xF624u16, 0xB347u16, 0x794Fu16, 0x3C2Cu16, 0xF389u16, 0xB6EAu16,
            0x610Cu16, 0x246Fu16, 0xEBCAu16, 0xAEA9u16, 0x64A1u16, 0x21C2u16, 0xEE67u16, 0xAB04u16,
            0x6A56u16, 0x2F35u16, 0xE090u16, 0xA5F3u16, 0x6FFBu16, 0x2A98u16, 0xE53Du16, 0xA05Eu16,
            0xB5A0u16, 0xF0C3u16, 0x3F66u16, 0x7A05u16, 0xB00Du16, 0xF56Eu16, 0x3ACBu16, 0x7FA8u16,
            0xBEFAu16, 0xFB99u16, 0x343Cu16, 0x715Fu16, 0xBB57u16, 0xFE34u16, 0x3191u16, 0x74F2u16,
            0xA314u16, 0xE677u16, 0x29D2u16, 0x6CB1u16, 0xA6B9u16, 0xE3DAu16, 0x2C7Fu16, 0x691Cu16,
            0xA84Eu16, 0xED2Du16, 0x2288u16, 0x67EBu16, 0xADE3u16, 0xE880u16, 0x2725u16, 0x6246u16,
            0x98C8u16, 0xDDABu16, 0x120Eu16, 0x576Du16, 0x9D65u16, 0xD806u16, 0x17A3u16, 0x52C0u16,
            0x9392u16, 0xD6F1u16, 0x1954u16, 0x5C37u16, 0x963Fu16, 0xD35Cu16, 0x1CF9u16, 0x599Au16,
            0x8E7Cu16, 0xCB1Fu16, 0x04BAu16, 0x41D9u16, 0x8BD1u16, 0xCEB2u16, 0x0117u16, 0x4474u16,
            0x8526u16, 0xC045u16, 0x0FE0u16, 0x4A83u16, 0x808Bu16, 0xC5E8u16, 0x0A4Du16, 0x4F2Eu16,
            0xEF70u16, 0xAA13u16, 0x65B6u16, 0x20D5u16, 0xEADDu16, 0xAFBEu16, 0x601Bu16, 0x2578u16,
            0xE42Au16, 0xA149u16, 0x6EECu16, 0x2B8Fu16, 0xE187u16, 0xA4E4u16, 0x6B41u16, 0x2E22u16,
            0xF9C4u16, 0xBCA7u16, 0x7302u16, 0x3661u16, 0xFC69u16, 0xB90Au16, 0x76AFu16, 0x33CCu16,
            0xF29Eu16, 0xB7FDu16, 0x7858u16, 0x3D3Bu16, 0xF733u16, 0xB250u16, 0x7DF5u16, 0x3896u16,
            0xC218u16, 0x877Bu16, 0x48DEu16, 0x0DBDu16, 0xC7B5u16, 0x82D6u16, 0x4D73u16, 0x0810u16,
            0xC942u16, 0x8C21u16, 0x4384u16, 0x06E7u16, 0xCCEFu16, 0x898Cu16, 0x4629u16, 0x034Au16,
            0xD4ACu16, 0x91CFu16, 0x5E6Au16, 0x1B09u16, 0xD101u16, 0x9462u16, 0x5BC7u16, 0x1EA4u16,
            0xDFF6u16, 0x9A95u16, 0x5530u16, 0x1053u16, 0xDA5Bu16, 0x9F38u16, 0x509Du16, 0x15FEu16
        ],
        [
            0x0000u16, 0x7B61u16, 0xF6C2u16, 0x8DA3u16, 0xFDA5u16, 0x86C4u16, 0x0B67u16, 0x7006u16,
            0xEB6Bu16, 0x900Au16, 0x1DA9u16, 0x66C8u16, 0x16CEu16, 0x6DAFu16, 0xE00Cu16, 0x9B6Du16,
            0xC6F7u16, 0xBD96u16, 0x3035u16, 0x4B54u16, 0x3B52u16, 0x4033u16, 0xCD90u16, 0xB6F1u16,
            0x2D9Cu16, 0x56FDu16, 0xDB5Eu16, 0xA03Fu16, 0xD039u16, 0xAB58u16, 0x26FBu16, 0x5D9Au16,
            0x9DCFu16, 0xE6AEu16, 0x6B0Du16, 0x106Cu16, 0x606Au16, 0x1B0Bu16, 0x96A8u16, 0xEDC9u16,
            0x76A4u16, 0x0DC5u16, 0x8066u16, 0xFB07u16, 0x8B01u16, 0xF060u16, 0x7DC3u16, 0x06A2u16,
            0x5B38u16, 0x2059u16, 0xADFAu16, 0xD69Bu16, 0xA69Du16, 0xDDFCu16, 0x505Fu16, 0x2B3Eu16,
            0xB053u16, 0xCB32u16, 0x4691u16, 0x3DF0u16, 0x4DF6u16, 0x3697u16, 0xBB34u16, 0xC055u16,
            0x2BBFu16, 0x50DEu16, 0xDD7Du16, 0xA61Cu16, 0xD61Au16, 0xAD7Bu16, 0x20D8u16, 0x5BB9u16,
            0xC0D4u16, 0xBBB5u16, 0x3616u16, 0x4D77u16, 0x3D71u16, 0x4610u16, 0xCBB3u16, 0xB0D2u16,
            0xED48u16, 0x9629u16, 0x1B8Au16, 0x60EBu16, 0x10EDu16, 0x6B8Cu16, 0xE62Fu16, 0x9D4Eu16,
            0x0623u16, 0x7D42u16, 0xF0E1u16, 0x8B80u16, 0xFB86u16, 0x80E7u16, 0x0D44u16, 0x7625u16,
            0xB670u16, 0xCD11u16, 0x40B2u16, 0x3BD3u16, 0x4BD5u16, 0x30B4u16, 0xBD17u16, 0xC676u16,
            0x5D1Bu16, 0x267Au16, 0xABD9u16, 0xD0B8u16, 0xA0BEu16, 0xDBDFu16, 0x567Cu16, 0x2D1Du16,
            0x7087u16, 0x0BE6u16, 0x8645u16, 0xFD24u16, 0x8D22u16, 0xF643u16, 0x7BE0u16, 0x0081u16,
            0x9BECu16, 0xE08Du16, 0x6D2Eu16, 0x164Fu16, 0x6649u16, 0x1D28u16, 0x908Bu16, 0xEBEAu16,
            0x577Eu16, 0x2C1Fu16, 0xA1BCu16, 0xDADDu16, 0xAADBu16, 0xD1BAu16, 0x5C19u16, 0x2778u16,
            0xBC15u16, 0xC774u16, 0x4AD7u16, 0x31B6u16, 0x41B0u16, 0x3AD1u16, 0xB772u16, 0xCC13u16,
            0x9189u16, 0xEAE8u16, 0x674Bu16, 0x1C2Au16, 0x6C2Cu16, 0x174Du16, 0x9AEEu16, 0xE18Fu16,
            0x7AE2u16, 0x0183u16, 0x8C20u16, 0xF741u16, 0x8747u16, 0xFC26u16, 0x7185u16, 0x0AE4u16,
            0xCAB1u16, 0xB1D0u16, 0x3C73u16, 0x4712u16, 0x3714u16, 0x4C75u16, 0xC1D6u16, 0xBAB7u16,
            0x21DAu16, 0x5ABBu16, 0xD718u16, 0xAC79u16, 0xDC7Fu16, 0xA71Eu16, 0x2ABDu16, 0x51DCu16,
            0x0C46u16, 0x7727u16, 0xFA84u16, 0x81E5u16, 0xF1E3u16, 0x8A82u16, 0x0721u16, 0x7C40u16,
            0xE72Du16, 0x9C4Cu16, 0x11EFu16, 0x6A8Eu16, 0x1A88u16, 0x61E9u16, 0xEC4Au16, 0x972Bu16,
            0x7CC1u16, 0x07A0u16, 0x8A03u16, 0xF162u16, 0x8164u16, 0xFA05u16, 0x77A6u16, 0x0CC7u16,
            0x97AAu16, 0xECCBu16, 0x6168u16, 0x1A09u16, 0x6A0Fu16, 0x116Eu16, 0x9CCDu16, 0xE7ACu16,
            0xBA36u16, 0xC157u16, 0x4CF4u16, 0x3795u16, 0x4793u16, 0x3CF2u16, 0xB151u16, 0xCA30u16,
            0x515Du16, 0x2A3Cu16, 0xA79Fu16, 0xDCFEu16, 0xACF8u16, 0xD799u16, 0x5A3Au16, 0x215Bu16,
            0xE10Eu16, 0x9A6Fu16, 0x17CCu16, 0x6CADu16, 0x1CABu16, 0x67CAu16, 0xEA69u16, 0x9108u16,
            0x0A65u16, 0x7104u16, 0xFCA7u16, 0x87C6u16, 0xF7C0u16, 0x8CA1u16, 0x0102u16, 0x7A63u16,
            0x27F9u16, 0x5C98u16, 0xD13Bu16, 0xAA5Au16, 0xDA5Cu16, 0xA13Du16, 0x2C9Eu16, 0x57FFu16,
            0xCC92u16, 0xB7F3u16, 0x3A50u16, 0x4131u16, 0x3137u16, 0x4A56u16, 0xC7F5u16, 0xBC94u16
        ],
        [
            0x0000u16, 0xAEFCu16, 0x4DD9u16, 0xE325u16, 0x9BB2u16, 0x354Eu16, 0xD66Bu16, 0x7897u16,
            0x2745u16, 0x89B9u16, 0x6A9Cu16, 0xC460u16, 0xBCF7u16, 0x120Bu16, 0xF12Eu16, 0x5FD2u16,
            0x4E8Au16, 0xE076u16, 0x0353u16, 0xADAFu16, 0xD538u16, 0x7BC4u16, 0x98E1u16, 0x361Du16,
            0x69CFu16, 0xC733u16, 0x2416u16, 0x8AEAu16, 0xF27Du16, 0x5C81u16, 0xBFA4u16, 0x1158u16,
            0x9D14u16, 0x33E8u16, 0xD0CDu16, 0x7E31u16, 0x06A6u16, 0xA85Au16, 0x4B7Fu16, 0xE583u16,
            0xBA51u16, 0x14ADu16, 0xF788u16, 0x5974u16, 0x21E3u16, 0x8F1Fu16, 0x6C3Au16, 0xC2C6u16,
            0xD39Eu16, 0x7D62u16, 0x9E47u16, 0x30BBu16, 0x482Cu16, 0xE6D0u16, 0x05F5u16, 0xAB09u16,
            0xF4DBu16, 0x5A27u16, 0xB902u16, 0x17FEu16, 0x6F69u16, 0xC195u16, 0x22B0u16, 0x8C4Cu16,
            0x2A09u16, 0x84F5u16, 0x67D0u16, 0xC92Cu16, 0xB1BBu16, 0x1F47u16, 0xFC62u16, 0x529Eu16,
            0x0D4Cu16, 0xA3B0u16, 0x4095u16, 0xEE69u16, 0x96FEu16, 0x3802u16, 0xDB27u16, 0x75DBu16,
            0x6483u16, 0xCA7Fu16, 0x295Au16, 0x87A6u16, 0xFF31u16, 0x51CDu16, 0xB2E8u16, 0x1C14u16,
            0x43C6u16, 0xED3Au16, 0x0E1Fu16, 0xA0E3u16, 0xD874u16, 0x7688u16, 0x95ADu16, 0x3B51u16,
            0xB71Du16, 0x19E1u16, 0xFAC4u16, 0x5438u16, 0x2CAFu16, 0x8253u16, 0x6176u16, 0xCF8Au16,
            0x9058u16, 0x3EA4u16, 0xDD81u16, 0x737Du16, 0x0BEAu16, 0xA516u16, 0x4633u16, 0xE8CFu16,
            0xF997u16, 0x576Bu16, 0xB44Eu16, 0x1AB2u16, 0x6225u16, 0xCCD9u16, 0x2FFCu16, 0x8100u16,
            0xDED2u16, 0x702Eu16, 0x930Bu16, 0x3DF7u16, 0x4560u16, 0xEB9Cu16, 0x08B9u16, 0xA645u16,
            0x5412u16, 0xFAEEu16, 0x19CBu16, 0xB737u16, 0xCFA0u16, 0x615Cu16, 0x8279u16, 0x2C85u16,
            0x7357u16, 0xDDABu16, 0x3E8Eu16, 0x9072u16, 0xE8E5u16, 0x4619u16, 0xA53Cu16, 0x0BC0u16,
            0x1A98u16, 0xB464u16, 0x5741u16, 0xF9BDu16, 0x812Au16, 0x2FD6u16, 0xCCF3u16, 0x620Fu16,
            0x3DDDu16, 0x9321u16, 0x7004u16, 0xDEF8u16, 0xA66Fu16, 0x0893u16, 0xEBB6u16, 0x454Au16,
            0xC906u16, 0x67FAu16, 0x84DFu16, 0x2A23u16, 0x52B4u16, 0xFC48u16, 0x1F6Du16, 0xB191u16,
            0xEE43u16, 0x40BFu16, 0xA39Au16, 0x0D66u16, 0x75F1u16, 0xDB0Du16, 0x3828u16, 0x96D4u16,
            0x878Cu16, 0x2970u16, 0xCA55u16, 0x64A9u16, 0x1C3Eu16, 0xB2C2u16, 0x51E7u16, 0xFF1Bu16,
            0xA0C9u16, 0x0E35u16, 0xED10u16, 0x43ECu16, 0x3B7Bu16, 0x9587u16, 0x76A2u16, 0xD85Eu16,
            0x7E1Bu16, 0xD0E7u16, 0x33C2u16, 0x9D3Eu16, 0xE5A9u16, 0x4B55u16, 0xA870u16, 0x068Cu16,
            0x595Eu16, 0xF7A2u16, 0x1487u16, 0xBA7Bu16, 0xC2ECu16, 0x6C10u16, 0x8F35u16, 0x21C9u16,
            0x3091u16, 0x9E6Du16, 0x7D48u16, 0xD3B4u16, 0xAB23u16, 0x05DFu16, 0xE6FAu16, 0x4806u16,
            0x17D4u16, 0xB928u16, 0x5A0Du16, 0xF4F1u16, 0x8C66u16, 0x229Au16, 0xC1BFu16, 0x6F43u16,
            0xE30Fu16, 0x4DF3u16, 0xAED6u16, 0x002Au16, 0x78BDu16, 0xD641u16, 0x3564u16, 0x9B98u16,
            0xC44Au16, 0x6AB6u16, 0x8993u16, 0x276Fu16, 0x5FF8u16, 0xF104u16, 0x1221u16, 0xBCDDu16,
            0xAD85u16, 0x0379u16, 0xE05Cu16, 0x4EA0u16, 0x3637u16, 0x98CBu16, 0x7BEEu16, 0xD512u16,
            0x8AC0u16, 0x243Cu16, 0xC719u16, 0x69E5u16, 0x1172u16, 0xBF8Eu16, 0x5CABu16, 0xF257u16
        ],
        [
            0x0000u16, 0xA824u16, 0x4069u16, 0xE84Du16, 0x80D2u16, 0x28F6u16, 0xC0BBu16, 0x689Fu16,
            0x1185u16, 0xB9A1u16, 0x51ECu16, 0xF9C8u16, 0x9157u16, 0x3973u16, 0xD13Eu16, 0x791Au16,
            0x230Au16, 0x8B2Eu16, 0x6363u16, 0xCB47u16, 0xA3D8u16, 0x0BFCu16, 0xE3B1u16, 0x4B95u16,
            0x328Fu16, 0x9AABu16, 0x72E6u16, 0xDAC2u16, 0xB25Du16, 0x1A79u16, 0xF234u16, 0x5A10u16,
            0x4614u16, 0xEE30u16, 0x067Du16, 0xAE59u16, 0xC6C6u16, 0x6EE2u16, 0x86AFu16, 0x2E8Bu16,
            0x5791u16, 0xFFB5u16, 0x17F8u16, 0xBFDCu16, 0xD743u16, 0x7F67u16, 0x972Au16, 0x3F0Eu16,
            0x651Eu16, 0xCD3Au16, 0x2577u16, 0x8D53u16, 0xE5CCu16, 0x4DE8u16, 0xA5A5u16, 0x0D81u16,
            0x749Bu16, 0xDCBFu16, 0x34F2u16, 0x9CD6u16, 0xF449u16, 0x5C6Du16, 0xB420u16, 0x1C04u16,
            0x8C28u16, 0x240Cu16, 0xCC41u16, 0x6465u16, 0x0CFAu16, 0xA4DEu16, 0x4C93u16, 0xE4B7u16,
            0x9DADu16, 0x3589u16, 0xDDC4u16, 0x75E0u16, 0x1D7Fu16, 0xB55Bu16, 0x5D16u16, 0xF532u16,
            0xAF22u16, 0x0706u16, 0xEF4Bu16, 0x476Fu16, 0x2FF0u16, 0x87D4u16, 0x6F99u16, 0xC7BDu16,
            0xBEA7u16, 0x1683u16, 0xFECEu16, 0x56EAu16, 0x3E75u16, 0x9651u16, 0x7E1Cu16, 0xD638u16,
            0xCA3Cu16, 0x6218u16, 0x8A55u16, 0x2271u16, 0x4AEEu16, 0xE2CAu16, 0x0A87u16, 0xA2A3u16,
            0xDBB9u16, 0x739Du16, 0x9BD0u16, 0x33F4u16, 0x5B6Bu16, 0xF34Fu16, 0x1B02u16, 0xB326u16,
            0xE936u16, 0x4112u16, 0xA95Fu16, 0x017Bu16, 0x69E4u16, 0xC1C0u16, 0x298Du16, 0x81A9u16,
            0xF8B3u16, 0x5097u16, 0xB8DAu16, 0x10FEu16, 0x7861u16, 0xD045u16, 0x3808u16, 0x902Cu16,
            0x0871u16, 0xA055u16, 0x4818u16, 0xE03Cu16, 0x88A3u16, 0x2087u16, 0xC8CAu16, 0x60EEu16,
            0x19F4u16, 0xB1D0u16, 0x599Du16, 0xF1B9u16, 0x9926u16, 0x3102u16, 0xD94Fu16, 0x716Bu16,
            0x2B7Bu16, 0x835Fu16, 0x6B12u16, 0xC336u16, 0xABA9u16, 0x038Du16, 0xEBC0u16, 0x43E4u16,
            0x3AFEu16, 0x92DAu16, 0x7A97u16, 0xD2B3u16, 0xBA2Cu16, 0x1208u16, 0xFA45u16, 0x5261u16,
            0x4E65u16, 0xE641u16, 0x0E0Cu16, 0xA628u16, 0xCEB7u16, 0x6693u16, 0x8EDEu16, 0x26FAu16,
            0x5FE0u16, 0xF7C4u16, 0x1F89u16, 0xB7ADu16, 0xDF32u16, 0x7716u16, 0x9F5Bu16, 0x377Fu16,
            0x6D6Fu16, 0xC54Bu16, 0x2D06u16, 0x8522u16, 0xEDBDu16, 0x4599u16, 0xADD4u16, 0x05F0u16,
            0x7CEAu16, 0xD4CEu16, 0x3C83u16, 0x94A7u16, 0xFC38u16, 0x541Cu16, 0xBC51u16, 0x1475u16,
            0x8459u16, 0x2C7Du16, 0xC430u16, 0x6C14u16, 0x048Bu16, 0xACAFu16, 0x44E2u16, 0xECC6u16,
            0x95DCu16, 0x3DF8u16, 0xD5B5u16, 0x7D91u16, 0x150Eu16, 0xBD2Au16, 0x5567u16, 0xFD43u16,
            0xA753u16, 0x0F77u16, 0xE73Au16, 0x4F1Eu16, 0x2781u16, 0x8FA5u16, 0x67E8u16, 0xCFCCu16,
            0xB6D6u16, 0x1EF2u16, 0xF6BFu16, 0x5E9Bu16, 0x3604u16, 0x9E20u16, 0x766Du16, 0xDE49u16,
            0xC24Du16, 0x6A69u16, 0x8224u16, 0x2A00u16, 0x429Fu16, 0xEABBu16, 0x02F6u16, 0xAAD2u16,
            0xD3C8u16, 0x7BECu16, 0x93A1u16, 0x3B85u16, 0x531Au16, 0xFB3Eu16, 0x1373u16, 0xBB57u16,
            0xE147u16, 0x4963u16, 0xA12Eu16, 0x090Au16, 0x6195u16, 0xC9B1u16, 0x21FCu16, 0x89D8u16,
            0xF0C2u16, 0x58E6u16, 0xB0ABu16, 0x188Fu16, 0x7010u16, 0xD834u16, 0x3079u16, 0x985Du16
        ]
    ];

    let mut s: u16 = ((initial_crc) & CRC16_BITMASK) ^ CRC16_XOR_OUTPUT;
    for p in data[0..data.len() - data.len() % 16].chunks(16) {
        s = TABLE[15][(p[ 0] as u16 ^ (s >>  8)) as u8 as usize] ^
            TABLE[14][(p[ 1] as u16 ^ (s >>  0)) as u8 as usize] ^
            TABLE[13][p[ 2] as usize                           ] ^
            TABLE[12][p[ 3] as usize                           ] ^
            TABLE[11][p[ 4] as usize                           ] ^
            TABLE[10][p[ 5] as usize                           ] ^
            TABLE[ 9][p[ 6] as usize                           ] ^
            TABLE[ 8][p[ 7] as usize                           ] ^
            TABLE[ 7][p[ 8] as usize                           ] ^
            TABLE[ 6][p[ 9] as usize                           ] ^
            TABLE[ 5][p[10] as usize                           ] ^
            TABLE[ 4][p[11] as usize                           ] ^
            TABLE[ 3][p[12] as usize                           ] ^
            TABLE[ 2][p[13] as usize                           ] ^
            TABLE[ 1][p[14] as usize                           ] ^
            TABLE[ 0][p[15] as usize                           ];
    }

    for p in &data[data.len() - data.len() % 16..data.len()] {
        s = TABLE[0][(*p as u16 ^ (s >>  8)) as usize] ^ (s << 8);
    }

    return ((s) & CRC16_BITMASK) ^ CRC16_XOR_OUTPUT;
}

#[cfg(test)]
mod tests {
    #[test]
    fn test_10_byte_q_subcode() {
        let data = &[0x41, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00];
        assert_eq!(::crc16(data, 0xFFFF), 0x2832);
    }

    #[test]
    fn test_80_byte_data() {
        let data = vec![0xFF; 80];
        assert_eq!(::crc16(&data, 0xFFFF), 0x7409);
    }
}