chd 0.3.4

Rust implementation of the CHD File Format
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
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
/// CD ROM ECC calculation helpers.
use crate::cdrom::{CD_MAX_SECTOR_DATA, CD_MODE_OFFSET, CD_SYNC_NUM_BYTES, CD_SYNC_OFFSET};

const ECC_P_OFFSET: usize = 0x81c;
const ECC_P_NUM_BYTES: usize = 86;
const ECC_P_COMP: usize = 24;

const ECC_Q_OFFSET: usize = ECC_P_OFFSET + 2 * ECC_P_NUM_BYTES;
const ECC_Q_NUM_BYTES: usize = 52;
const ECC_Q_COMP: usize = 43;

const ECC_LOW: [u8; 256] = [
    0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e,
    0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e,
    0x40, 0x42, 0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x50, 0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e,
    0x60, 0x62, 0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6e, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7e,
    0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9e,
    0xa0, 0xa2, 0xa4, 0xa6, 0xa8, 0xaa, 0xac, 0xae, 0xb0, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe,
    0xc0, 0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde,
    0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, 0xf0, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc, 0xfe,
    0x1d, 0x1f, 0x19, 0x1b, 0x15, 0x17, 0x11, 0x13, 0x0d, 0x0f, 0x09, 0x0b, 0x05, 0x07, 0x01, 0x03,
    0x3d, 0x3f, 0x39, 0x3b, 0x35, 0x37, 0x31, 0x33, 0x2d, 0x2f, 0x29, 0x2b, 0x25, 0x27, 0x21, 0x23,
    0x5d, 0x5f, 0x59, 0x5b, 0x55, 0x57, 0x51, 0x53, 0x4d, 0x4f, 0x49, 0x4b, 0x45, 0x47, 0x41, 0x43,
    0x7d, 0x7f, 0x79, 0x7b, 0x75, 0x77, 0x71, 0x73, 0x6d, 0x6f, 0x69, 0x6b, 0x65, 0x67, 0x61, 0x63,
    0x9d, 0x9f, 0x99, 0x9b, 0x95, 0x97, 0x91, 0x93, 0x8d, 0x8f, 0x89, 0x8b, 0x85, 0x87, 0x81, 0x83,
    0xbd, 0xbf, 0xb9, 0xbb, 0xb5, 0xb7, 0xb1, 0xb3, 0xad, 0xaf, 0xa9, 0xab, 0xa5, 0xa7, 0xa1, 0xa3,
    0xdd, 0xdf, 0xd9, 0xdb, 0xd5, 0xd7, 0xd1, 0xd3, 0xcd, 0xcf, 0xc9, 0xcb, 0xc5, 0xc7, 0xc1, 0xc3,
    0xfd, 0xff, 0xf9, 0xfb, 0xf5, 0xf7, 0xf1, 0xf3, 0xed, 0xef, 0xe9, 0xeb, 0xe5, 0xe7, 0xe1, 0xe3,
];

const ECC_HIGH: [u8; 256] = [
    0x00, 0xf4, 0xf5, 0x01, 0xf7, 0x03, 0x02, 0xf6, 0xf3, 0x07, 0x06, 0xf2, 0x04, 0xf0, 0xf1, 0x05,
    0xfb, 0x0f, 0x0e, 0xfa, 0x0c, 0xf8, 0xf9, 0x0d, 0x08, 0xfc, 0xfd, 0x09, 0xff, 0x0b, 0x0a, 0xfe,
    0xeb, 0x1f, 0x1e, 0xea, 0x1c, 0xe8, 0xe9, 0x1d, 0x18, 0xec, 0xed, 0x19, 0xef, 0x1b, 0x1a, 0xee,
    0x10, 0xe4, 0xe5, 0x11, 0xe7, 0x13, 0x12, 0xe6, 0xe3, 0x17, 0x16, 0xe2, 0x14, 0xe0, 0xe1, 0x15,
    0xcb, 0x3f, 0x3e, 0xca, 0x3c, 0xc8, 0xc9, 0x3d, 0x38, 0xcc, 0xcd, 0x39, 0xcf, 0x3b, 0x3a, 0xce,
    0x30, 0xc4, 0xc5, 0x31, 0xc7, 0x33, 0x32, 0xc6, 0xc3, 0x37, 0x36, 0xc2, 0x34, 0xc0, 0xc1, 0x35,
    0x20, 0xd4, 0xd5, 0x21, 0xd7, 0x23, 0x22, 0xd6, 0xd3, 0x27, 0x26, 0xd2, 0x24, 0xd0, 0xd1, 0x25,
    0xdb, 0x2f, 0x2e, 0xda, 0x2c, 0xd8, 0xd9, 0x2d, 0x28, 0xdc, 0xdd, 0x29, 0xdf, 0x2b, 0x2a, 0xde,
    0x8b, 0x7f, 0x7e, 0x8a, 0x7c, 0x88, 0x89, 0x7d, 0x78, 0x8c, 0x8d, 0x79, 0x8f, 0x7b, 0x7a, 0x8e,
    0x70, 0x84, 0x85, 0x71, 0x87, 0x73, 0x72, 0x86, 0x83, 0x77, 0x76, 0x82, 0x74, 0x80, 0x81, 0x75,
    0x60, 0x94, 0x95, 0x61, 0x97, 0x63, 0x62, 0x96, 0x93, 0x67, 0x66, 0x92, 0x64, 0x90, 0x91, 0x65,
    0x9b, 0x6f, 0x6e, 0x9a, 0x6c, 0x98, 0x99, 0x6d, 0x68, 0x9c, 0x9d, 0x69, 0x9f, 0x6b, 0x6a, 0x9e,
    0x40, 0xb4, 0xb5, 0x41, 0xb7, 0x43, 0x42, 0xb6, 0xb3, 0x47, 0x46, 0xb2, 0x44, 0xb0, 0xb1, 0x45,
    0xbb, 0x4f, 0x4e, 0xba, 0x4c, 0xb8, 0xb9, 0x4d, 0x48, 0xbc, 0xbd, 0x49, 0xbf, 0x4b, 0x4a, 0xbe,
    0xab, 0x5f, 0x5e, 0xaa, 0x5c, 0xa8, 0xa9, 0x5d, 0x58, 0xac, 0xad, 0x59, 0xaf, 0x5b, 0x5a, 0xae,
    0x50, 0xa4, 0xa5, 0x51, 0xa7, 0x53, 0x52, 0xa6, 0xa3, 0x57, 0x56, 0xa2, 0x54, 0xa0, 0xa1, 0x55,
];

