dsi-bitstream 0.7.0

A Rust implementation of read/write bit streams supporting several types of instantaneous codes
Documentation
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
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
#![doc(hidden)]
// THIS FILE HAS BEEN GENERATED BY THE SCRIPT gen_code_tables.py
// ~~~~~~~~~~~~~~~~~~~ DO NOT MODIFY ~~~~~~~~~~~~~~~~~~~~~~
// Methods for reading and writing values using precomputed tables for pi codes
use crate::traits::{BE, BitRead, BitWrite, LE};
use common_traits::*;
/// How many bits are needed to read the tables in this
pub const READ_BITS: usize = 12;
/// Maximum value writable using the table(s)
pub const WRITE_MAX: u64 = 1023;

/// Reads a value using a decoding table.
///
/// If the result is `Some` the decoding was successful, and
/// the decoded value and the length of the code are returned.
#[inline(always)]
pub fn read_table_le<B: BitRead<LE>>(backend: &mut B) -> Option<(u64, usize)> {
    if let Ok(idx) = backend.peek_bits(READ_BITS) {
        let idx = idx.cast() as usize;
        let len = READ_LEN_LE[idx];
        if len != MISSING_VALUE_LEN_LE {
            backend.skip_bits_after_peek(len as usize);
            return Some((READ_LE[idx] as u64, len as usize));
        }
    }
    None
}

/// Writes a value using an encoding table.
///
/// If the result is `Some` the encoding was successful, and
/// length of the code is returned.
#[inline(always)]
pub fn write_table_le<B: BitWrite<LE>>(
    backend: &mut B,
    value: u64,
) -> Result<Option<usize>, B::Error> {
    Ok(if let Some(bits) = WRITE_LE.get(value as usize) {
        let len = WRITE_LEN_LE[value as usize] as usize;
        backend.write_bits(*bits as u64, len)?;
        Some(len)
    } else {
        None
    })
}

/// Reads a value using a decoding table.
///
/// If the result is `Some` the decoding was successful, and
/// the decoded value and the length of the code are returned.
#[inline(always)]
pub fn read_table_be<B: BitRead<BE>>(backend: &mut B) -> Option<(u64, usize)> {
    if let Ok(idx) = backend.peek_bits(READ_BITS) {
        let idx = idx.cast() as usize;
        let len = READ_LEN_BE[idx];
        if len != MISSING_VALUE_LEN_BE {
            backend.skip_bits_after_peek(len as usize);
            return Some((READ_BE[idx] as u64, len as usize));
        }
    }
    None
}