const ECC_P_OFF: [[u16; ECC_P_COMP]; ECC_P_NUM_BYTES] = [
    [
        0x000, 0x056, 0x0ac, 0x102, 0x158, 0x1ae, 0x204, 0x25a, 0x2b0, 0x306, 0x35c, 0x3b2, 0x408,
        0x45e, 0x4b4, 0x50a, 0x560, 0x5b6, 0x60c, 0x662, 0x6b8, 0x70e, 0x764, 0x7ba,
    ],
    [
        0x001, 0x057, 0x0ad, 0x103, 0x159, 0x1af, 0x205, 0x25b, 0x2b1, 0x307, 0x35d, 0x3b3, 0x409,
        0x45f, 0x4b5, 0x50b, 0x561, 0x5b7, 0x60d, 0x663, 0x6b9, 0x70f, 0x765, 0x7bb,
    ],
    [
        0x002, 0x058, 0x0ae, 0x104, 0x15a, 0x1b0, 0x206, 0x25c, 0x2b2, 0x308, 0x35e, 0x3b4, 0x40a,
        0x460, 0x4b6, 0x50c, 0x562, 0x5b8, 0x60e, 0x664, 0x6ba, 0x710, 0x766, 0x7bc,
    ],
    [
        0x003, 0x059, 0x0af, 0x105, 0x15b, 0x1b1, 0x207, 0x25d, 0x2b3, 0x309, 0x35f, 0x3b5, 0x40b,
        0x461, 0x4b7, 0x50d, 0x563, 0x5b9, 0x60f, 0x665, 0x6bb, 0x711, 0x767, 0x7bd,
    ],
    [
        0x004, 0x05a, 0x0b0, 0x106, 0x15c, 0x1b2, 0x208, 0x25e, 0x2b4, 0x30a, 0x360, 0x3b6, 0x40c,
        0x462, 0x4b8, 0x50e, 0x564, 0x5ba, 0x610, 0x666, 0x6bc, 0x712, 0x768, 0x7be,
    ],
    [
        0x005, 0x05b, 0x0b1, 0x107, 0x15d, 0x1b3, 0x209, 0x25f, 0x2b5, 0x30b, 0x361, 0x3b7, 0x40d,
        0x463, 0x4b9, 0x50f, 0x565, 0x5bb, 0x611, 0x667, 0x6bd, 0x713, 0x769, 0x7bf,
    ],
    [
        0x006, 0x05c, 0x0b2, 0x108, 0x15e, 0x1b4, 0x20a, 0x260, 0x2b6, 0x30c, 0x362, 0x3b8, 0x40e,
        0x464, 0x4ba, 0x510, 0x566, 0x5bc, 0x612, 0x668, 0x6be, 0x714, 0x76a, 0x7c0,
    ],
    [
        0x007, 0x05d, 0x0b3, 0x109, 0x15f, 0x1b5, 0x20b, 0x261, 0x2b7, 0x30d, 0x363, 0x3b9, 0x40f,
        0x465, 0x4bb, 0x511, 0x567, 0x5bd, 0x613, 0x669, 0x6bf, 0x715, 0x76b, 0x7c1,
    ],
    [
        0x008, 0x05e, 0x0b4, 0x10a, 0x160, 0x1b6, 0x20c, 0x262, 0x2b8, 0x30e, 0x364, 0x3ba, 0x410,
        0x466, 0x4bc, 0x512, 0x568, 0x5be, 0x614, 0x66a, 0x6c0, 0x716, 0x76c, 0x7c2,
    ],
    [
        0x009, 0x05f, 0x0b5, 0x10b, 0x161, 0x1b7, 0x20d, 0x263, 0x2b9, 0x30f, 0x365, 0x3bb, 0x411,
        0x467, 0x4bd, 0x513, 0x569, 0x5bf, 0x615, 0x66b, 0x6c1, 0x717, 0x76d, 0x7c3,
    ],
    [
        0x00a, 0x060, 0x0b6, 0x10c, 0x162, 0x1b8, 0x20e, 0x264, 0x2ba, 0x310, 0x366, 0x3bc, 0x412,
        0x468, 0x4be, 0x514, 0x56a, 0x5c0, 0x616, 0x66c, 0x6c2, 0x718, 0x76e, 0x7c4,
    ],
    [
        0x00b, 0x061, 0x0b7, 0x10d, 0x163, 0x1b9, 0x20f, 0x265, 0x2bb, 0x311, 0x367, 0x3bd, 0x413,
        0x469, 0x4bf, 0x515, 0x56b, 0x5c1, 0x617, 0x66d, 0x6c3, 0x719, 0x76f, 0x7c5,
    ],
    [
        0x00c, 0x062, 0x0b8, 0x10e, 0x164, 0x1ba, 0x210, 0x266, 0x2bc, 0x312, 0x368, 0x3be, 0x414,
        0x46a, 0x4c0, 0x516, 0x56c, 0x5c2, 0x618, 0x66e, 0x6c4, 0x71a, 0x770, 0x7c6,
    ],
    [
        0x00d, 0x063, 0x0b9, 0x10f, 0x165, 0x1bb, 0x211, 0x267, 0x2bd, 0x313, 0x369, 0x3bf, 0x415,
        0x46b, 0x4c1, 0x517, 0x56d, 0x5c3, 0x619, 0x66f, 0x6c5, 0x71b, 0x771, 0x7c7,
    ],
    [
        0x00e, 0x064, 0x0ba, 0x110, 0x166, 0x1bc, 0x212, 0x268, 0x2be, 0x314, 0x36a, 0x3c0, 0x416,
        0x46c, 0x4c2, 0x518, 0x56e, 0x5c4, 0x61a, 0x670, 0x6c6, 0x71c, 0x772, 0x7c8,
    ],
    [
        0x00f, 0x065, 0x0bb, 0x111, 0x167, 0x1bd, 0x213, 0x269, 0x2bf, 0x315, 0x36b, 0x3c1, 0x417,
        0x46d, 0x4c3, 0x519, 0x56f, 0x5c5, 0x61b, 0x671, 0x6c7, 0x71d, 0x773, 0x7c9,
    ],
    [
        0x010, 0x066, 0x0bc, 0x112, 0x168, 0x1be, 0x214, 0x26a, 0x2c0, 0x316, 0x36c, 0x3c2, 0x418,
        0x46e, 0x4c4, 0x51a, 0x570, 0x5c6, 0x61c, 0x672, 0x6c8, 0x71e, 0x774, 0x7ca,
    ],
    [
        0x011, 0x067, 0x0bd, 0x113, 0x169, 0x1bf, 0x215, 0x26b, 0x2c1, 0x317, 0x36d, 0x3c3, 0x419,
        0x46f, 0x4c5, 0x51b, 0x571, 0x5c7, 0x61d, 0x673, 0x6c9, 0x71f, 0x775, 0x7cb,
    ],
    [
        0x012, 0x068, 0x0be, 0x114, 0x16a, 0x1c0, 0x216, 0x26c, 0x2c2, 0x318, 0x36e, 0x3c4, 0x41a,
        0x470, 0x4c6, 0x51c, 0x572, 0x5c8, 0x61e, 0x674, 0x6ca, 0x720, 0x776, 0x7cc,
    ],
    [
        0x013, 0x069, 0x0bf, 0x115, 0x16b, 0x1c1, 0x217, 0x26d, 0x2c3, 0x319, 0x36f, 0x3c5, 0x41b,
        0x471, 0x4c7, 0x51d, 0x573, 0x5c9, 0x61f, 0x675, 0x6cb, 0x721, 0x777, 0x7cd,
    ],
    [
        0x014, 0x06a, 0x0c0, 0x116, 0x16c, 0x1c2, 0x218, 0x26e, 0x2c4, 0x31a, 0x370, 0x3c6, 0x41c,
        0x472, 0x4c8, 0x51e, 0x574, 0x5ca, 0x620, 0x676, 0x6cc, 0x722, 0x778, 0x7ce,
    ],
    [
        0x015, 0x06b, 0x0c1, 0x117, 0x16d, 0x1c3, 0x219, 0x26f, 0x2c5, 0x31b, 0x371, 0x3c7, 0x41d,
        0x473, 0x4c9, 0x51f, 0x575, 0x5cb, 0x621, 0x677, 0x6cd, 0x723, 0x779, 0x7cf,
    ],
    [
        0x016, 0x06c, 0x0c2, 0x118, 0x16e, 0x1c4, 0x21a, 0x270, 0x2c6, 0x31c, 0x372, 0x3c8, 0x41e,
        0x474, 0x4ca, 0x520, 0x576, 0x5cc, 0x622, 0x678, 0x6ce, 0x724, 0x77a, 0x7d0,
    ],
    [
        0x017, 0x06d, 0x0c3, 0x119, 0x16f, 0x1c5, 0x21b, 0x271, 0x2c7, 0x31d, 0x373, 0x3c9, 0x41f,
        0x475, 0x4cb, 0x521, 0x577, 0x5cd, 0x623, 0x679, 0x6cf, 0x725, 0x77b, 0x7d1,
    ],
    [
        0x018, 0x06e, 0x0c4, 0x11a, 0x170, 0x1c6, 0x21c, 0x272, 0x2c8, 0x31e, 0x374, 0x3ca, 0x420,
        0x476, 0x4cc, 0x522, 0x578, 0x5ce, 0x624, 0x67a, 0x6d0, 0x726, 0x77c, 0x7d2,
    ],
    [
        0x019, 0x06f, 0x0c5, 0x11b, 0x171, 0x1c7, 0x21d, 0x273, 0x2c9, 0x31f, 0x375, 0x3cb, 0x421,
        0x477, 0x4cd, 0x523, 0x579, 0x5cf, 0x625, 0x67b, 0x6d1, 0x727, 0x77d, 0x7d3,
    ],
    [
        0x01a, 0x070, 0x0c6, 0x11c, 0x172, 0x1c8, 0x21e, 0x274, 0x2ca, 0x320, 0x376, 0x3cc, 0x422,
        0x478, 0x4ce, 0x524, 0x57a, 0x5d0, 0x626, 0x67c, 0x6d2, 0x728, 0x77e, 0x7d4,
    ],
    [
        0x01b, 0x071, 0x0c7, 0x11d, 0x173, 0x1c9, 0x21f, 0x275, 0x2cb, 0x321, 0x377, 0x3cd, 0x423,
        0x479, 0x4cf, 0x525, 0x57b, 0x5d1, 0x627, 0x67d, 0x6d3, 0x729, 0x77f, 0x7d5,
    ],
    [
        0x01c, 0x072, 0x0c8, 0x11e, 0x174, 0x1ca, 0x220, 0x276, 0x2cc, 0x322, 0x378, 0x3ce, 0x424,
        0x47a, 0x4d0, 0x526, 0x57c, 0x5d2, 0x628, 0x67e, 0x6d4, 0x72a, 0x780, 0x7d6,
    ],
    [
        0x01d, 0x073, 0x0c9, 0x11f, 0x175, 0x1cb, 0x221, 0x277, 0x2cd, 0x323, 0x379, 0x3cf, 0x425,
        0x47b, 0x4d1, 0x527, 0x57d, 0x5d3, 0x629, 0x67f, 0x6d5, 0x72b, 0x781, 0x7d7,
    ],
    [
        0x01e, 0x074, 0x0ca, 0x120, 0x176, 0x1cc, 0x222, 0x278, 0x2ce, 0x324, 0x37a, 0x3d0, 0x426,
        0x47c, 0x4d2, 0x528, 0x57e, 0x5d4, 0x62a, 0x680, 0x6d6, 0x72c, 0x782, 0x7d8,
    ],
    [
        0x01f, 0x075, 0x0cb, 0x121, 0x177, 0x1cd, 0x223, 0x279, 0x2cf, 0x325, 0x37b, 0x3d1, 0x427,
        0x47d, 0x4d3, 0x529, 0x57f, 0x5d5, 0x62b, 0x681, 0x6d7, 0x72d, 0x783, 0x7d9,
    ],
    [
        0x020, 0x076, 0x0cc, 0x122, 0x178, 0x1ce, 0x224, 0x27a, 0x2d0, 0x326, 0x37c, 0x3d2, 0x428,
        0x47e, 0x4d4, 0x52a, 0x580, 0x5d6, 0x62c, 0x682, 0x6d8, 0x72e, 0x784, 0x7da,
    ],
    [
        0x021, 0x077, 0x0cd, 0x123, 0x179, 0x1cf, 0x225, 0x27b, 0x2d1, 0x327, 0x37d, 0x3d3, 0x429,
        0x47f, 0x4d5, 0x52b, 0x581, 0x5d7, 0x62d, 0x683, 0x6d9, 0x72f, 0x785, 0x7db,
    ],
    [
        0x022, 0x078, 0x0ce, 0x124, 0x17a, 0x1d0, 0x226, 0x27c, 0x2d2, 0x328, 0x37e, 0x3d4, 0x42a,
        0x480, 0x4d6, 0x52c, 0x582, 0x5d8, 0x62e, 0x684, 0x6da, 0x730, 0x786, 0x7dc,
    ],
    [
        0x023, 0x079, 0x0cf, 0x125, 0x17b, 0x1d1, 0x227, 0x27d, 0x2d3, 0x329, 0x37f, 0x3d5, 0x42b,
        0x481, 0x4d7, 0x52d, 0x583, 0x5d9, 0x62f, 0x685, 0x6db, 0x731, 0x787, 0x7dd,
    ],
    [
        0x024, 0x07a, 0x0d0, 0x126, 0x17c, 0x1d2, 0x228, 0x27e, 0x2d4, 0x32a, 0x380, 0x3d6, 0x42c,
        0x482, 0x4d8, 0x52e, 0x584, 0x5da, 0x630, 0x686, 0x6dc, 0x732, 0x788, 0x7de,
    ],
    [
        0x025, 0x07b, 0x0d1, 0x127, 0x17d, 0x1d3, 0x229, 0x27f, 0x2d5, 0x32b, 0x381, 0x3d7, 0x42d,
        0x483, 0x4d9, 0x52f, 0x585, 0x5db, 0x631, 0x687, 0x6dd, 0x733, 0x789, 0x7df,
    ],
    [
        0x026, 0x07c, 0x0d2, 0x128, 0x17e, 0x1d4, 0x22a, 0x280, 0x2d6, 0x32c, 0x382, 0x3d8, 0x42e,
        0x484, 0x4da, 0x530, 0x586, 0x5dc, 0x632, 0x688, 0x6de, 0x734, 0x78a, 0x7e0,
    ],
    [
        0x027, 0x07d, 0x0d3, 0x129, 0x17f, 0x1d5, 0x22b, 0x281, 0x2d7, 0x32d, 0x383, 0x3d9, 0x42f,
        0x485, 0x4db, 0x531, 0x587, 0x5dd, 0x633, 0x689, 0x6df, 0x735, 0x78b, 0x7e1,
    ],
    [
        0x028, 0x07e, 0x0d4, 0x12a, 0x180, 0x1d6, 0x22c, 0x282, 0x2d8, 0x32e, 0x384, 0x3da, 0x430,
        0x486, 0x4dc, 0x532, 0x588, 0x5de, 0x634, 0x68a, 0x6e0, 0x736, 0x78c, 0x7e2,
    ],
    [
        0x029, 0x07f, 0x0d5, 0x12b, 0x181, 0x1d7, 0x22d, 0x283, 0x2d9, 0x32f, 0x385, 0x3db, 0x431,
        0x487, 0x4dd, 0x533, 0x589, 0x5df, 0x635, 0x68b, 0x6e1, 0x737, 0x78d, 0x7e3,
    ],
    [
        0x02a, 0x080, 0x0d6, 0x12c, 0x182, 0x1d8, 0x22e, 0x284, 0x2da, 0x330, 0x386, 0x3dc, 0x432,
        0x488, 0x4de, 0x534, 0x58a, 0x5e0, 0x636, 0x68c, 0x6e2, 0x738, 0x78e, 0x7e4,
    ],
    [
        0x02b, 0x081, 0x0d7, 0x12d, 0x183, 0x1d9, 0x22f, 0x285, 0x2db, 0x331, 0x387, 0x3dd, 0x433,
        0x489, 0x4df, 0x535, 0x58b, 0x5e1, 0x637, 0x68d, 0x6e3, 0x739, 0x78f, 0x7e5,
    ],
    [
        0x02c, 0x082, 0x0d8, 0x12e, 0x184, 0x1da, 0x230, 0x286, 0x2dc, 0x332, 0x388, 0x3de, 0x434,
        0x48a, 0x4e0, 0x536, 0x58c, 0x5e2, 0x638, 0x68e, 0x6e4, 0x73a, 0x790, 0x7e6,
    ],
    [
        0x02d, 0x083, 0x0d9, 0x12f, 0x185, 0x1db, 0x231, 0x287, 0x2dd, 0x333, 0x389, 0x3df, 0x435,
        0x48b, 0x4e1, 0x537, 0x58d, 0x5e3, 0x639, 0x68f, 0x6e5, 0x73b, 0x791, 0x7e7,
    ],
    [
        0x02e, 0x084, 0x0da, 0x130, 0x186, 0x1dc, 0x232, 0x288, 0x2de, 0x334, 0x38a, 0x3e0, 0x436,
        0x48c, 0x4e2, 0x538, 0x58e, 0x5e4, 0x63a, 0x690, 0x6e6, 0x73c, 0x792, 0x7e8,
    ],
    [
        0x02f, 0x085, 0x0db, 0x131, 0x187, 0x1dd, 0x233, 0x289, 0x2df, 0x335, 0x38b, 0x3e1, 0x437,
        0x48d, 0x4e3, 0x539, 0x58f, 0x5e5, 0x63b, 0x691, 0x6e7, 0x73d, 0x793, 0x7e9,
    ],
    [
        0x030, 0x086, 0x0dc, 0x132, 0x188, 0x1de, 0x234, 0x28a, 0x2e0, 0x336, 0x38c, 0x3e2, 0x438,
        0x48e, 0x4e4, 0x53a, 0x590, 0x5e6, 0x63c, 0x692, 0x6e8, 0x73e, 0x794, 0x7ea,
    ],
    [
        0x031, 0x087, 0x0dd, 0x133, 0x189, 0x1df, 0x235, 0x28b, 0x2e1, 0x337, 0x38d, 0x3e3, 0x439,
        0x48f, 0x4e5, 0x53b, 0x591, 0x5e7, 0x63d, 0x693, 0x6e9, 0x73f, 0x795, 0x7eb,
    ],
    [
        0x032, 0x088, 0x0de, 0x134, 0x18a, 0x1e0, 0x236, 0x28c, 0x2e2, 0x338, 0x38e, 0x3e4, 0x43a,
        0x490, 0x4e6, 0x53c, 0x592, 0x5e8, 0x63e, 0x694, 0x6ea, 0x740, 0x796, 0x7ec,
    ],
    [
        0x033, 0x089, 0x0df, 0x135, 0x18b, 0x1e1, 0x237, 0x28d, 0x2e3, 0x339, 0x38f, 0x3e5, 0x43b,
        0x491, 0x4e7, 0x53d, 0x593, 0x5e9, 0x63f, 0x695, 0x6eb, 0x741, 0x797, 0x7ed,
    ],
    [
        0x034, 0x08a, 0x0e0, 0x136, 0x18c, 0x1e2, 0x238, 0x28e, 0x2e4, 0x33a, 0x390, 0x3e6, 0x43c,
        0x492, 0x4e8, 0x53e, 0x594, 0x5ea, 0x640, 0x696, 0x6ec, 0x742, 0x798, 0x7ee,
    ],
    [
        0x035, 0x08b, 0x0e1, 0x137, 0x18d, 0x1e3, 0x239, 0x28f, 0x2e5, 0x33b, 0x391, 0x3e7, 0x43d,
        0x493, 0x4e9, 0x53f, 0x595, 0x5eb, 0x641, 0x697, 0x6ed, 0x743, 0x799, 0x7ef,
    ],
    [
        0x036, 0x08c, 0x0e2, 0x138, 0x18e, 0x1e4, 0x23a, 0x290, 0x2e6, 0x33c, 0x392, 0x3e8, 0x43e,
        0x494, 0x4ea, 0x540, 0x596, 0x5ec, 0x642, 0x698, 0x6ee, 0x744, 0x79a, 0x7f0,
    ],
    [
        0x037, 0x08d, 0x0e3, 0x139, 0x18f, 0x1e5, 0x23b, 0x291, 0x2e7, 0x33d, 0x393, 0x3e9, 0x43f,
        0x495, 0x4eb, 0x541, 0x597, 0x5ed, 0x643, 0x699, 0x6ef, 0x745, 0x79b, 0x7f1,
    ],
    [
        0x038, 0x08e, 0x0e4, 0x13a, 0x190, 0x1e6, 0x23c, 0x292, 0x2e8, 0x33e, 0x394, 0x3ea, 0x440,
        0x496, 0x4ec, 0x542, 0x598, 0x5ee, 0x644, 0x69a, 0x6f0, 0x746, 0x79c, 0x7f2,
    ],
    [
        0x039, 0x08f, 0x0e5, 0x13b, 0x191, 0x1e7, 0x23d, 0x293, 0x2e9, 0x33f, 0x395, 0x3eb, 0x441,
        0x497, 0x4ed, 0x543, 0x599, 0x5ef, 0x645, 0x69b, 0x6f1, 0x747, 0x79d, 0x7f3,
    ],
    [
        0x03a, 0x090, 0x0e6, 0x13c, 0x192, 0x1e8, 0x23e, 0x294, 0x2ea, 0x340, 0x396, 0x3ec, 0x442,
        0x498, 0x4ee, 0x544, 0x59a, 0x5f0, 0x646, 0x69c, 0x6f2, 0x748, 0x79e, 0x7f4,
    ],
    [
        0x03b, 0x091, 0x0e7, 0x13d, 0x193, 0x1e9, 0x23f, 0x295, 0x2eb, 0x341, 0x397, 0x3ed, 0x443,
        0x499, 0x4ef, 0x545, 0x59b, 0x5f1, 0x647, 0x69d, 0x6f3, 0x749, 0x79f, 0x7f5,
    ],
    [
        0x03c, 0x092, 0x0e8, 0x13e, 0x194, 0x1ea, 0x240, 0x296, 0x2ec, 0x342, 0x398, 0x3ee, 0x444,
        0x49a, 0x4f0, 0x546, 0x59c, 0x5f2, 0x648, 0x69e, 0x6f4, 0x74a, 0x7a0, 0x7f6,
    ],
    [
        0x03d, 0x093, 0x0e9, 0x13f, 0x195, 0x1eb, 0x241, 0x297, 0x2ed, 0x343, 0x399, 0x3ef, 0x445,
        0x49b, 0x4f1, 0x547, 0x59d, 0x5f3, 0x649, 0x69f, 0x6f5, 0x74b, 0x7a1, 0x7f7,
    ],
    [
        0x03e, 0x094, 0x0ea, 0x140, 0x196, 0x1ec, 0x242, 0x298, 0x2ee, 0x344, 0x39a, 0x3f0, 0x446,
        0x49c, 0x4f2, 0x548, 0x59e, 0x5f4, 0x64a, 0x6a0, 0x6f6, 0x74c, 0x7a2, 0x7f8,
    ],
    [
        0x03f, 0x095, 0x0eb, 0x141, 0x197, 0x1ed, 0x243, 0x299, 0x2ef, 0x345, 0x39b, 0x3f1, 0x447,
        0x49d, 0x4f3, 0x549, 0x59f, 0x5f5, 0x64b, 0x6a1, 0x6f7, 0x74d, 0x7a3, 0x7f9,
    ],
    [
        0x040, 0x096, 0x0ec, 0x142, 0x198, 0x1ee, 0x244, 0x29a, 0x2f0, 0x346, 0x39c, 0x3f2, 0x448,
        0x49e, 0x4f4, 0x54a, 0x5a0, 0x5f6, 0x64c, 0x6a2, 0x6f8, 0x74e, 0x7a4, 0x7fa,
    ],
    [
        0x041, 0x097, 0x0ed, 0x143, 0x199, 0x1ef, 0x245, 0x29b, 0x2f1, 0x347, 0x39d, 0x3f3, 0x449,
        0x49f, 0x4f5, 0x54b, 0x5a1, 0x5f7, 0x64d, 0x6a3, 0x6f9, 0x74f, 0x7a5, 0x7fb,
    ],
    [
        0x042, 0x098, 0x0ee, 0x144, 0x19a, 0x1f0, 0x246, 0x29c, 0x2f2, 0x348, 0x39e, 0x3f4, 0x44a,
        0x4a0, 0x4f6, 0x54c, 0x5a2, 0x5f8, 0x64e, 0x6a4, 0x6fa, 0x750, 0x7a6, 0x7fc,
    ],
    [
        0x043, 0x099, 0x0ef, 0x145, 0x19b, 0x1f1, 0x247, 0x29d, 0x2f3, 0x349, 0x39f, 0x3f5, 0x44b,
        0x4a1, 0x4f7, 0x54d, 0x5a3, 0x5f9, 0x64f, 0x6a5, 0x6fb, 0x751, 0x7a7, 0x7fd,
    ],
    [
        0x044, 0x09a, 0x0f0, 0x146, 0x19c, 0x1f2, 0x248, 0x29e, 0x2f4, 0x34a, 0x3a0, 0x3f6, 0x44c,
        0x4a2, 0x4f8, 0x54e, 0x5a4, 0x5fa, 0x650, 0x6a6, 0x6fc, 0x752, 0x7a8, 0x7fe,
    ],
    [
        0x045, 0x09b, 0x0f1, 0x147, 0x19d, 0x1f3, 0x249, 0x29f, 0x2f5, 0x34b, 0x3a1, 0x3f7, 0x44d,
        0x4a3, 0x4f9, 0x54f, 0x5a5, 0x5fb, 0x651, 0x6a7, 0x6fd, 0x753, 0x7a9, 0x7ff,
    ],
    [
        0x046, 0x09c, 0x0f2, 0x148, 0x19e, 0x1f4, 0x24a, 0x2a0, 0x2f6, 0x34c, 0x3a2, 0x3f8, 0x44e,
        0x4a4, 0x4fa, 0x550, 0x5a6, 0x5fc, 0x652, 0x6a8, 0x6fe, 0x754, 0x7aa, 0x800,
    ],
    [
        0x047, 0x09d, 0x0f3, 0x149, 0x19f, 0x1f5, 0x24b, 0x2a1, 0x2f7, 0x34d, 0x3a3, 0x3f9, 0x44f,
        0x4a5, 0x4fb, 0x551, 0x5a7, 0x5fd, 0x653, 0x6a9, 0x6ff, 0x755, 0x7ab, 0x801,
    ],
    [
        0x048, 0x09e, 0x0f4, 0x14a, 0x1a0, 0x1f6, 0x24c, 0x2a2, 0x2f8, 0x34e, 0x3a4, 0x3fa, 0x450,
        0x4a6, 0x4fc, 0x552, 0x5a8, 0x5fe, 0x654, 0x6aa, 0x700, 0x756, 0x7ac, 0x802,
    ],
    [
        0x049, 0x09f, 0x0f5, 0x14b, 0x1a1, 0x1f7, 0x24d, 0x2a3, 0x2f9, 0x34f, 0x3a5, 0x3fb, 0x451,
        0x4a7, 0x4fd, 0x553, 0x5a9, 0x5ff, 0x655, 0x6ab, 0x701, 0x757, 0x7ad, 0x803,
    ],
    [
        0x04a, 0x0a0, 0x0f6, 0x14c, 0x1a2, 0x1f8, 0x24e, 0x2a4, 0x2fa, 0x350, 0x3a6, 0x3fc, 0x452,
        0x4a8, 0x4fe, 0x554, 0x5aa, 0x600, 0x656, 0x6ac, 0x702, 0x758, 0x7ae, 0x804,
    ],
    [
        0x04b, 0x0a1, 0x0f7, 0x14d, 0x1a3, 0x1f9, 0x24f, 0x2a5, 0x2fb, 0x351, 0x3a7, 0x3fd, 0x453,
        0x4a9, 0x4ff, 0x555, 0x5ab, 0x601, 0x657, 0x6ad, 0x703, 0x759, 0x7af, 0x805,
    ],
    [
        0x04c, 0x0a2, 0x0f8, 0x14e, 0x1a4, 0x1fa, 0x250, 0x2a6, 0x2fc, 0x352, 0x3a8, 0x3fe, 0x454,
        0x4aa, 0x500, 0x556, 0x5ac, 0x602, 0x658, 0x6ae, 0x704, 0x75a, 0x7b0, 0x806,
    ],
    [
        0x04d, 0x0a3, 0x0f9, 0x14f, 0x1a5, 0x1fb, 0x251, 0x2a7, 0x2fd, 0x353, 0x3a9, 0x3ff, 0x455,
        0x4ab, 0x501, 0x557, 0x5ad, 0x603, 0x659, 0x6af, 0x705, 0x75b, 0x7b1, 0x807,
    ],
    [
        0x04e, 0x0a4, 0x0fa, 0x150, 0x1a6, 0x1fc, 0x252, 0x2a8, 0x2fe, 0x354, 0x3aa, 0x400, 0x456,
        0x4ac, 0x502, 0x558, 0x5ae, 0x604, 0x65a, 0x6b0, 0x706, 0x75c, 0x7b2, 0x808,
    ],
    [
        0x04f, 0x0a5, 0x0fb, 0x151, 0x1a7, 0x1fd, 0x253, 0x2a9, 0x2ff, 0x355, 0x3ab, 0x401, 0x457,
        0x4ad, 0x503, 0x559, 0x5af, 0x605, 0x65b, 0x6b1, 0x707, 0x75d, 0x7b3, 0x809,
    ],
    [
        0x050, 0x0a6, 0x0fc, 0x152, 0x1a8, 0x1fe, 0x254, 0x2aa, 0x300, 0x356, 0x3ac, 0x402, 0x458,
        0x4ae, 0x504, 0x55a, 0x5b0, 0x606, 0x65c, 0x6b2, 0x708, 0x75e, 0x7b4, 0x80a,
    ],
    [
        0x051, 0x0a7, 0x0fd, 0x153, 0x1a9, 0x1ff, 0x255, 0x2ab, 0x301, 0x357, 0x3ad, 0x403, 0x459,
        0x4af, 0x505, 0x55b, 0x5b1, 0x607, 0x65d, 0x6b3, 0x709, 0x75f, 0x7b5, 0x80b,
    ],
    [
        0x052, 0x0a8, 0x0fe, 0x154, 0x1aa, 0x200, 0x256, 0x2ac, 0x302, 0x358, 0x3ae, 0x404, 0x45a,
        0x4b0, 0x506, 0x55c, 0x5b2, 0x608, 0x65e, 0x6b4, 0x70a, 0x760, 0x7b6, 0x80c,
    ],
    [
        0x053, 0x0a9, 0x0ff, 0x155, 0x1ab, 0x201, 0x257, 0x2ad, 0x303, 0x359, 0x3af, 0x405, 0x45b,
        0x4b1, 0x507, 0x55d, 0x5b3, 0x609, 0x65f, 0x6b5, 0x70b, 0x761, 0x7b7, 0x80d,
    ],
    [
        0x054, 0x0aa, 0x100, 0x156, 0x1ac, 0x202, 0x258, 0x2ae, 0x304, 0x35a, 0x3b0, 0x406, 0x45c,
        0x4b2, 0x508, 0x55e, 0x5b4, 0x60a, 0x660, 0x6b6, 0x70c, 0x762, 0x7b8, 0x80e,
    ],
    [
        0x055, 0x0ab, 0x101, 0x157, 0x1ad, 0x203, 0x259, 0x2af, 0x305, 0x35b, 0x3b1, 0x407, 0x45d,
        0x4b3, 0x509, 0x55f, 0x5b5, 0x60b, 0x661, 0x6b7, 0x70d, 0x763, 0x7b9, 0x80f,
    ],
];

const ECC_Q_OFF: [[u16; ECC_Q_COMP]; ECC_Q_NUM_BYTES] = [
    [
        0x000, 0x058, 0x0b0, 0x108, 0x160, 0x1b8, 0x210, 0x268, 0x2c0, 0x318, 0x370, 0x3c8, 0x420,
        0x478, 0x4d0, 0x528, 0x580, 0x5d8, 0x630, 0x688, 0x6e0, 0x738, 0x790, 0x7e8, 0x840, 0x898,
        0x034, 0x08c, 0x0e4, 0x13c, 0x194, 0x1ec, 0x244, 0x29c, 0x2f4, 0x34c, 0x3a4, 0x3fc, 0x454,
        0x4ac, 0x504, 0x55c, 0x5b4,
    ],
    [
        0x001, 0x059, 0x0b1, 0x109, 0x161, 0x1b9, 0x211, 0x269, 0x2c1, 0x319, 0x371, 0x3c9, 0x421,
        0x479, 0x4d1, 0x529, 0x581, 0x5d9, 0x631, 0x689, 0x6e1, 0x739, 0x791, 0x7e9, 0x841, 0x899,
        0x035, 0x08d, 0x0e5, 0x13d, 0x195, 0x1ed, 0x245, 0x29d, 0x2f5, 0x34d, 0x3a5, 0x3fd, 0x455,
        0x4ad, 0x505, 0x55d, 0x5b5,
    ],
    [
        0x056, 0x0ae, 0x106, 0x15e, 0x1b6, 0x20e, 0x266, 0x2be, 0x316, 0x36e, 0x3c6, 0x41e, 0x476,
        0x4ce, 0x526, 0x57e, 0x5d6, 0x62e, 0x686, 0x6de, 0x736, 0x78e, 0x7e6, 0x83e, 0x896, 0x032,
        0x08a, 0x0e2, 0x13a, 0x192, 0x1ea, 0x242, 0x29a, 0x2f2, 0x34a, 0x3a2, 0x3fa, 0x452, 0x4aa,
        0x502, 0x55a, 0x5b2, 0x60a,
    ],
    [
        0x057, 0x0af, 0x107, 0x15f, 0x1b7, 0x20f, 0x267, 0x2bf, 0x317, 0x36f, 0x3c7, 0x41f, 0x477,
        0x4cf, 0x527, 0x57f, 0x5d7, 0x62f, 0x687, 0x6df, 0x737, 0x78f, 0x7e7, 0x83f, 0x897, 0x033,
        0x08b, 0x0e3, 0x13b, 0x193, 0x1eb, 0x243, 0x29b, 0x2f3, 0x34b, 0x3a3, 0x3fb, 0x453, 0x4ab,
        0x503, 0x55b, 0x5b3, 0x60b,
    ],
    [
        0x0ac, 0x104, 0x15c, 0x1b4, 0x20c, 0x264, 0x2bc, 0x314, 0x36c, 0x3c4, 0x41c, 0x474, 0x4cc,
        0x524, 0x57c, 0x5d4, 0x62c, 0x684, 0x6dc, 0x734, 0x78c, 0x7e4, 0x83c, 0x894, 0x030, 0x088,
        0x0e0, 0x138, 0x190, 0x1e8, 0x240, 0x298, 0x2f0, 0x348, 0x3a0, 0x3f8, 0x450, 0x4a8, 0x500,
        0x558, 0x5b0, 0x608, 0x660,
    ],
    [
        0x0ad, 0x105, 0x15d, 0x1b5, 0x20d, 0x265, 0x2bd, 0x315, 0x36d, 0x3c5, 0x41d, 0x475, 0x4cd,
        0x525, 0x57d, 0x5d5, 0x62d, 0x685, 0x6dd, 0x735, 0x78d, 0x7e5, 0x83d, 0x895, 0x031, 0x089,
        0x0e1, 0x139, 0x191, 0x1e9, 0x241, 0x299, 0x2f1, 0x349, 0x3a1, 0x3f9, 0x451, 0x4a9, 0x501,
        0x559, 0x5b1, 0x609, 0x661,
    ],
    [
        0x102, 0x15a, 0x1b2, 0x20a, 0x262, 0x2ba, 0x312, 0x36a, 0x3c2, 0x41a, 0x472, 0x4ca, 0x522,
        0x57a, 0x5d2, 0x62a, 0x682, 0x6da, 0x732, 0x78a, 0x7e2, 0x83a, 0x892, 0x02e, 0x086, 0x0de,
        0x136, 0x18e, 0x1e6, 0x23e, 0x296, 0x2ee, 0x346, 0x39e, 0x3f6, 0x44e, 0x4a6, 0x4fe, 0x556,
        0x5ae, 0x606, 0x65e, 0x6b6,
    ],
    [
        0x103, 0x15b, 0x1b3, 0x20b, 0x263, 0x2bb, 0x313, 0x36b, 0x3c3, 0x41b, 0x473, 0x4cb, 0x523,
        0x57b, 0x5d3, 0x62b, 0x683, 0x6db, 0x733, 0x78b, 0x7e3, 0x83b, 0x893, 0x02f, 0x087, 0x0df,
        0x137, 0x18f, 0x1e7, 0x23f, 0x297, 0x2ef, 0x347, 0x39f, 0x3f7, 0x44f, 0x4a7, 0x4ff, 0x557,
        0x5af, 0x607, 0x65f, 0x6b7,
    ],
    [
        0x158, 0x1b0, 0x208, 0x260, 0x2b8, 0x310, 0x368, 0x3c0, 0x418, 0x470, 0x4c8, 0x520, 0x578,
        0x5d0, 0x628, 0x680, 0x6d8, 0x730, 0x788, 0x7e0, 0x838, 0x890, 0x02c, 0x084, 0x0dc, 0x134,
        0x18c, 0x1e4, 0x23c, 0x294, 0x2ec, 0x344, 0x39c, 0x3f4, 0x44c, 0x4a4, 0x4fc, 0x554, 0x5ac,
        0x604, 0x65c, 0x6b4, 0x70c,
    ],
    [
        0x159, 0x1b1, 0x209, 0x261, 0x2b9, 0x311, 0x369, 0x3c1, 0x419, 0x471, 0x4c9, 0x521, 0x579,
        0x5d1, 0x629, 0x681, 0x6d9, 0x731, 0x789, 0x7e1, 0x839, 0x891, 0x02d, 0x085, 0x0dd, 0x135,
        0x18d, 0x1e5, 0x23d, 0x295, 0x2ed, 0x345, 0x39d, 0x3f5, 0x44d, 0x4a5, 0x4fd, 0x555, 0x5ad,
        0x605, 0x65d, 0x6b5, 0x70d,
    ],
    [
        0x1ae, 0x206, 0x25e, 0x2b6, 0x30e, 0x366, 0x3be, 0x416, 0x46e, 0x4c6, 0x51e, 0x576, 0x5ce,
        0x626, 0x67e, 0x6d6, 0x72e, 0x786, 0x7de, 0x836, 0x88e, 0x02a, 0x082, 0x0da, 0x132, 0x18a,
        0x1e2, 0x23a, 0x292, 0x2ea, 0x342, 0x39a, 0x3f2, 0x44a, 0x4a2, 0x4fa, 0x552, 0x5aa, 0x602,
        0x65a, 0x6b2, 0x70a, 0x762,
    ],
    [
        0x1af, 0x207, 0x25f, 0x2b7, 0x30f, 0x367, 0x3bf, 0x417, 0x46f, 0x4c7, 0x51f, 0x577, 0x5cf,
        0x627, 0x67f, 0x6d7, 0x72f, 0x787, 0x7df, 0x837, 0x88f, 0x02b, 0x083, 0x0db, 0x133, 0x18b,
        0x1e3, 0x23b, 0x293, 0x2eb, 0x343, 0x39b, 0x3f3, 0x44b, 0x4a3, 0x4fb, 0x553, 0x5ab, 0x603,
        0x65b, 0x6b3, 0x70b, 0x763,
    ],
    [
        0x204, 0x25c, 0x2b4, 0x30c, 0x364, 0x3bc, 0x414, 0x46c, 0x4c4, 0x51c, 0x574, 0x5cc, 0x624,
        0x67c, 0x6d4, 0x72c, 0x784, 0x7dc, 0x834, 0x88c, 0x028, 0x080, 0x0d8, 0x130, 0x188, 0x1e0,
        0x238, 0x290, 0x2e8, 0x340, 0x398, 0x3f0, 0x448, 0x4a0, 0x4f8, 0x550, 0x5a8, 0x600, 0x658,
        0x6b0, 0x708, 0x760, 0x7b8,
    ],
    [
        0x205, 0x25d, 0x2b5, 0x30d, 0x365, 0x3bd, 0x415, 0x46d, 0x4c5, 0x51d, 0x575, 0x5cd, 0x625,
        0x67d, 0x6d5, 0x72d, 0x785, 0x7dd, 0x835, 0x88d, 0x029, 0x081, 0x0d9, 0x131, 0x189, 0x1e1,
        0x239, 0x291, 0x2e9, 0x341, 0x399, 0x3f1, 0x449, 0x4a1, 0x4f9, 0x551, 0x5a9, 0x601, 0x659,
        0x6b1, 0x709, 0x761, 0x7b9,
    ],
    [
        0x25a, 0x2b2, 0x30a, 0x362, 0x3ba, 0x412, 0x46a, 0x4c2, 0x51a, 0x572, 0x5ca, 0x622, 0x67a,
        0x6d2, 0x72a, 0x782, 0x7da, 0x832, 0x88a, 0x026, 0x07e, 0x0d6, 0x12e, 0x186, 0x1de, 0x236,
        0x28e, 0x2e6, 0x33e, 0x396, 0x3ee, 0x446, 0x49e, 0x4f6, 0x54e, 0x5a6, 0x5fe, 0x656, 0x6ae,
        0x706, 0x75e, 0x7b6, 0x80e,
    ],
    [
        0x25b, 0x2b3, 0x30b, 0x363, 0x3bb, 0x413, 0x46b, 0x4c3, 0x51b, 0x573, 0x5cb, 0x623, 0x67b,
        0x6d3, 0x72b, 0x783, 0x7db, 0x833, 0x88b, 0x027, 0x07f, 0x0d7, 0x12f, 0x187, 0x1df, 0x237,
        0x28f, 0x2e7, 0x33f, 0x397, 0x3ef, 0x447, 0x49f, 0x4f7, 0x54f, 0x5a7, 0x5ff, 0x657, 0x6af,
        0x707, 0x75f, 0x7b7, 0x80f,
    ],
    [
        0x2b0, 0x308, 0x360, 0x3b8, 0x410, 0x468, 0x4c0, 0x518, 0x570, 0x5c8, 0x620, 0x678, 0x6d0,
        0x728, 0x780, 0x7d8, 0x830, 0x888, 0x024, 0x07c, 0x0d4, 0x12c, 0x184, 0x1dc, 0x234, 0x28c,
        0x2e4, 0x33c, 0x394, 0x3ec, 0x444, 0x49c, 0x4f4, 0x54c, 0x5a4, 0x5fc, 0x654, 0x6ac, 0x704,
        0x75c, 0x7b4, 0x80c, 0x864,
    ],
    [
        0x2b1, 0x309, 0x361, 0x3b9, 0x411, 0x469, 0x4c1, 0x519, 0x571, 0x5c9, 0x621, 0x679, 0x6d1,
        0x729, 0x781, 0x7d9, 0x831, 0x889, 0x025, 0x07d, 0x0d5, 0x12d, 0x185, 0x1dd, 0x235, 0x28d,
        0x2e5, 0x33d, 0x395, 0x3ed, 0x445, 0x49d, 0x4f5, 0x54d, 0x5a5, 0x5fd, 0x655, 0x6ad, 0x705,
        0x75d, 0x7b5, 0x80d, 0x865,
    ],
    [
        0x306, 0x35e, 0x3b6, 0x40e, 0x466, 0x4be, 0x516, 0x56e, 0x5c6, 0x61e, 0x676, 0x6ce, 0x726,
        0x77e, 0x7d6, 0x82e, 0x886, 0x022, 0x07a, 0x0d2, 0x12a, 0x182, 0x1da, 0x232, 0x28a, 0x2e2,
        0x33a, 0x392, 0x3ea, 0x442, 0x49a, 0x4f2, 0x54a, 0x5a2, 0x5fa, 0x652, 0x6aa, 0x702, 0x75a,
        0x7b2, 0x80a, 0x862, 0x8ba,
    ],
    [
        0x307, 0x35f, 0x3b7, 0x40f, 0x467, 0x4bf, 0x517, 0x56f, 0x5c7, 0x61f, 0x677, 0x6cf, 0x727,
        0x77f, 0x7d7, 0x82f, 0x887, 0x023, 0x07b, 0x0d3, 0x12b, 0x183, 0x1db, 0x233, 0x28b, 0x2e3,
        0x33b, 0x393, 0x3eb, 0x443, 0x49b, 0x4f3, 0x54b, 0x5a3, 0x5fb, 0x653, 0x6ab, 0x703, 0x75b,
        0x7b3, 0x80b, 0x863, 0x8bb,
    ],
    [
        0x35c, 0x3b4, 0x40c, 0x464, 0x4bc, 0x514, 0x56c, 0x5c4, 0x61c, 0x674, 0x6cc, 0x724, 0x77c,
        0x7d4, 0x82c, 0x884, 0x020, 0x078, 0x0d0, 0x128, 0x180, 0x1d8, 0x230, 0x288, 0x2e0, 0x338,
        0x390, 0x3e8, 0x440, 0x498, 0x4f0, 0x548, 0x5a0, 0x5f8, 0x650, 0x6a8, 0x700, 0x758, 0x7b0,
        0x808, 0x860, 0x8b8, 0x054,
    ],
    [
        0x35d, 0x3b5, 0x40d, 0x465, 0x4bd, 0x515, 0x56d, 0x5c5, 0x61d, 0x675, 0x6cd, 0x725, 0x77d,
        0x7d5, 0x82d, 0x885, 0x021, 0x079, 0x0d1, 0x129, 0x181, 0x1d9, 0x231, 0x289, 0x2e1, 0x339,
        0x391, 0x3e9, 0x441, 0x499, 0x4f1, 0x549, 0x5a1, 0x5f9, 0x651, 0x6a9, 0x701, 0x759, 0x7b1,
        0x809, 0x861, 0x8b9, 0x055,
    ],
    [
        0x3b2, 0x40a, 0x462, 0x4ba, 0x512, 0x56a, 0x5c2, 0x61a, 0x672, 0x6ca, 0x722, 0x77a, 0x7d2,
        0x82a, 0x882, 0x01e, 0x076, 0x0ce, 0x126, 0x17e, 0x1d6, 0x22e, 0x286, 0x2de, 0x336, 0x38e,
        0x3e6, 0x43e, 0x496, 0x4ee, 0x546, 0x59e, 0x5f6, 0x64e, 0x6a6, 0x6fe, 0x756, 0x7ae, 0x806,
        0x85e, 0x8b6, 0x052, 0x0aa,
    ],
    [
        0x3b3, 0x40b, 0x463, 0x4bb, 0x513, 0x56b, 0x5c3, 0x61b, 0x673, 0x6cb, 0x723, 0x77b, 0x7d3,
        0x82b, 0x883, 0x01f, 0x077, 0x0cf, 0x127, 0x17f, 0x1d7, 0x22f, 0x287, 0x2df, 0x337, 0x38f,
        0x3e7, 0x43f, 0x497, 0x4ef, 0x547, 0x59f, 0x5f7, 0x64f, 0x6a7, 0x6ff, 0x757, 0x7af, 0x807,
        0x85f, 0x8b7, 0x053, 0x0ab,
    ],
    [
        0x408, 0x460, 0x4b8, 0x510, 0x568, 0x5c0, 0x618, 0x670, 0x6c8, 0x720, 0x778, 0x7d0, 0x828,
        0x880, 0x01c, 0x074, 0x0cc, 0x124, 0x17c, 0x1d4, 0x22c, 0x284, 0x2dc, 0x334, 0x38c, 0x3e4,
        0x43c, 0x494, 0x4ec, 0x544, 0x59c, 0x5f4, 0x64c, 0x6a4, 0x6fc, 0x754, 0x7ac, 0x804, 0x85c,
        0x8b4, 0x050, 0x0a8, 0x100,
    ],
    [
        0x409, 0x461, 0x4b9, 0x511, 0x569, 0x5c1, 0x619, 0x671, 0x6c9, 0x721, 0x779, 0x7d1, 0x829,
        0x881, 0x01d, 0x075, 0x0cd, 0x125, 0x17d, 0x1d5, 0x22d, 0x285, 0x2dd, 0x335, 0x38d, 0x3e5,
        0x43d, 0x495, 0x4ed, 0x545, 0x59d, 0x5f5, 0x64d, 0x6a5, 0x6fd, 0x755, 0x7ad, 0x805, 0x85d,
        0x8b5, 0x051, 0x0a9, 0x101,
    ],
    [
        0x45e, 0x4b6, 0x50e, 0x566, 0x5be, 0x616, 0x66e, 0x6c6, 0x71e, 0x776, 0x7ce, 0x826, 0x87e,
        0x01a, 0x072, 0x0ca, 0x122, 0x17a, 0x1d2, 0x22a, 0x282, 0x2da, 0x332, 0x38a, 0x3e2, 0x43a,
        0x492, 0x4ea, 0x542, 0x59a, 0x5f2, 0x64a, 0x6a2, 0x6fa, 0x752, 0x7aa, 0x802, 0x85a, 0x8b2,
        0x04e, 0x0a6, 0x0fe, 0x156,
    ],
    [
        0x45f, 0x4b7, 0x50f, 0x567, 0x5bf, 0x617, 0x66f, 0x6c7, 0x71f, 0x777, 0x7cf, 0x827, 0x87f,
        0x01b, 0x073, 0x0cb, 0x123, 0x17b, 0x1d3, 0x22b, 0x283, 0x2db, 0x333, 0x38b, 0x3e3, 0x43b,
        0x493, 0x4eb, 0x543, 0x59b, 0x5f3, 0x64b, 0x6a3, 0x6fb, 0x753, 0x7ab, 0x803, 0x85b, 0x8b3,
        0x04f, 0x0a7, 0x0ff, 0x157,
    ],
    [
        0x4b4, 0x50c, 0x564, 0x5bc, 0x614, 0x66c, 0x6c4, 0x71c, 0x774, 0x7cc, 0x824, 0x87c, 0x018,
        0x070, 0x0c8, 0x120, 0x178, 0x1d0, 0x228, 0x280, 0x2d8, 0x330, 0x388, 0x3e0, 0x438, 0x490,
        0x4e8, 0x540, 0x598, 0x5f0, 0x648, 0x6a0, 0x6f8, 0x750, 0x7a8, 0x800, 0x858, 0x8b0, 0x04c,
        0x0a4, 0x0fc, 0x154, 0x1ac,
    ],
    [
        0x4b5, 0x50d, 0x565, 0x5bd, 0x615, 0x66d, 0x6c5, 0x71d, 0x775, 0x7cd, 0x825, 0x87d, 0x019,
        0x071, 0x0c9, 0x121, 0x179, 0x1d1, 0x229, 0x281, 0x2d9, 0x331, 0x389, 0x3e1, 0x439, 0x491,
        0x4e9, 0x541, 0x599, 0x5f1, 0x649, 0x6a1, 0x6f9, 0x751, 0x7a9, 0x801, 0x859, 0x8b1, 0x04d,
        0x0a5, 0x0fd, 0x155, 0x1ad,
    ],
    [
        0x50a, 0x562, 0x5ba, 0x612, 0x66a, 0x6c2, 0x71a, 0x772, 0x7ca, 0x822, 0x87a, 0x016, 0x06e,
        0x0c6, 0x11e, 0x176, 0x1ce, 0x226, 0x27e, 0x2d6, 0x32e, 0x386, 0x3de, 0x436, 0x48e, 0x4e6,
        0x53e, 0x596, 0x5ee, 0x646, 0x69e, 0x6f6, 0x74e, 0x7a6, 0x7fe, 0x856, 0x8ae, 0x04a, 0x0a2,
        0x0fa, 0x152, 0x1aa, 0x202,
    ],
    [
        0x50b, 0x563, 0x5bb, 0x613, 0x66b, 0x6c3, 0x71b, 0x773, 0x7cb, 0x823, 0x87b, 0x017, 0x06f,
        0x0c7, 0x11f, 0x177, 0x1cf, 0x227, 0x27f, 0x2d7, 0x32f, 0x387, 0x3df, 0x437, 0x48f, 0x4e7,
        0x53f, 0x597, 0x5ef, 0x647, 0x69f, 0x6f7, 0x74f, 0x7a7, 0x7ff, 0x857, 0x8af, 0x04b, 0x0a3,
        0x0fb, 0x153, 0x1ab, 0x203,
    ],
    [
        0x560, 0x5b8, 0x610, 0x668, 0x6c0, 0x718, 0x770, 0x7c8, 0x820, 0x878, 0x014, 0x06c, 0x0c4,
        0x11c, 0x174, 0x1cc, 0x224, 0x27c, 0x2d4, 0x32c, 0x384, 0x3dc, 0x434, 0x48c, 0x4e4, 0x53c,
        0x594, 0x5ec, 0x644, 0x69c, 0x6f4, 0x74c, 0x7a4, 0x7fc, 0x854, 0x8ac, 0x048, 0x0a0, 0x0f8,
        0x150, 0x1a8, 0x200, 0x258,
    ],
    [
        0x561, 0x5b9, 0x611, 0x669, 0x6c1, 0x719, 0x771, 0x7c9, 0x821, 0x879, 0x015, 0x06d, 0x0c5,
        0x11d, 0x175, 0x1cd, 0x225, 0x27d, 0x2d5, 0x32d, 0x385, 0x3dd, 0x435, 0x48d, 0x4e5, 0x53d,
        0x595, 0x5ed, 0x645, 0x69d, 0x6f5, 0x74d, 0x7a5, 0x7fd, 0x855, 0x8ad, 0x049, 0x0a1, 0x0f9,
        0x151, 0x1a9, 0x201, 0x259,
    ],
    [
        0x5b6, 0x60e, 0x666, 0x6be, 0x716, 0x76e, 0x7c6, 0x81e, 0x876, 0x012, 0x06a, 0x0c2, 0x11a,
        0x172, 0x1ca, 0x222, 0x27a, 0x2d2, 0x32a, 0x382, 0x3da, 0x432, 0x48a, 0x4e2, 0x53a, 0x592,
        0x5ea, 0x642, 0x69a, 0x6f2, 0x74a, 0x7a2, 0x7fa, 0x852, 0x8aa, 0x046, 0x09e, 0x0f6, 0x14e,
        0x1a6, 0x1fe, 0x256, 0x2ae,
    ],
    [
        0x5b7, 0x60f, 0x667, 0x6bf, 0x717, 0x76f, 0x7c7, 0x81f, 0x877, 0x013, 0x06b, 0x0c3, 0x11b,
        0x173, 0x1cb, 0x223, 0x27b, 0x2d3, 0x32b, 0x383, 0x3db, 0x433, 0x48b, 0x4e3, 0x53b, 0x593,
        0x5eb, 0x643, 0x69b, 0x6f3, 0x74b, 0x7a3, 0x7fb, 0x853, 0x8ab, 0x047, 0x09f, 0x0f7, 0x14f,
        0x1a7, 0x1ff, 0x257, 0x2af,
    ],
    [
        0x60c, 0x664, 0x6bc, 0x714, 0x76c, 0x7c4, 0x81c, 0x874, 0x010, 0x068, 0x0c0, 0x118, 0x170,
        0x1c8, 0x220, 0x278, 0x2d0, 0x328, 0x380, 0x3d8, 0x430, 0x488, 0x4e0, 0x538, 0x590, 0x5e8,
        0x640, 0x698, 0x6f0, 0x748, 0x7a0, 0x7f8, 0x850, 0x8a8, 0x044, 0x09c, 0x0f4, 0x14c, 0x1a4,
        0x1fc, 0x254, 0x2ac, 0x304,
    ],
    [
        0x60d, 0x665, 0x6bd, 0x715, 0x76d, 0x7c5, 0x81d, 0x875, 0x011, 0x069, 0x0c1, 0x119, 0x171,
        0x1c9, 0x221, 0x279, 0x2d1, 0x329, 0x381, 0x3d9, 0x431, 0x489, 0x4e1, 0x539, 0x591, 0x5e9,
        0x641, 0x699, 0x6f1, 0x749, 0x7a1, 0x7f9, 0x851, 0x8a9, 0x045, 0x09d, 0x0f5, 0x14d, 0x1a5,
        0x1fd, 0x255, 0x2ad, 0x305,
    ],
    [
        0x662, 0x6ba, 0x712, 0x76a, 0x7c2, 0x81a, 0x872, 0x00e, 0x066, 0x0be, 0x116, 0x16e, 0x1c6,
        0x21e, 0x276, 0x2ce, 0x326, 0x37e, 0x3d6, 0x42e, 0x486, 0x4de, 0x536, 0x58e, 0x5e6, 0x63e,
        0x696, 0x6ee, 0x746, 0x79e, 0x7f6, 0x84e, 0x8a6, 0x042, 0x09a, 0x0f2, 0x14a, 0x1a2, 0x1fa,
        0x252, 0x2aa, 0x302, 0x35a,
    ],
    [
        0x663, 0x6bb, 0x713, 0x76b, 0x7c3, 0x81b, 0x873, 0x00f, 0x067, 0x0bf, 0x117, 0x16f, 0x1c7,
        0x21f, 0x277, 0x2cf, 0x327, 0x37f, 0x3d7, 0x42f, 0x487, 0x4df, 0x537, 0x58f, 0x5e7, 0x63f,
        0x697, 0x6ef, 0x747, 0x79f, 0x7f7, 0x84f, 0x8a7, 0x043, 0x09b, 0x0f3, 0x14b, 0x1a3, 0x1fb,
        0x253, 0x2ab, 0x303, 0x35b,
    ],
    [
        0x6b8, 0x710, 0x768, 0x7c0, 0x818, 0x870, 0x00c, 0x064, 0x0bc, 0x114, 0x16c, 0x1c4, 0x21c,
        0x274, 0x2cc, 0x324, 0x37c, 0x3d4, 0x42c, 0x484, 0x4dc, 0x534, 0x58c, 0x5e4, 0x63c, 0x694,
        0x6ec, 0x744, 0x79c, 0x7f4, 0x84c, 0x8a4, 0x040, 0x098, 0x0f0, 0x148, 0x1a0, 0x1f8, 0x250,
        0x2a8, 0x300, 0x358, 0x3b0,
    ],
    [
        0x6b9, 0x711, 0x769, 0x7c1, 0x819, 0x871, 0x00d, 0x065, 0x0bd, 0x115, 0x16d, 0x1c5, 0x21d,
        0x275, 0x2cd, 0x325, 0x37d, 0x3d5, 0x42d, 0x485, 0x4dd, 0x535, 0x58d, 0x5e5, 0x63d, 0x695,
        0x6ed, 0x745, 0x79d, 0x7f5, 0x84d, 0x8a5, 0x041, 0x099, 0x0f1, 0x149, 0x1a1, 0x1f9, 0x251,
        0x2a9, 0x301, 0x359, 0x3b1,
    ],
    [
        0x70e, 0x766, 0x7be, 0x816, 0x86e, 0x00a, 0x062, 0x0ba, 0x112, 0x16a, 0x1c2, 0x21a, 0x272,
        0x2ca, 0x322, 0x37a, 0x3d2, 0x42a, 0x482, 0x4da, 0x532, 0x58a, 0x5e2, 0x63a, 0x692, 0x6ea,
        0x742, 0x79a, 0x7f2, 0x84a, 0x8a2, 0x03e, 0x096, 0x0ee, 0x146, 0x19e, 0x1f6, 0x24e, 0x2a6,
        0x2fe, 0x356, 0x3ae, 0x406,
    ],
    [
        0x70f, 0x767, 0x7bf, 0x817, 0x86f, 0x00b, 0x063, 0x0bb, 0x113, 0x16b, 0x1c3, 0x21b, 0x273,
        0x2cb, 0x323, 0x37b, 0x3d3, 0x42b, 0x483, 0x4db, 0x533, 0x58b, 0x5e3, 0x63b, 0x693, 0x6eb,
        0x743, 0x79b, 0x7f3, 0x84b, 0x8a3, 0x03f, 0x097, 0x0ef, 0x147, 0x19f, 0x1f7, 0x24f, 0x2a7,
        0x2ff, 0x357, 0x3af, 0x407,
    ],
    [
        0x764, 0x7bc, 0x814, 0x86c, 0x008, 0x060, 0x0b8, 0x110, 0x168, 0x1c0, 0x218, 0x270, 0x2c8,
        0x320, 0x378, 0x3d0, 0x428, 0x480, 0x4d8, 0x530, 0x588, 0x5e0, 0x638, 0x690, 0x6e8, 0x740,
        0x798, 0x7f0, 0x848, 0x8a0, 0x03c, 0x094, 0x0ec, 0x144, 0x19c, 0x1f4, 0x24c, 0x2a4, 0x2fc,
        0x354, 0x3ac, 0x404, 0x45c,
    ],
    [
        0x765, 0x7bd, 0x815, 0x86d, 0x009, 0x061, 0x0b9, 0x111, 0x169, 0x1c1, 0x219, 0x271, 0x2c9,
        0x321, 0x379, 0x3d1, 0x429, 0x481, 0x4d9, 0x531, 0x589, 0x5e1, 0x639, 0x691, 0x6e9, 0x741,
        0x799, 0x7f1, 0x849, 0x8a1, 0x03d, 0x095, 0x0ed, 0x145, 0x19d, 0x1f5, 0x24d, 0x2a5, 0x2fd,
        0x355, 0x3ad, 0x405, 0x45d,
    ],
    [
        0x7ba, 0x812, 0x86a, 0x006, 0x05e, 0x0b6, 0x10e, 0x166, 0x1be, 0x216, 0x26e, 0x2c6, 0x31e,
        0x376, 0x3ce, 0x426, 0x47e, 0x4d6, 0x52e, 0x586, 0x5de, 0x636, 0x68e, 0x6e6, 0x73e, 0x796,
        0x7ee, 0x846, 0x89e, 0x03a, 0x092, 0x0ea, 0x142, 0x19a, 0x1f2, 0x24a, 0x2a2, 0x2fa, 0x352,
        0x3aa, 0x402, 0x45a, 0x4b2,
    ],
    [
        0x7bb, 0x813, 0x86b, 0x007, 0x05f, 0x0b7, 0x10f, 0x167, 0x1bf, 0x217, 0x26f, 0x2c7, 0x31f,
        0x377, 0x3cf, 0x427, 0x47f, 0x4d7, 0x52f, 0x587, 0x5df, 0x637, 0x68f, 0x6e7, 0x73f, 0x797,
        0x7ef, 0x847, 0x89f, 0x03b, 0x093, 0x0eb, 0x143, 0x19b, 0x1f3, 0x24b, 0x2a3, 0x2fb, 0x353,
        0x3ab, 0x403, 0x45b, 0x4b3,
    ],
    [
        0x810, 0x868, 0x004, 0x05c, 0x0b4, 0x10c, 0x164, 0x1bc, 0x214, 0x26c, 0x2c4, 0x31c, 0x374,
        0x3cc, 0x424, 0x47c, 0x4d4, 0x52c, 0x584, 0x5dc, 0x634, 0x68c, 0x6e4, 0x73c, 0x794, 0x7ec,
        0x844, 0x89c, 0x038, 0x090, 0x0e8, 0x140, 0x198, 0x1f0, 0x248, 0x2a0, 0x2f8, 0x350, 0x3a8,
        0x400, 0x458, 0x4b0, 0x508,
    ],
    [
        0x811, 0x869, 0x005, 0x05d, 0x0b5, 0x10d, 0x165, 0x1bd, 0x215, 0x26d, 0x2c5, 0x31d, 0x375,
        0x3cd, 0x425, 0x47d, 0x4d5, 0x52d, 0x585, 0x5dd, 0x635, 0x68d, 0x6e5, 0x73d, 0x795, 0x7ed,
        0x845, 0x89d, 0x039, 0x091, 0x0e9, 0x141, 0x199, 0x1f1, 0x249, 0x2a1, 0x2f9, 0x351, 0x3a9,
        0x401, 0x459, 0x4b1, 0x509,
    ],
    [
        0x866, 0x002, 0x05a, 0x0b2, 0x10a, 0x162, 0x1ba, 0x212, 0x26a, 0x2c2, 0x31a, 0x372, 0x3ca,
        0x422, 0x47a, 0x4d2, 0x52a, 0x582, 0x5da, 0x632, 0x68a, 0x6e2, 0x73a, 0x792, 0x7ea, 0x842,
        0x89a, 0x036, 0x08e, 0x0e6, 0x13e, 0x196, 0x1ee, 0x246, 0x29e, 0x2f6, 0x34e, 0x3a6, 0x3fe,
        0x456, 0x4ae, 0x506, 0x55e,
    ],
    [
        0x867, 0x003, 0x05b, 0x0b3, 0x10b, 0x163, 0x1bb, 0x213, 0x26b, 0x2c3, 0x31b, 0x373, 0x3cb,
        0x423, 0x47b, 0x4d3, 0x52b, 0x583, 0x5db, 0x633, 0x68b, 0x6e3, 0x73b, 0x793, 0x7eb, 0x843,
        0x89b, 0x037, 0x08f, 0x0e7, 0x13f, 0x197, 0x1ef, 0x247, 0x29f, 0x2f7, 0x34f, 0x3a7, 0x3ff,
        0x457, 0x4af, 0x507, 0x55f,
    ],
];