/// Writes a value using an encoding table.
///
/// If the result is `Some` the encoding was successful, and
/// length of the code is returned.
#[inline(always)]
pub fn write_table_be<B: BitWrite<BE>>(
    backend: &mut B,
    value: u64,
) -> Result<Option<usize>, B::Error> {
    Ok(if let Some(bits) = WRITE_BE.get(value as usize) {
        let len = WRITE_LEN_BE[value as usize] as usize;
        backend.write_bits(*bits as u64, len)?;
        Some(len)
    } else {
        None
    })
}
/// The len we assign to a code that cannot be decoded through the table
pub const MISSING_VALUE_LEN_BE: u8 = 12;
/// Precomputed table for writing pi codes
pub const READ_BE: &[u8] = &[
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16,
    16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
    18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19,
    19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
    21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22,
    22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
    24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25,
    25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28,
    28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
    30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31,
    32, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, 34, 34,
    35, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37,
    38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40,
    41, 41, 41, 41, 41, 41, 41, 41, 42, 42, 42, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 43, 43, 43,
    44, 44, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, 46,
    47, 47, 47, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 49, 49, 49,
    50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 52, 52, 52,
    53, 53, 53, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55,
    56, 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58, 58, 58, 58,
    59, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 61, 61, 61,
    62, 62, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 64, 64, 64, 64, 65, 65, 65, 65, 66, 66, 66, 66,
    67, 67, 67, 67, 68, 68, 68, 68, 69, 69, 69, 69, 70, 70, 70, 70, 71, 71, 71, 71, 72, 72, 72, 72,
    73, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 75, 76, 76, 76, 76, 77, 77, 77, 77, 78, 78, 78, 78,
    79, 79, 79, 79, 80, 80, 80, 80, 81, 81, 81, 81, 82, 82, 82, 82, 83, 83, 83, 83, 84, 84, 84, 84,
    85, 85, 85, 85, 86, 86, 86, 86, 87, 87, 87, 87, 88, 88, 88, 88, 89, 89, 89, 89, 90, 90, 90, 90,
    91, 91, 91, 91, 92, 92, 92, 92, 93, 93, 93, 93, 94, 94, 94, 94, 95, 95, 95, 95, 96, 96, 96, 96,
    97, 97, 97, 97, 98, 98, 98, 98, 99, 99, 99, 99, 100, 100, 100, 100, 101, 101, 101, 101, 102,
    102, 102, 102, 103, 103, 103, 103, 104, 104, 104, 104, 105, 105, 105, 105, 106, 106, 106, 106,
    107, 107, 107, 107, 108, 108, 108, 108, 109, 109, 109, 109, 110, 110, 110, 110, 111, 111, 111,
    111, 112, 112, 112, 112, 113, 113, 113, 113, 114, 114, 114, 114, 115, 115, 115, 115, 116, 116,
    116, 116, 117, 117, 117, 117, 118, 118, 118, 118, 119, 119, 119, 119, 120, 120, 120, 120, 121,
    121, 121, 121, 122, 122, 122, 122, 123, 123, 123, 123, 124, 124, 124, 124, 125, 125, 125, 125,
    126, 126, 126, 126, 127, 127, 128, 128, 129, 129, 130, 130, 131, 131, 132, 132, 133, 133, 134,
    134, 135, 135, 136, 136, 137, 137, 138, 138, 139, 139, 140, 140, 141, 141, 142, 142, 143, 143,
    144, 144, 145, 145, 146, 146, 147, 147, 148, 148, 149, 149, 150, 150, 151, 151, 152, 152, 153,
    153, 154, 154, 155, 155, 156, 156, 157, 157, 158, 158, 159, 159, 160, 160, 161, 161, 162, 162,
    163, 163, 164, 164, 165, 165, 166, 166, 167, 167, 168, 168, 169, 169, 170, 170, 171, 171, 172,
    172, 173, 173, 174, 174, 175, 175, 176, 176, 177, 177, 178, 178, 179, 179, 180, 180, 181, 181,
    182, 182, 183, 183, 184, 184, 185, 185, 186, 186, 187, 187, 188, 188, 189, 189, 190, 190, 191,
    191, 192, 192, 193, 193, 194, 194, 195, 195, 196, 196, 197, 197, 198, 198, 199, 199, 200, 200,
    201, 201, 202, 202, 203, 203, 204, 204, 205, 205, 206, 206, 207, 207, 208, 208, 209, 209, 210,
    210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216, 216, 217, 217, 218, 218, 219, 219,
    220, 220, 221, 221, 222, 222, 223, 223, 224, 224, 225, 225, 226, 226, 227, 227, 228, 228, 229,
    229, 230, 230, 231, 231, 232, 232, 233, 233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238,
    239, 239, 240, 240, 241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 247, 247, 248,
    248, 249, 249, 250, 250, 251, 251, 252, 252, 253, 253, 254, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14,
];
/// Precomputed lengths table for reading pi codes
pub const READ_LEN_BE: &[u8] = &[
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
    12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
    8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6,
];
/// The len we assign to a code that cannot be decoded through the table
pub const MISSING_VALUE_LEN_LE: u8 = 12;
/// Precomputed table for writing pi codes
pub const READ_LE: &[u8] = &[
    0, 0, 15, 1, 0, 3, 31, 7, 0, 0, 63, 2, 0, 4, 127, 8, 0, 0, 16, 1, 0, 5, 32, 9, 0, 0, 64, 2, 0,
    6, 128, 10, 0, 0, 17, 1, 0, 3, 33, 11, 0, 0, 65, 2, 0, 4, 129, 12, 0, 0, 18, 1, 0, 5, 34, 13,
    0, 0, 66, 2, 0, 6, 130, 14, 0, 0, 19, 1, 0, 3, 35, 7, 0, 0, 67, 2, 0, 4, 131, 8, 0, 0, 20, 1,
    0, 5, 36, 9, 0, 0, 68, 2, 0, 6, 132, 10, 0, 0, 21, 1, 0, 3, 37, 11, 0, 0, 69, 2, 0, 4, 133, 12,
    0, 0, 22, 1, 0, 5, 38, 13, 0, 0, 70, 2, 0, 6, 134, 14, 0, 0, 23, 1, 0, 3, 39, 7, 0, 0, 71, 2,
    0, 4, 135, 8, 0, 0, 24, 1, 0, 5, 40, 9, 0, 0, 72, 2, 0, 6, 136, 10, 0, 0, 25, 1, 0, 3, 41, 11,
    0, 0, 73, 2, 0, 4, 137, 12, 0, 0, 26, 1, 0, 5, 42, 13, 0, 0, 74, 2, 0, 6, 138, 14, 0, 0, 27, 1,
    0, 3, 43, 7, 0, 0, 75, 2, 0, 4, 139, 8, 0, 0, 28, 1, 0, 5, 44, 9, 0, 0, 76, 2, 0, 6, 140, 10,
    0, 0, 29, 1, 0, 3, 45, 11, 0, 0, 77, 2, 0, 4, 141, 12, 0, 0, 30, 1, 0, 5, 46, 13, 0, 0, 78, 2,
    0, 6, 142, 14, 0, 0, 15, 1, 0, 3, 47, 7, 0, 0, 79, 2, 0, 4, 143, 8, 0, 0, 16, 1, 0, 5, 48, 9,
    0, 0, 80, 2, 0, 6, 144, 10, 0, 0, 17, 1, 0, 3, 49, 11, 0, 0, 81, 2, 0, 4, 145, 12, 0, 0, 18, 1,
    0, 5, 50, 13, 0, 0, 82, 2, 0, 6, 146, 14, 0, 0, 19, 1, 0, 3, 51, 7, 0, 0, 83, 2, 0, 4, 147, 8,
    0, 0, 20, 1, 0, 5, 52, 9, 0, 0, 84, 2, 0, 6, 148, 10, 0, 0, 21, 1, 0, 3, 53, 11, 0, 0, 85, 2,
    0, 4, 149, 12, 0, 0, 22, 1, 0, 5, 54, 13, 0, 0, 86, 2, 0, 6, 150, 14, 0, 0, 23, 1, 0, 3, 55, 7,
    0, 0, 87, 2, 0, 4, 151, 8, 0, 0, 24, 1, 0, 5, 56, 9, 0, 0, 88, 2, 0, 6, 152, 10, 0, 0, 25, 1,
    0, 3, 57, 11, 0, 0, 89, 2, 0, 4, 153, 12, 0, 0, 26, 1, 0, 5, 58, 13, 0, 0, 90, 2, 0, 6, 154,
    14, 0, 0, 27, 1, 0, 3, 59, 7, 0, 0, 91, 2, 0, 4, 155, 8, 0, 0, 28, 1, 0, 5, 60, 9, 0, 0, 92, 2,
    0, 6, 156, 10, 0, 0, 29, 1, 0, 3, 61, 11, 0, 0, 93, 2, 0, 4, 157, 12, 0, 0, 30, 1, 0, 5, 62,
    13, 0, 0, 94, 2, 0, 6, 158, 14, 0, 0, 15, 1, 0, 3, 31, 7, 0, 0, 95, 2, 0, 4, 159, 8, 0, 0, 16,
    1, 0, 5, 32, 9, 0, 0, 96, 2, 0, 6, 160, 10, 0, 0, 17, 1, 0, 3, 33, 11, 0, 0, 97, 2, 0, 4, 161,
    12, 0, 0, 18, 1, 0, 5, 34, 13, 0, 0, 98, 2, 0, 6, 162, 14, 0, 0, 19, 1, 0, 3, 35, 7, 0, 0, 99,
    2, 0, 4, 163, 8, 0, 0, 20, 1, 0, 5, 36, 9, 0, 0, 100, 2, 0, 6, 164, 10, 0, 0, 21, 1, 0, 3, 37,
    11, 0, 0, 101, 2, 0, 4, 165, 12, 0, 0, 22, 1, 0, 5, 38, 13, 0, 0, 102, 2, 0, 6, 166, 14, 0, 0,
    23, 1, 0, 3, 39, 7, 0, 0, 103, 2, 0, 4, 167, 8, 0, 0, 24, 1, 0, 5, 40, 9, 0, 0, 104, 2, 0, 6,
    168, 10, 0, 0, 25, 1, 0, 3, 41, 11, 0, 0, 105, 2, 0, 4, 169, 12, 0, 0, 26, 1, 0, 5, 42, 13, 0,
    0, 106, 2, 0, 6, 170, 14, 0, 0, 27, 1, 0, 3, 43, 7, 0, 0, 107, 2, 0, 4, 171, 8, 0, 0, 28, 1, 0,
    5, 44, 9, 0, 0, 108, 2, 0, 6, 172, 10, 0, 0, 29, 1, 0, 3, 45, 11, 0, 0, 109, 2, 0, 4, 173, 12,
    0, 0, 30, 1, 0, 5, 46, 13, 0, 0, 110, 2, 0, 6, 174, 14, 0, 0, 15, 1, 0, 3, 47, 7, 0, 0, 111, 2,
    0, 4, 175, 8, 0, 0, 16, 1, 0, 5, 48, 9, 0, 0, 112, 2, 0, 6, 176, 10, 0, 0, 17, 1, 0, 3, 49, 11,
    0, 0, 113, 2, 0, 4, 177, 12, 0, 0, 18, 1, 0, 5, 50, 13, 0, 0, 114, 2, 0, 6, 178, 14, 0, 0, 19,
    1, 0, 3, 51, 7, 0, 0, 115, 2, 0, 4, 179, 8, 0, 0, 20, 1, 0, 5, 52, 9, 0, 0, 116, 2, 0, 6, 180,
    10, 0, 0, 21, 1, 0, 3, 53, 11, 0, 0, 117, 2, 0, 4, 181, 12, 0, 0, 22, 1, 0, 5, 54, 13, 0, 0,
    118, 2, 0, 6, 182, 14, 0, 0, 23, 1, 0, 3, 55, 7, 0, 0, 119, 2, 0, 4, 183, 8, 0, 0, 24, 1, 0, 5,
    56, 9, 0, 0, 120, 2, 0, 6, 184, 10, 0, 0, 25, 1, 0, 3, 57, 11, 0, 0, 121, 2, 0, 4, 185, 12, 0,
    0, 26, 1, 0, 5, 58, 13, 0, 0, 122, 2, 0, 6, 186, 14, 0, 0, 27, 1, 0, 3, 59, 7, 0, 0, 123, 2, 0,
    4, 187, 8, 0, 0, 28, 1, 0, 5, 60, 9, 0, 0, 124, 2, 0, 6, 188, 10, 0, 0, 29, 1, 0, 3, 61, 11, 0,
    0, 125, 2, 0, 4, 189, 12, 0, 0, 30, 1, 0, 5, 62, 13, 0, 0, 126, 2, 0, 6, 190, 14, 0, 0, 15, 1,
    0, 3, 31, 7, 0, 0, 63, 2, 0, 4, 191, 8, 0, 0, 16, 1, 0, 5, 32, 9, 0, 0, 64, 2, 0, 6, 192, 10,
    0, 0, 17, 1, 0, 3, 33, 11, 0, 0, 65, 2, 0, 4, 193, 12, 0, 0, 18, 1, 0, 5, 34, 13, 0, 0, 66, 2,
    0, 6, 194, 14, 0, 0, 19, 1, 0, 3, 35, 7, 0, 0, 67, 2, 0, 4, 195, 8, 0, 0, 20, 1, 0, 5, 36, 9,
    0, 0, 68, 2, 0, 6, 196, 10, 0, 0, 21, 1, 0, 3, 37, 11, 0, 0, 69, 2, 0, 4, 197, 12, 0, 0, 22, 1,
    0, 5, 38, 13, 0, 0, 70, 2, 0, 6, 198, 14, 0, 0, 23, 1, 0, 3, 39, 7, 0, 0, 71, 2, 0, 4, 199, 8,
    0, 0, 24, 1, 0, 5, 40, 9, 0, 0, 72, 2, 0, 6, 200, 10, 0, 0, 25, 1, 0, 3, 41, 11, 0, 0, 73, 2,
    0, 4, 201, 12, 0, 0, 26, 1, 0, 5, 42, 13, 0, 0, 74, 2, 0, 6, 202, 14, 0, 0, 27, 1, 0, 3, 43, 7,
    0, 0, 75, 2, 0, 4, 203, 8, 0, 0, 28, 1, 0, 5, 44, 9, 0, 0, 76, 2, 0, 6, 204, 10, 0, 0, 29, 1,
    0, 3, 45, 11, 0, 0, 77, 2, 0, 4, 205, 12, 0, 0, 30, 1, 0, 5, 46, 13, 0, 0, 78, 2, 0, 6, 206,
    14, 0, 0, 15, 1, 0, 3, 47, 7, 0, 0, 79, 2, 0, 4, 207, 8, 0, 0, 16, 1, 0, 5, 48, 9, 0, 0, 80, 2,
    0, 6, 208, 10, 0, 0, 17, 1, 0, 3, 49, 11, 0, 0, 81, 2, 0, 4, 209, 12, 0, 0, 18, 1, 0, 5, 50,
    13, 0, 0, 82, 2, 0, 6, 210, 14, 0, 0, 19, 1, 0, 3, 51, 7, 0, 0, 83, 2, 0, 4, 211, 8, 0, 0, 20,
    1, 0, 5, 52, 9, 0, 0, 84, 2, 0, 6, 212, 10, 0, 0, 21, 1, 0, 3, 53, 11, 0, 0, 85, 2, 0, 4, 213,
    12, 0, 0, 22, 1, 0, 5, 54, 13, 0, 0, 86, 2, 0, 6, 214, 14, 0, 0, 23, 1, 0, 3, 55, 7, 0, 0, 87,
    2, 0, 4, 215, 8, 0, 0, 24, 1, 0, 5, 56, 9, 0, 0, 88, 2, 0, 6, 216, 10, 0, 0, 25, 1, 0, 3, 57,
    11, 0, 0, 89, 2, 0, 4, 217, 12, 0, 0, 26, 1, 0, 5, 58, 13, 0, 0, 90, 2, 0, 6, 218, 14, 0, 0,
    27, 1, 0, 3, 59, 7, 0, 0, 91, 2, 0, 4, 219, 8, 0, 0, 28, 1, 0, 5, 60, 9, 0, 0, 92, 2, 0, 6,
    220, 10, 0, 0, 29, 1, 0, 3, 61, 11, 0, 0, 93, 2, 0, 4, 221, 12, 0, 0, 30, 1, 0, 5, 62, 13, 0,
    0, 94, 2, 0, 6, 222, 14, 0, 0, 15, 1, 0, 3, 31, 7, 0, 0, 95, 2, 0, 4, 223, 8, 0, 0, 16, 1, 0,
    5, 32, 9, 0, 0, 96, 2, 0, 6, 224, 10, 0, 0, 17, 1, 0, 3, 33, 11, 0, 0, 97, 2, 0, 4, 225, 12, 0,
    0, 18, 1, 0, 5, 34, 13, 0, 0, 98, 2, 0, 6, 226, 14, 0, 0, 19, 1, 0, 3, 35, 7, 0, 0, 99, 2, 0,
    4, 227, 8, 0, 0, 20, 1, 0, 5, 36, 9, 0, 0, 100, 2, 0, 6, 228, 10, 0, 0, 21, 1, 0, 3, 37, 11, 0,
    0, 101, 2, 0, 4, 229, 12, 0, 0, 22, 1, 0, 5, 38, 13, 0, 0, 102, 2, 0, 6, 230, 14, 0, 0, 23, 1,
    0, 3, 39, 7, 0, 0, 103, 2, 0, 4, 231, 8, 0, 0, 24, 1, 0, 5, 40, 9, 0, 0, 104, 2, 0, 6, 232, 10,
    0, 0, 25, 1, 0, 3, 41, 11, 0, 0, 105, 2, 0, 4, 233, 12, 0, 0, 26, 1, 0, 5, 42, 13, 0, 0, 106,
    2, 0, 6, 234, 14, 0, 0, 27, 1, 0, 3, 43, 7, 0, 0, 107, 2, 0, 4, 235, 8, 0, 0, 28, 1, 0, 5, 44,
    9, 0, 0, 108, 2, 0, 6, 236, 10, 0, 0, 29, 1, 0, 3, 45, 11, 0, 0, 109, 2, 0, 4, 237, 12, 0, 0,
    30, 1, 0, 5, 46, 13, 0, 0, 110, 2, 0, 6, 238, 14, 0, 0, 15, 1, 0, 3, 47, 7, 0, 0, 111, 2, 0, 4,
    239, 8, 0, 0, 16, 1, 0, 5, 48, 9, 0, 0, 112, 2, 0, 6, 240, 10, 0, 0, 17, 1, 0, 3, 49, 11, 0, 0,
    113, 2, 0, 4, 241, 12, 0, 0, 18, 1, 0, 5, 50, 13, 0, 0, 114, 2, 0, 6, 242, 14, 0, 0, 19, 1, 0,
    3, 51, 7, 0, 0, 115, 2, 0, 4, 243, 8, 0, 0, 20, 1, 0, 5, 52, 9, 0, 0, 116, 2, 0, 6, 244, 10, 0,
    0, 21, 1, 0, 3, 53, 11, 0, 0, 117, 2, 0, 4, 245, 12, 0, 0, 22, 1, 0, 5, 54, 13, 0, 0, 118, 2,
    0, 6, 246, 14, 0, 0, 23, 1, 0, 3, 55, 7, 0, 0, 119, 2, 0, 4, 247, 8, 0, 0, 24, 1, 0, 5, 56, 9,
    0, 0, 120, 2, 0, 6, 248, 10, 0, 0, 25, 1, 0, 3, 57, 11, 0, 0, 121, 2, 0, 4, 249, 12, 0, 0, 26,
    1, 0, 5, 58, 13, 0, 0, 122, 2, 0, 6, 250, 14, 0, 0, 27, 1, 0, 3, 59, 7, 0, 0, 123, 2, 0, 4,
    251, 8, 0, 0, 28, 1, 0, 5, 60, 9, 0, 0, 124, 2, 0, 6, 252, 10, 0, 0, 29, 1, 0, 3, 61, 11, 0, 0,
    125, 2, 0, 4, 253, 12, 0, 0, 30, 1, 0, 5, 62, 13, 0, 0, 126, 2, 0, 6, 254, 14, 0, 0, 15, 1, 0,
    3, 31, 7, 0, 0, 63, 2, 0, 4, 127, 8, 0, 0, 16, 1, 0, 5, 32, 9, 0, 0, 64, 2, 0, 6, 128, 10, 0,
    0, 17, 1, 0, 3, 33, 11, 0, 0, 65, 2, 0, 4, 129, 12, 0, 0, 18, 1, 0, 5, 34, 13, 0, 0, 66, 2, 0,
    6, 130, 14, 0, 0, 19, 1, 0, 3, 35, 7, 0, 0, 67, 2, 0, 4, 131, 8, 0, 0, 20, 1, 0, 5, 36, 9, 0,
    0, 68, 2, 0, 6, 132, 10, 0, 0, 21, 1, 0, 3, 37, 11, 0, 0, 69, 2, 0, 4, 133, 12, 0, 0, 22, 1, 0,
    5, 38, 13, 0, 0, 70, 2, 0, 6, 134, 14, 0, 0, 23, 1, 0, 3, 39, 7, 0, 0, 71, 2, 0, 4, 135, 8, 0,
    0, 24, 1, 0, 5, 40, 9, 0, 0, 72, 2, 0, 6, 136, 10, 0, 0, 25, 1, 0, 3, 41, 11, 0, 0, 73, 2, 0,
    4, 137, 12, 0, 0, 26, 1, 0, 5, 42, 13, 0, 0, 74, 2, 0, 6, 138, 14, 0, 0, 27, 1, 0, 3, 43, 7, 0,
    0, 75, 2, 0, 4, 139, 8, 0, 0, 28, 1, 0, 5, 44, 9, 0, 0, 76, 2, 0, 6, 140, 10, 0, 0, 29, 1, 0,
    3, 45, 11, 0, 0, 77, 2, 0, 4, 141, 12, 0, 0, 30, 1, 0, 5, 46, 13, 0, 0, 78, 2, 0, 6, 142, 14,
    0, 0, 15, 1, 0, 3, 47, 7, 0, 0, 79, 2, 0, 4, 143, 8, 0, 0, 16, 1, 0, 5, 48, 9, 0, 0, 80, 2, 0,
    6, 144, 10, 0, 0, 17, 1, 0, 3, 49, 11, 0, 0, 81, 2, 0, 4, 145, 12, 0, 0, 18, 1, 0, 5, 50, 13,
    0, 0, 82, 2, 0, 6, 146, 14, 0, 0, 19, 1, 0, 3, 51, 7, 0, 0, 83, 2, 0, 4, 147, 8, 0, 0, 20, 1,
    0, 5, 52, 9, 0, 0, 84, 2, 0, 6, 148, 10, 0, 0, 21, 1, 0, 3, 53, 11, 0, 0, 85, 2, 0, 4, 149, 12,
    0, 0, 22, 1, 0, 5, 54, 13, 0, 0, 86, 2, 0, 6, 150, 14, 0, 0, 23, 1, 0, 3, 55, 7, 0, 0, 87, 2,
    0, 4, 151, 8, 0, 0, 24, 1, 0, 5, 56, 9, 0, 0, 88, 2, 0, 6, 152, 10, 0, 0, 25, 1, 0, 3, 57, 11,
    0, 0, 89, 2, 0, 4, 153, 12, 0, 0, 26, 1, 0, 5, 58, 13, 0, 0, 90, 2, 0, 6, 154, 14, 0, 0, 27, 1,
    0, 3, 59, 7, 0, 0, 91, 2, 0, 4, 155, 8, 0, 0, 28, 1, 0, 5, 60, 9, 0, 0, 92, 2, 0, 6, 156, 10,
    0, 0, 29, 1, 0, 3, 61, 11, 0, 0, 93, 2, 0, 4, 157, 12, 0, 0, 30, 1, 0, 5, 62, 13, 0, 0, 94, 2,
    0, 6, 158, 14, 0, 0, 15, 1, 0, 3, 31, 7, 0, 0, 95, 2, 0, 4, 159, 8, 0, 0, 16, 1, 0, 5, 32, 9,
    0, 0, 96, 2, 0, 6, 160, 10, 0, 0, 17, 1, 0, 3, 33, 11, 0, 0, 97, 2, 0, 4, 161, 12, 0, 0, 18, 1,
    0, 5, 34, 13, 0, 0, 98, 2, 0, 6, 162, 14, 0, 0, 19, 1, 0, 3, 35, 7, 0, 0, 99, 2, 0, 4, 163, 8,
    0, 0, 20, 1, 0, 5, 36, 9, 0, 0, 100, 2, 0, 6, 164, 10, 0, 0, 21, 1, 0, 3, 37, 11, 0, 0, 101, 2,
    0, 4, 165, 12, 0, 0, 22, 1, 0, 5, 38, 13, 0, 0, 102, 2, 0, 6, 166, 14, 0, 0, 23, 1, 0, 3, 39,
    7, 0, 0, 103, 2, 0, 4, 167, 8, 0, 0, 24, 1, 0, 5, 40, 9, 0, 0, 104, 2, 0, 6, 168, 10, 0, 0, 25,
    1, 0, 3, 41, 11, 0, 0, 105, 2, 0, 4, 169, 12, 0, 0, 26, 1, 0, 5, 42, 13, 0, 0, 106, 2, 0, 6,
    170, 14, 0, 0, 27, 1, 0, 3, 43, 7, 0, 0, 107, 2, 0, 4, 171, 8, 0, 0, 28, 1, 0, 5, 44, 9, 0, 0,
    108, 2, 0, 6, 172, 10, 0, 0, 29, 1, 0, 3, 45, 11, 0, 0, 109, 2, 0, 4, 173, 12, 0, 0, 30, 1, 0,
    5, 46, 13, 0, 0, 110, 2, 0, 6, 174, 14, 0, 0, 15, 1, 0, 3, 47, 7, 0, 0, 111, 2, 0, 4, 175, 8,
    0, 0, 16, 1, 0, 5, 48, 9, 0, 0, 112, 2, 0, 6, 176, 10, 0, 0, 17, 1, 0, 3, 49, 11, 0, 0, 113, 2,
    0, 4, 177, 12, 0, 0, 18, 1, 0, 5, 50, 13, 0, 0, 114, 2, 0, 6, 178, 14, 0, 0, 19, 1, 0, 3, 51,
    7, 0, 0, 115, 2, 0, 4, 179, 8, 0, 0, 20, 1, 0, 5, 52, 9, 0, 0, 116, 2, 0, 6, 180, 10, 0, 0, 21,
    1, 0, 3, 53, 11, 0, 0, 117, 2, 0, 4, 181, 12, 0, 0, 22, 1, 0, 5, 54, 13, 0, 0, 118, 2, 0, 6,
    182, 14, 0, 0, 23, 1, 0, 3, 55, 7, 0, 0, 119, 2, 0, 4, 183, 8, 0, 0, 24, 1, 0, 5, 56, 9, 0, 0,
    120, 2, 0, 6, 184, 10, 0, 0, 25, 1, 0, 3, 57, 11, 0, 0, 121, 2, 0, 4, 185, 12, 0, 0, 26, 1, 0,
    5, 58, 13, 0, 0, 122, 2, 0, 6, 186, 14, 0, 0, 27, 1, 0, 3, 59, 7, 0, 0, 123, 2, 0, 4, 187, 8,
    0, 0, 28, 1, 0, 5, 60, 9, 0, 0, 124, 2, 0, 6, 188, 10, 0, 0, 29, 1, 0, 3, 61, 11, 0, 0, 125, 2,
    0, 4, 189, 12, 0, 0, 30, 1, 0, 5, 62, 13, 0, 0, 126, 2, 0, 6, 190, 14, 0, 0, 15, 1, 0, 3, 31,
    7, 0, 0, 63, 2, 0, 4, 191, 8, 0, 0, 16, 1, 0, 5, 32, 9, 0, 0, 64, 2, 0, 6, 192, 10, 0, 0, 17,
    1, 0, 3, 33, 11, 0, 0, 65, 2, 0, 4, 193, 12, 0, 0, 18, 1, 0, 5, 34, 13, 0, 0, 66, 2, 0, 6, 194,
    14, 0, 0, 19, 1, 0, 3, 35, 7, 0, 0, 67, 2, 0, 4, 195, 8, 0, 0, 20, 1, 0, 5, 36, 9, 0, 0, 68, 2,
    0, 6, 196, 10, 0, 0, 21, 1, 0, 3, 37, 11, 0, 0, 69, 2, 0, 4, 197, 12, 0, 0, 22, 1, 0, 5, 38,
    13, 0, 0, 70, 2, 0, 6, 198, 14, 0, 0, 23, 1, 0, 3, 39, 7, 0, 0, 71, 2, 0, 4, 199, 8, 0, 0, 24,
    1, 0, 5, 40, 9, 0, 0, 72, 2, 0, 6, 200, 10, 0, 0, 25, 1, 0, 3, 41, 11, 0, 0, 73, 2, 0, 4, 201,
    12, 0, 0, 26, 1, 0, 5, 42, 13, 0, 0, 74, 2, 0, 6, 202, 14, 0, 0, 27, 1, 0, 3, 43, 7, 0, 0, 75,
    2, 0, 4, 203, 8, 0, 0, 28, 1, 0, 5, 44, 9, 0, 0, 76, 2, 0, 6, 204, 10, 0, 0, 29, 1, 0, 3, 45,
    11, 0, 0, 77, 2, 0, 4, 205, 12, 0, 0, 30, 1, 0, 5, 46, 13, 0, 0, 78, 2, 0, 6, 206, 14, 0, 0,
    15, 1, 0, 3, 47, 7, 0, 0, 79, 2, 0, 4, 207, 8, 0, 0, 16, 1, 0, 5, 48, 9, 0, 0, 80, 2, 0, 6,
    208, 10, 0, 0, 17, 1, 0, 3, 49, 11, 0, 0, 81, 2, 0, 4, 209, 12, 0, 0, 18, 1, 0, 5, 50, 13, 0,
    0, 82, 2, 0, 6, 210, 14, 0, 0, 19, 1, 0, 3, 51, 7, 0, 0, 83, 2, 0, 4, 211, 8, 0, 0, 20, 1, 0,
    5, 52, 9, 0, 0, 84, 2, 0, 6, 212, 10, 0, 0, 21, 1, 0, 3, 53, 11, 0, 0, 85, 2, 0, 4, 213, 12, 0,
    0, 22, 1, 0, 5, 54, 13, 0, 0, 86, 2, 0, 6, 214, 14, 0, 0, 23, 1, 0, 3, 55, 7, 0, 0, 87, 2, 0,
    4, 215, 8, 0, 0, 24, 1, 0, 5, 56, 9, 0, 0, 88, 2, 0, 6, 216, 10, 0, 0, 25, 1, 0, 3, 57, 11, 0,
    0, 89, 2, 0, 4, 217, 12, 0, 0, 26, 1, 0, 5, 58, 13, 0, 0, 90, 2, 0, 6, 218, 14, 0, 0, 27, 1, 0,
    3, 59, 7, 0, 0, 91, 2, 0, 4, 219, 8, 0, 0, 28, 1, 0, 5, 60, 9, 0, 0, 92, 2, 0, 6, 220, 10, 0,
    0, 29, 1, 0, 3, 61, 11, 0, 0, 93, 2, 0, 4, 221, 12, 0, 0, 30, 1, 0, 5, 62, 13, 0, 0, 94, 2, 0,
    6, 222, 14, 0, 0, 15, 1, 0, 3, 31, 7, 0, 0, 95, 2, 0, 4, 223, 8, 0, 0, 16, 1, 0, 5, 32, 9, 0,
    0, 96, 2, 0, 6, 224, 10, 0, 0, 17, 1, 0, 3, 33, 11, 0, 0, 97, 2, 0, 4, 225, 12, 0, 0, 18, 1, 0,
    5, 34, 13, 0, 0, 98, 2, 0, 6, 226, 14, 0, 0, 19, 1, 0, 3, 35, 7, 0, 0, 99, 2, 0, 4, 227, 8, 0,
    0, 20, 1, 0, 5, 36, 9, 0, 0, 100, 2, 0, 6, 228, 10, 0, 0, 21, 1, 0, 3, 37, 11, 0, 0, 101, 2, 0,
    4, 229, 12, 0, 0, 22, 1, 0, 5, 38, 13, 0, 0, 102, 2, 0, 6, 230, 14, 0, 0, 23, 1, 0, 3, 39, 7,
    0, 0, 103, 2, 0, 4, 231, 8, 0, 0, 24, 1, 0, 5, 40, 9, 0, 0, 104, 2, 0, 6, 232, 10, 0, 0, 25, 1,
    0, 3, 41, 11, 0, 0, 105, 2, 0, 4, 233, 12, 0, 0, 26, 1, 0, 5, 42, 13, 0, 0, 106, 2, 0, 6, 234,
    14, 0, 0, 27, 1, 0, 3, 43, 7, 0, 0, 107, 2, 0, 4, 235, 8, 0, 0, 28, 1, 0, 5, 44, 9, 0, 0, 108,
    2, 0, 6, 236, 10, 0, 0, 29, 1, 0, 3, 45, 11, 0, 0, 109, 2, 0, 4, 237, 12, 0, 0, 30, 1, 0, 5,
    46, 13, 0, 0, 110, 2, 0, 6, 238, 14, 0, 0, 15, 1, 0, 3, 47, 7, 0, 0, 111, 2, 0, 4, 239, 8, 0,
    0, 16, 1, 0, 5, 48, 9, 0, 0, 112, 2, 0, 6, 240, 10, 0, 0, 17, 1, 0, 3, 49, 11, 0, 0, 113, 2, 0,
    4, 241, 12, 0, 0, 18, 1, 0, 5, 50, 13, 0, 0, 114, 2, 0, 6, 242, 14, 0, 0, 19, 1, 0, 3, 51, 7,
    0, 0, 115, 2, 0, 4, 243, 8, 0, 0, 20, 1, 0, 5, 52, 9, 0, 0, 116, 2, 0, 6, 244, 10, 0, 0, 21, 1,
    0, 3, 53, 11, 0, 0, 117, 2, 0, 4, 245, 12, 0, 0, 22, 1, 0, 5, 54, 13, 0, 0, 118, 2, 0, 6, 246,
    14, 0, 0, 23, 1, 0, 3, 55, 7, 0, 0, 119, 2, 0, 4, 247, 8, 0, 0, 24, 1, 0, 5, 56, 9, 0, 0, 120,
    2, 0, 6, 248, 10, 0, 0, 25, 1, 0, 3, 57, 11, 0, 0, 121, 2, 0, 4, 249, 12, 0, 0, 26, 1, 0, 5,
    58, 13, 0, 0, 122, 2, 0, 6, 250, 14, 0, 0, 27, 1, 0, 3, 59, 7, 0, 0, 123, 2, 0, 4, 251, 8, 0,
    0, 28, 1, 0, 5, 60, 9, 0, 0, 124, 2, 0, 6, 252, 10, 0, 0, 29, 1, 0, 3, 61, 11, 0, 0, 125, 2, 0,
    4, 253, 12, 0, 0, 30, 1, 0, 5, 62, 13, 0, 0, 126, 2, 0, 6, 254, 14,
];
/// Precomputed lengths table for reading pi codes
pub const READ_LEN_LE: &[u8] = &[
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4,
    12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6,
    12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4,
    12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6, 12, 3, 10, 4, 12, 5, 11, 6, 12, 3, 8, 4, 12, 5, 9, 6,
    12, 3, 10, 4, 12, 5, 11, 6,
];
///Table used to speed up the writing of pi codes
pub const WRITE_BE: &[u16] = &[
    4, 10, 11, 24, 25, 26, 27, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72,
    73, 74, 75, 76, 77, 78, 79, 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,
    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, 896, 897, 898, 899, 900, 901, 902, 903, 904, 905, 906, 907,
    908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926,
    927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945,
    946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964,
    965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983,
    984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001,
    1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017,
    1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033,
    1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049,
    1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065,
    1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081,
    1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097,
    1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113,
    1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129,
    1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145,
    1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161,
    1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177,
    1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193,
    1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209,
    1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225,
    1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241,
    1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257,
    1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273,
    1274, 1275, 1276, 1277, 1278, 1279, 2560, 2561, 2562, 2563, 2564, 2565, 2566, 2567, 2568, 2569,
    2570, 2571, 2572, 2573, 2574, 2575, 2576, 2577, 2578, 2579, 2580, 2581, 2582, 2583, 2584, 2585,
    2586, 2587, 2588, 2589, 2590, 2591, 2592, 2593, 2594, 2595, 2596, 2597, 2598, 2599, 2600, 2601,
    2602, 2603, 2604, 2605, 2606, 2607, 2608, 2609, 2610, 2611, 2612, 2613, 2614, 2615, 2616, 2617,
    2618, 2619, 2620, 2621, 2622, 2623, 2624, 2625, 2626, 2627, 2628, 2629, 2630, 2631, 2632, 2633,
    2634, 2635, 2636, 2637, 2638, 2639, 2640, 2641, 2642, 2643, 2644, 2645, 2646, 2647, 2648, 2649,
    2650, 2651, 2652, 2653, 2654, 2655, 2656, 2657, 2658, 2659, 2660, 2661, 2662, 2663, 2664, 2665,
    2666, 2667, 2668, 2669, 2670, 2671, 2672, 2673, 2674, 2675, 2676, 2677, 2678, 2679, 2680, 2681,
    2682, 2683, 2684, 2685, 2686, 2687, 2688, 2689, 2690, 2691, 2692, 2693, 2694, 2695, 2696, 2697,
    2698, 2699, 2700, 2701, 2702, 2703, 2704, 2705, 2706, 2707, 2708, 2709, 2710, 2711, 2712, 2713,
    2714, 2715, 2716, 2717, 2718, 2719, 2720, 2721, 2722, 2723, 2724, 2725, 2726, 2727, 2728, 2729,
    2730, 2731, 2732, 2733, 2734, 2735, 2736, 2737, 2738, 2739, 2740, 2741, 2742, 2743, 2744, 2745,
    2746, 2747, 2748, 2749, 2750, 2751, 2752, 2753, 2754, 2755, 2756, 2757, 2758, 2759, 2760, 2761,
    2762, 2763, 2764, 2765, 2766, 2767, 2768, 2769, 2770, 2771, 2772, 2773, 2774, 2775, 2776, 2777,
    2778, 2779, 2780, 2781, 2782, 2783, 2784, 2785, 2786, 2787, 2788, 2789, 2790, 2791, 2792, 2793,
    2794, 2795, 2796, 2797, 2798, 2799, 2800, 2801, 2802, 2803, 2804, 2805, 2806, 2807, 2808, 2809,
    2810, 2811, 2812, 2813, 2814, 2815, 2816, 2817, 2818, 2819, 2820, 2821, 2822, 2823, 2824, 2825,
    2826, 2827, 2828, 2829, 2830, 2831, 2832, 2833, 2834, 2835, 2836, 2837, 2838, 2839, 2840, 2841,
    2842, 2843, 2844, 2845, 2846, 2847, 2848, 2849, 2850, 2851, 2852, 2853, 2854, 2855, 2856, 2857,
    2858, 2859, 2860, 2861, 2862, 2863, 2864, 2865, 2866, 2867, 2868, 2869, 2870, 2871, 2872, 2873,
    2874, 2875, 2876, 2877, 2878, 2879, 2880, 2881, 2882, 2883, 2884, 2885, 2886, 2887, 2888, 2889,
    2890, 2891, 2892, 2893, 2894, 2895, 2896, 2897, 2898, 2899, 2900, 2901, 2902, 2903, 2904, 2905,
    2906, 2907, 2908, 2909, 2910, 2911, 2912, 2913, 2914, 2915, 2916, 2917, 2918, 2919, 2920, 2921,
    2922, 2923, 2924, 2925, 2926, 2927, 2928, 2929, 2930, 2931, 2932, 2933, 2934, 2935, 2936, 2937,
    2938, 2939, 2940, 2941, 2942, 2943, 2944, 2945, 2946, 2947, 2948, 2949, 2950, 2951, 2952, 2953,
    2954, 2955, 2956, 2957, 2958, 2959, 2960, 2961, 2962, 2963, 2964, 2965, 2966, 2967, 2968, 2969,
    2970, 2971, 2972, 2973, 2974, 2975, 2976, 2977, 2978, 2979, 2980, 2981, 2982, 2983, 2984, 2985,
    2986, 2987, 2988, 2989, 2990, 2991, 2992, 2993, 2994, 2995, 2996, 2997, 2998, 2999, 3000, 3001,
    3002, 3003, 3004, 3005, 3006, 3007, 3008, 3009, 3010, 3011, 3012, 3013, 3014, 3015, 3016, 3017,
    3018, 3019, 3020, 3021, 3022, 3023, 3024, 3025, 3026, 3027, 3028, 3029, 3030, 3031, 3032, 3033,
    3034, 3035, 3036, 3037, 3038, 3039, 3040, 3041, 3042, 3043, 3044, 3045, 3046, 3047, 3048, 3049,
    3050, 3051, 3052, 3053, 3054, 3055, 3056, 3057, 3058, 3059, 3060, 3061, 3062, 3063, 3064, 3065,
    3066, 3067, 3068, 3069, 3070, 3071, 6144,
];
///Table used to speed up the writing of pi codes
pub const WRITE_LEN_BE: &[u16] = &[
    3, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    15,
];
///Table used to speed up the writing of pi codes
pub const WRITE_LE: &[u16] = &[
    1, 3, 11, 5, 13, 21, 29, 7, 15, 23, 31, 39, 47, 55, 63, 2, 18, 34, 50, 66, 82, 98, 114, 130,
    146, 162, 178, 194, 210, 226, 242, 6, 22, 38, 54, 70, 86, 102, 118, 134, 150, 166, 182, 198,
    214, 230, 246, 262, 278, 294, 310, 326, 342, 358, 374, 390, 406, 422, 438, 454, 470, 486, 502,
    10, 26, 42, 58, 74, 90, 106, 122, 138, 154, 170, 186, 202, 218, 234, 250, 266, 282, 298, 314,
    330, 346, 362, 378, 394, 410, 426, 442, 458, 474, 490, 506, 522, 538, 554, 570, 586, 602, 618,
    634, 650, 666, 682, 698, 714, 730, 746, 762, 778, 794, 810, 826, 842, 858, 874, 890, 906, 922,
    938, 954, 970, 986, 1002, 1018, 14, 30, 46, 62, 78, 94, 110, 126, 142, 158, 174, 190, 206, 222,
    238, 254, 270, 286, 302, 318, 334, 350, 366, 382, 398, 414, 430, 446, 462, 478, 494, 510, 526,
    542, 558, 574, 590, 606, 622, 638, 654, 670, 686, 702, 718, 734, 750, 766, 782, 798, 814, 830,
    846, 862, 878, 894, 910, 926, 942, 958, 974, 990, 1006, 1022, 1038, 1054, 1070, 1086, 1102,
    1118, 1134, 1150, 1166, 1182, 1198, 1214, 1230, 1246, 1262, 1278, 1294, 1310, 1326, 1342, 1358,
    1374, 1390, 1406, 1422, 1438, 1454, 1470, 1486, 1502, 1518, 1534, 1550, 1566, 1582, 1598, 1614,
    1630, 1646, 1662, 1678, 1694, 1710, 1726, 1742, 1758, 1774, 1790, 1806, 1822, 1838, 1854, 1870,
    1886, 1902, 1918, 1934, 1950, 1966, 1982, 1998, 2014, 2030, 2046, 4, 36, 68, 100, 132, 164,
    196, 228, 260, 292, 324, 356, 388, 420, 452, 484, 516, 548, 580, 612, 644, 676, 708, 740, 772,
    804, 836, 868, 900, 932, 964, 996, 1028, 1060, 1092, 1124, 1156, 1188, 1220, 1252, 1284, 1316,
    1348, 1380, 1412, 1444, 1476, 1508, 1540, 1572, 1604, 1636, 1668, 1700, 1732, 1764, 1796, 1828,
    1860, 1892, 1924, 1956, 1988, 2020, 2052, 2084, 2116, 2148, 2180, 2212, 2244, 2276, 2308, 2340,
    2372, 2404, 2436, 2468, 2500, 2532, 2564, 2596, 2628, 2660, 2692, 2724, 2756, 2788, 2820, 2852,
    2884, 2916, 2948, 2980, 3012, 3044, 3076, 3108, 3140, 3172, 3204, 3236, 3268, 3300, 3332, 3364,
    3396, 3428, 3460, 3492, 3524, 3556, 3588, 3620, 3652, 3684, 3716, 3748, 3780, 3812, 3844, 3876,
    3908, 3940, 3972, 4004, 4036, 4068, 4100, 4132, 4164, 4196, 4228, 4260, 4292, 4324, 4356, 4388,
    4420, 4452, 4484, 4516, 4548, 4580, 4612, 4644, 4676, 4708, 4740, 4772, 4804, 4836, 4868, 4900,
    4932, 4964, 4996, 5028, 5060, 5092, 5124, 5156, 5188, 5220, 5252, 5284, 5316, 5348, 5380, 5412,
    5444, 5476, 5508, 5540, 5572, 5604, 5636, 5668, 5700, 5732, 5764, 5796, 5828, 5860, 5892, 5924,
    5956, 5988, 6020, 6052, 6084, 6116, 6148, 6180, 6212, 6244, 6276, 6308, 6340, 6372, 6404, 6436,
    6468, 6500, 6532, 6564, 6596, 6628, 6660, 6692, 6724, 6756, 6788, 6820, 6852, 6884, 6916, 6948,
    6980, 7012, 7044, 7076, 7108, 7140, 7172, 7204, 7236, 7268, 7300, 7332, 7364, 7396, 7428, 7460,
    7492, 7524, 7556, 7588, 7620, 7652, 7684, 7716, 7748, 7780, 7812, 7844, 7876, 7908, 7940, 7972,
    8004, 8036, 8068, 8100, 8132, 8164, 12, 44, 76, 108, 140, 172, 204, 236, 268, 300, 332, 364,
    396, 428, 460, 492, 524, 556, 588, 620, 652, 684, 716, 748, 780, 812, 844, 876, 908, 940, 972,
    1004, 1036, 1068, 1100, 1132, 1164, 1196, 1228, 1260, 1292, 1324, 1356, 1388, 1420, 1452, 1484,
    1516, 1548, 1580, 1612, 1644, 1676, 1708, 1740, 1772, 1804, 1836, 1868, 1900, 1932, 1964, 1996,
    2028, 2060, 2092, 2124, 2156, 2188, 2220, 2252, 2284, 2316, 2348, 2380, 2412, 2444, 2476, 2508,
    2540, 2572, 2604, 2636, 2668, 2700, 2732, 2764, 2796, 2828, 2860, 2892, 2924, 2956, 2988, 3020,
    3052, 3084, 3116, 3148, 3180, 3212, 3244, 3276, 3308, 3340, 3372, 3404, 3436, 3468, 3500, 3532,
    3564, 3596, 3628, 3660, 3692, 3724, 3756, 3788, 3820, 3852, 3884, 3916, 3948, 3980, 4012, 4044,
    4076, 4108, 4140, 4172, 4204, 4236, 4268, 4300, 4332, 4364, 4396, 4428, 4460, 4492, 4524, 4556,
    4588, 4620, 4652, 4684, 4716, 4748, 4780, 4812, 4844, 4876, 4908, 4940, 4972, 5004, 5036, 5068,
    5100, 5132, 5164, 5196, 5228, 5260, 5292, 5324, 5356, 5388, 5420, 5452, 5484, 5516, 5548, 5580,
    5612, 5644, 5676, 5708, 5740, 5772, 5804, 5836, 5868, 5900, 5932, 5964, 5996, 6028, 6060, 6092,
    6124, 6156, 6188, 6220, 6252, 6284, 6316, 6348, 6380, 6412, 6444, 6476, 6508, 6540, 6572, 6604,
    6636, 6668, 6700, 6732, 6764, 6796, 6828, 6860, 6892, 6924, 6956, 6988, 7020, 7052, 7084, 7116,
    7148, 7180, 7212, 7244, 7276, 7308, 7340, 7372, 7404, 7436, 7468, 7500, 7532, 7564, 7596, 7628,
    7660, 7692, 7724, 7756, 7788, 7820, 7852, 7884, 7916, 7948, 7980, 8012, 8044, 8076, 8108, 8140,
    8172, 8204, 8236, 8268, 8300, 8332, 8364, 8396, 8428, 8460, 8492, 8524, 8556, 8588, 8620, 8652,
    8684, 8716, 8748, 8780, 8812, 8844, 8876, 8908, 8940, 8972, 9004, 9036, 9068, 9100, 9132, 9164,
    9196, 9228, 9260, 9292, 9324, 9356, 9388, 9420, 9452, 9484, 9516, 9548, 9580, 9612, 9644, 9676,
    9708, 9740, 9772, 9804, 9836, 9868, 9900, 9932, 9964, 9996, 10028, 10060, 10092, 10124, 10156,
    10188, 10220, 10252, 10284, 10316, 10348, 10380, 10412, 10444, 10476, 10508, 10540, 10572,
    10604, 10636, 10668, 10700, 10732, 10764, 10796, 10828, 10860, 10892, 10924, 10956, 10988,
    11020, 11052, 11084, 11116, 11148, 11180, 11212, 11244, 11276, 11308, 11340, 11372, 11404,
    11436, 11468, 11500, 11532, 11564, 11596, 11628, 11660, 11692, 11724, 11756, 11788, 11820,
    11852, 11884, 11916, 11948, 11980, 12012, 12044, 12076, 12108, 12140, 12172, 12204, 12236,
    12268, 12300, 12332, 12364, 12396, 12428, 12460, 12492, 12524, 12556, 12588, 12620, 12652,
    12684, 12716, 12748, 12780, 12812, 12844, 12876, 12908, 12940, 12972, 13004, 13036, 13068,
    13100, 13132, 13164, 13196, 13228, 13260, 13292, 13324, 13356, 13388, 13420, 13452, 13484,
    13516, 13548, 13580, 13612, 13644, 13676, 13708, 13740, 13772, 13804, 13836, 13868, 13900,
    13932, 13964, 13996, 14028, 14060, 14092, 14124, 14156, 14188, 14220, 14252, 14284, 14316,
    14348, 14380, 14412, 14444, 14476, 14508, 14540, 14572, 14604, 14636, 14668, 14700, 14732,
    14764, 14796, 14828, 14860, 14892, 14924, 14956, 14988, 15020, 15052, 15084, 15116, 15148,
    15180, 15212, 15244, 15276, 15308, 15340, 15372, 15404, 15436, 15468, 15500, 15532, 15564,
    15596, 15628, 15660, 15692, 15724, 15756, 15788, 15820, 15852, 15884, 15916, 15948, 15980,
    16012, 16044, 16076, 16108, 16140, 16172, 16204, 16236, 16268, 16300, 16332, 16364, 20,
];
///Table used to speed up the writing of pi codes
pub const WRITE_LEN_LE: &[u16] = &[
    3, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    15,
];
///Table used to speed up the skipping of pi codes
pub const LEN: &[u8] = &[
    3, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9,
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
    10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
    13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
    15,
];
/// The K of the pi codes for these tables
pub const K: usize = 2;