/// Return data from the sector at the given offset, masking anything particular to a mode
#[inline(always)]
const fn ecc_source_byte(sector: &[u8; CD_MAX_SECTOR_DATA as usize], offset: u16) -> u8 {
    // always treat first 4 bytes as null in mode 2
    if sector[CD_MODE_OFFSET] == 2 && offset < 4 {
        0
    } else {
        sector[CD_SYNC_OFFSET + CD_SYNC_NUM_BYTES + offset as usize]
    }
}

fn ecc_compute_bytes<const ROWLEN: usize>(
    sector: &[u8; CD_MAX_SECTOR_DATA as usize],
    row: &[u16; ROWLEN],
) -> (u8, u8) {
    let (mut val1, mut val2) = (0, 0);
    for byte in row.iter().take(ROWLEN) {
        val1 ^= ecc_source_byte(sector, *byte);
        val2 ^= ecc_source_byte(sector, *byte);
        val1 = ECC_LOW[val1 as usize];
    }

    val1 = ECC_HIGH[(ECC_LOW[val1 as usize] ^ val2) as usize];
    val2 ^= val1;
    (val1, val2)
}

/// A CD sector that contains ECC P and Q codes.
///
/// This trait is only implemented for `&mut [u8; CD_MAX_SECTOR_DATA as usize]`.
pub(crate) trait ErrorCorrectedSector {
    /// Reset the ECC P and Q codes to 0 within a sector
    fn clear_ecc(&mut self);

    /// Write ECC codes into the sector.
    fn generate_ecc(&mut self);

    /// Verify the ECC P and Q codes to 0 within a sector
    fn verify_ecc(&self) -> bool;
}

impl ErrorCorrectedSector for &mut [u8; CD_MAX_SECTOR_DATA as usize] {
    fn clear_ecc(&mut self) {
        self[ECC_P_OFFSET..][..2 * ECC_P_NUM_BYTES].fill(0);
        self[ECC_Q_OFFSET..][..2 * ECC_Q_NUM_BYTES].fill(0);
    }

    #[inline(always)]
    fn generate_ecc(&mut self) {
        // write P bytes
        for (idx, row) in ECC_P_OFF.iter().enumerate() {
            let (val1, val2) = ecc_compute_bytes(self, row);
            self[ECC_P_OFFSET + idx] = val1;
            self[ECC_P_OFFSET + ECC_P_NUM_BYTES + idx] = val2;
        }

        // verify Q bytes
        for (idx, row) in ECC_Q_OFF.iter().enumerate() {
            let (val1, val2) = ecc_compute_bytes(self, row);
            self[ECC_Q_OFFSET + idx] = val1;
            self[ECC_Q_OFFSET + ECC_Q_NUM_BYTES + idx] = val2;
        }
    }

    fn verify_ecc(&self) -> bool {
        // verify P bytes
        for (idx, row) in ECC_P_OFF.iter().enumerate() {
            let (val1, val2) = ecc_compute_bytes(self, row);
            if self[ECC_P_OFFSET + idx] != val1
                || self[ECC_P_OFFSET + ECC_P_NUM_BYTES + idx] != val2
            {
                return false;
            }
        }

        // verify Q bytes
        for (idx, row) in ECC_Q_OFF.iter().enumerate() {
            let (val1, val2) = ecc_compute_bytes(self, row);
            if self[ECC_Q_OFFSET + idx] != val1
                || self[ECC_Q_OFFSET + ECC_Q_NUM_BYTES + idx] != val2
            {
                return false;
            }
        }
        true
    }
}