wechat-protocol 1.4.0-beta.2

Native WeChat transport, authentication and protocol codecs
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
956
// Protocol notice checksum over the MD5 hexadecimal input domain.
// Arithmetic is intentionally wrapping, matching the native uint64 operations.
use crate::crypto::md5;
use anyhow::{ensure, Result};

pub fn from_md5_hex(hex: &str) -> Result<u32> {
    ensure!(
        hex.len() == 32
            && hex
                .bytes()
                .all(|b| b.is_ascii_digit() || (b'a'..=b'f').contains(&b)),
        "Invalid notice digest"
    );
    let hex = hex.as_bytes();
    // Fixed scratch slots avoid exponential analysis of a long SSA expression
    // graph. All operations retain their native wrapping uint64 semantics.
    let mut slots = [0u64; 900];
    slots[0] = (hex[1] as u64) << 8;
    slots[1] = slots[0] | (hex[2] as u64);
    slots[2] = (hex[5] as u64) << 8;
    slots[3] = slots[2] | (hex[6] as u64);
    slots[4] = (hex[0] as u64) << 16;
    slots[5] = slots[1] | slots[4];
    slots[6] = (hex[3] as u64) << 24;
    slots[7] = slots[5] | slots[6];
    slots[8] = (hex[4] as u64) << 16;
    slots[9] = slots[3] | slots[8];
    slots[10] = (hex[9] as u64) << 8;
    slots[11] = slots[10] | (hex[10] as u64);
    slots[12] = (hex[7] as u64) << 24;
    slots[13] = slots[9] | slots[12];
    slots[14] = (hex[13] as u64) << 8;
    slots[15] = slots[14] | (hex[14] as u64);
    slots[16] = (hex[8] as u64) << 16;
    slots[17] = slots[11] | slots[16];
    slots[18] = (hex[11] as u64) << 24;
    slots[19] = slots[17] | slots[18];
    slots[20] = (hex[12] as u64) << 16;
    slots[21] = slots[15] | slots[20];
    slots[22] = (hex[17] as u64) << 8;
    slots[23] = slots[22] | (hex[18] as u64);
    slots[24] = (hex[15] as u64) << 24;
    slots[25] = slots[21] | slots[24];
    slots[26] = (hex[21] as u64) << 8;
    slots[27] = slots[26] | (hex[22] as u64);
    slots[28] = (hex[16] as u64) << 16;
    slots[29] = slots[23] | slots[28];
    slots[30] = (hex[19] as u64) << 24;
    slots[31] = slots[29] | slots[30];
    slots[32] = (hex[20] as u64) << 16;
    slots[33] = slots[27] | slots[32];
    slots[34] = (hex[25] as u64) << 8;
    slots[35] = slots[34] | (hex[26] as u64);
    slots[36] = (hex[23] as u64) << 24;
    slots[37] = slots[33] | slots[36];
    slots[38] = (hex[29] as u64) << 8;
    slots[39] = slots[38] | (hex[30] as u64);
    slots[40] = (hex[24] as u64) << 16;
    slots[41] = slots[35] | slots[40];
    slots[42] = (hex[27] as u64) << 24;
    slots[43] = slots[41] | slots[42];
    slots[44] = (hex[28] as u64) << 16;
    slots[45] = slots[39] | slots[44];
    slots[46] = (hex[31] as u64) << 24;
    slots[47] = slots[45] | slots[46];
    slots[48] = (slots[7]).wrapping_add(0x9c4d7d6u64);
    slots[49] = (slots[48]).wrapping_add(0xffffffffadb314a8u64);
    slots[50] = (slots[49]).wrapping_add(0xffffffffd6b0ea07u64);
    slots[51] = slots[50] << 25;
    slots[52] = slots[50] & 0xffffff80u64;
    slots[53] = slots[52] >> 7;
    slots[54] = slots[53] | slots[51];
    slots[55] = (slots[54]).wrapping_add(0x32d88f3fu64);
    slots[56] = slots[55] ^ 0x4150891du64;
    slots[57] = (slots[13]).wrapping_add(0xffffffffece39db5u64);
    slots[58] = (slots[57]).wrapping_add(slots[56]);
    slots[59] = (slots[58]).wrapping_add(0xffffffffb7b87915u64);
    slots[60] = slots[59] << 20;
    slots[61] = slots[59] & 0xfffff000u64;
    slots[62] = slots[61] >> 12;
    slots[63] = slots[62] | slots[60];
    slots[64] = (slots[63]).wrapping_add(slots[55]);
    slots[65] = (slots[19]).wrapping_add(0x73880622u64);
    slots[66] = slots[64] ^ slots[55];
    slots[67] = slots[66] ^ 0x32d88f3fu64;
    slots[68] = (slots[65]).wrapping_add(slots[67]);
    slots[69] = (slots[68]).wrapping_add(0x6b329dedu64);
    slots[70] = slots[69] << 15;
    slots[71] = slots[69] & 0xfffe0000u64;
    slots[72] = slots[71] >> 17;
    slots[73] = slots[72] | slots[70];
    slots[74] = (slots[73]).wrapping_add(slots[64]);
    slots[75] = slots[74] ^ slots[66];
    slots[76] = (slots[25]).wrapping_add(0x32d88f3fu64);
    slots[77] = (slots[76]).wrapping_add(slots[75]);
    slots[78] = (slots[77]).wrapping_add(0x2ef0cd9eu64);
    slots[79] = slots[78] << 10;
    slots[80] = slots[78] & 0xffc00000u64;
    slots[81] = slots[80] >> 22;
    slots[82] = slots[81] | slots[79];
    slots[83] = (slots[31]).wrapping_add(slots[55]);
    slots[84] = (slots[82]).wrapping_add(slots[74]);
    slots[85] = slots[84] ^ slots[74];
    slots[86] = slots[85] ^ slots[64];
    slots[87] = (slots[83]).wrapping_add(slots[86]);
    slots[88] = (slots[87]).wrapping_add(0x263a2d57u64);
    slots[89] = slots[88] << 25;
    slots[90] = slots[88] & 0xffffff80u64;
    slots[91] = slots[90] >> 7;
    slots[92] = slots[91] | slots[89];
    slots[93] = (slots[37]).wrapping_add(slots[64]);
    slots[94] = (slots[92]).wrapping_add(slots[84]);
    slots[95] = slots[94] ^ slots[85];
    slots[96] = (slots[93]).wrapping_add(slots[95]);
    slots[97] = (slots[96]).wrapping_add(0x7a6d5f96u64);
    slots[98] = slots[97] << 20;
    slots[99] = slots[97] & 0xfffff000u64;
    slots[100] = slots[99] >> 12;
    slots[101] = slots[100] | slots[98];
    slots[102] = (slots[43]).wrapping_add(slots[74]);
    slots[103] = (slots[101]).wrapping_add(slots[94]);
    slots[104] = slots[103] ^ slots[94];
    slots[105] = slots[104] ^ slots[84];
    slots[106] = (slots[102]).wrapping_add(slots[105]);
    slots[107] = (slots[106]).wrapping_add(0x77fa5373u64);
    slots[108] = slots[107] << 15;
    slots[109] = slots[107] & 0xfffe0000u64;
    slots[110] = slots[109] >> 17;
    slots[111] = slots[110] | slots[108];
    slots[112] = (slots[47]).wrapping_add(slots[84]);
    slots[113] = (slots[111]).wrapping_add(slots[103]);
    slots[114] = slots[104] ^ slots[113];
    slots[115] = (slots[112]).wrapping_add(slots[114]);
    slots[116] = (slots[115]).wrapping_add(0x1ac8dd6du64);
    slots[117] = slots[116] << 10;
    slots[118] = slots[116] & 0xffc00000u64;
    slots[119] = slots[118] >> 22;
    slots[120] = slots[119] | slots[117];
    slots[121] = (slots[94]).wrapping_add(0xffffffff9803a6e9u64);
    slots[122] = (slots[120]).wrapping_add(slots[113]);
    slots[123] = slots[113] ^ slots[103];
    slots[124] = slots[123] ^ slots[122];
    slots[125] = (slots[121]).wrapping_add(slots[124]);
    slots[126] = (slots[125]).wrapping_add(0x5dbb7dc7u64);
    slots[127] = slots[126] << 25;
    slots[128] = slots[126] & 0xffffff80u64;
    slots[129] = slots[128] >> 7;
    slots[130] = slots[129] | slots[127];
    slots[131] = (slots[103]).wrapping_add(0x6ce1c012u64);
    slots[132] = (slots[130]).wrapping_add(slots[122]);
    slots[133] = slots[122] ^ slots[113];
    slots[134] = slots[133] ^ slots[132];
    slots[135] = (slots[131]).wrapping_add(slots[134]);
    slots[136] = (slots[135]).wrapping_add(0xffffffffc7a1e8fbu64);
    slots[137] = slots[136] << 20;
    slots[138] = slots[136] & 0xfffff000u64;
    slots[139] = slots[138] >> 12;
    slots[140] = slots[139] | slots[137];
    slots[141] = (slots[113]).wrapping_add(0xfffffffff2621cb8u64);
    slots[142] = (slots[140]).wrapping_add(slots[132]);
    slots[143] = slots[132] ^ slots[122];
    slots[144] = slots[143] ^ slots[142];
    slots[145] = (slots[141]).wrapping_add(slots[144]);
    slots[146] = (slots[145]).wrapping_add(0xffffffff930d5c29u64);
    slots[147] = slots[146] << 15;
    slots[148] = slots[146] & 0xfffe0000u64;
    slots[149] = slots[148] >> 17;
    slots[150] = slots[149] | slots[147];
    slots[151] = (slots[122]).wrapping_add(0x1c43ecf9u64);
    slots[152] = (slots[150]).wrapping_add(slots[142]);
    slots[153] = slots[142] ^ slots[132];
    slots[154] = slots[153] ^ slots[152];
    slots[155] = (slots[151]).wrapping_add(slots[154]);
    slots[156] = (slots[155]).wrapping_add(0x15336c85u64);
    slots[157] = slots[156] << 10;
    slots[158] = slots[156] & 0xffc00000u64;
    slots[159] = slots[158] >> 22;
    slots[160] = slots[159] | slots[157];
    slots[161] = (slots[132]).wrapping_add(0xda0000u64);
    slots[162] = (slots[160]).wrapping_add(slots[152]);
    slots[163] = slots[152] ^ slots[142];
    slots[164] = slots[163] ^ slots[162];
    slots[165] = (slots[161]).wrapping_add(slots[164]);
    slots[166] = (slots[165]).wrapping_add(0xffffffffdcd4b032u64);
    slots[167] = slots[166] & 0xffffff80u64;
    slots[168] = slots[166] << 25;
    slots[169] = slots[167] >> 7;
    slots[170] = slots[169] | slots[168];
    slots[171] = (slots[170]).wrapping_add(slots[162]);
    slots[172] = slots[162] ^ slots[152];
    slots[173] = slots[172] ^ slots[171];
    slots[174] = (slots[142]).wrapping_add(slots[173]);
    slots[175] = (slots[174]).wrapping_add(0xffffffff8babda93u64);
    slots[176] = slots[175] & 0xfffff000u64;
    slots[177] = slots[175] << 20;
    slots[178] = slots[176] >> 12;
    slots[179] = slots[178] | slots[177];
    slots[180] = (slots[152]).wrapping_add(0x647b0f13u64);
    slots[181] = (slots[179]).wrapping_add(slots[171]);
    slots[182] = slots[171] ^ slots[162];
    slots[183] = slots[182] ^ slots[181];
    slots[184] = (slots[180]).wrapping_add(slots[183]);
    slots[185] = (slots[184]).wrapping_add(0xffffffff86c0472fu64);
    slots[186] = slots[185] & 0xfffe0000u64;
    slots[187] = slots[185] << 15;
    slots[188] = slots[186] >> 17;
    slots[189] = slots[188] | slots[187];
    slots[190] = (slots[189]).wrapping_add(slots[181]);
    slots[191] = slots[181] ^ slots[171];
    slots[192] = slots[191] ^ slots[190];
    slots[193] = (slots[162]).wrapping_add(slots[192]);
    slots[194] = (slots[193]).wrapping_add(0x65e0c427u64);
    slots[195] = slots[194] & 0xffc00000u64;
    slots[196] = slots[194] << 10;
    slots[197] = slots[195] >> 22;
    slots[198] = slots[197] | slots[196];
    slots[199] = (slots[198]).wrapping_add(slots[190]);
    slots[200] = slots[199] ^ 0xffffffffffffffffu64;
    slots[201] = slots[190] & slots[200];
    slots[202] = slots[199] & slots[181];
    slots[203] = slots[202] | slots[201];
    slots[204] = (slots[13]).wrapping_add(slots[171]);
    slots[205] = (slots[204]).wrapping_add(slots[203]);
    slots[206] = (slots[205]).wrapping_add(0xffffffffbb46ff0du64);
    slots[207] = slots[206] << 27;
    slots[208] = slots[206] & 0xffffffe0u64;
    slots[209] = slots[208] >> 5;
    slots[210] = slots[209] | slots[207];
    slots[211] = (slots[210]).wrapping_add(slots[199]);
    slots[212] = slots[211] ^ 0xffffffffffffffffu64;
    slots[213] = slots[199] & slots[212];
    slots[214] = slots[211] & slots[190];
    slots[215] = slots[214] | slots[213];
    slots[216] = (slots[43]).wrapping_add(slots[181]);
    slots[217] = (slots[216]).wrapping_add(slots[215]);
    slots[218] = (slots[217]).wrapping_add(0x28e6c7d3u64);
    slots[219] = slots[218] << 23;
    slots[220] = slots[218] & 0xfffffe00u64;
    slots[221] = slots[220] >> 9;
    slots[222] = slots[221] | slots[219];
    slots[223] = (slots[222]).wrapping_add(slots[211]);
    slots[224] = slots[223] ^ 0xffffffffffffffffu64;
    slots[225] = slots[211] & slots[224];
    slots[226] = slots[223] & slots[199];
    slots[227] = slots[226] | slots[225];
    slots[228] = (slots[190]).wrapping_add(0x1c43ecf9u64);
    slots[229] = (slots[228]).wrapping_add(slots[227]);
    slots[230] = (slots[229]).wrapping_add(0xffffffffb473e7d4u64);
    slots[231] = slots[230] << 18;
    slots[232] = slots[230] & 0xffffc000u64;
    slots[233] = slots[232] >> 14;
    slots[234] = slots[233] | slots[231];
    slots[235] = (slots[234]).wrapping_add(slots[223]);
    slots[236] = slots[235] ^ 0xffffffffffffffffu64;
    slots[237] = slots[223] & slots[236];
    slots[238] = slots[235] & slots[211];
    slots[239] = slots[238] | slots[237];
    slots[240] = (slots[7]).wrapping_add(slots[199]);
    slots[241] = (slots[240]).wrapping_add(slots[239]);
    slots[242] = (slots[241]).wrapping_add(0xfffffffffc37a219u64);
    slots[243] = slots[242] << 12;
    slots[244] = slots[242] & 0xfff00000u64;
    slots[245] = slots[244] >> 20;
    slots[246] = slots[245] | slots[243];
    slots[247] = (slots[246]).wrapping_add(slots[235]);
    slots[248] = slots[247] ^ 0xffffffffffffffffu64;
    slots[249] = slots[235] & slots[248];
    slots[250] = slots[247] & slots[223];
    slots[251] = slots[250] | slots[249];
    slots[252] = (slots[37]).wrapping_add(slots[211]);
    slots[253] = (slots[252]).wrapping_add(slots[251]);
    slots[254] = (slots[253]).wrapping_add(0xffffffffaf1a0718u64);
    slots[255] = slots[254] << 27;
    slots[256] = slots[254] & 0xffffffe0u64;
    slots[257] = slots[256] >> 5;
    slots[258] = slots[257] | slots[255];
    slots[259] = (slots[258]).wrapping_add(slots[247]);
    slots[260] = slots[259] ^ 0xffffffffffffffffu64;
    slots[261] = slots[247] & slots[260];
    slots[262] = slots[259] & slots[235];
    slots[263] = slots[262] | slots[261];
    slots[264] = (slots[223]).wrapping_add(0xfffffffff2621cb8u64);
    slots[265] = (slots[264]).wrapping_add(slots[263]);
    slots[266] = (slots[265]).wrapping_add(0x755849e0u64);
    slots[267] = slots[266] << 23;
    slots[268] = slots[266] & 0xfffffe00u64;
    slots[269] = slots[268] >> 9;
    slots[270] = slots[269] | slots[267];
    slots[271] = (slots[270]).wrapping_add(slots[259]);
    slots[272] = slots[271] ^ 0xffffffffffffffffu64;
    slots[273] = slots[259] & slots[272];
    slots[274] = slots[271] & slots[247];
    slots[275] = slots[274] | slots[273];
    slots[276] = (slots[235]).wrapping_add(slots[275]);
    slots[277] = (slots[276]).wrapping_add(0xffffffffb3a6ec26u64);
    slots[278] = slots[277] << 18;
    slots[279] = slots[277] & 0xffffc000u64;
    slots[280] = slots[279] >> 14;
    slots[281] = slots[280] | slots[278];
    slots[282] = (slots[281]).wrapping_add(slots[271]);
    slots[283] = slots[282] ^ 0xffffffffffffffffu64;
    slots[284] = slots[271] & slots[283];
    slots[285] = slots[282] & slots[259];
    slots[286] = slots[285] | slots[284];
    slots[287] = (slots[31]).wrapping_add(slots[247]);
    slots[288] = (slots[287]).wrapping_add(slots[286]);
    slots[289] = (slots[288]).wrapping_add(0xffffffffda810598u64);
    slots[290] = slots[289] << 12;
    slots[291] = slots[289] & 0xfff00000u64;
    slots[292] = slots[291] >> 20;
    slots[293] = slots[292] | slots[290];
    slots[294] = (slots[293]).wrapping_add(slots[282]);
    slots[295] = slots[294] ^ 0xffffffffffffffffu64;
    slots[296] = slots[282] & slots[295];
    slots[297] = slots[294] & slots[271];
    slots[298] = slots[297] | slots[296];
    slots[299] = (slots[259]).wrapping_add(0x6ce1c012u64);
    slots[300] = (slots[299]).wrapping_add(slots[298]);
    slots[301] = (slots[300]).wrapping_add(0xffffffffa658fc47u64);
    slots[302] = slots[301] << 27;
    slots[303] = slots[301] & 0xffffffe0u64;
    slots[304] = slots[303] >> 5;
    slots[305] = slots[304] | slots[302];
    slots[306] = (slots[305]).wrapping_add(slots[294]);
    slots[307] = slots[306] ^ 0xffffffffffffffffu64;
    slots[308] = slots[294] & slots[307];
    slots[309] = slots[306] & slots[282];
    slots[310] = slots[309] | slots[308];
    slots[311] = (slots[271]).wrapping_add(0x647b0f13u64);
    slots[312] = (slots[311]).wrapping_add(slots[310]);
    slots[313] = (slots[312]).wrapping_add(0xffffffffc7d5c425u64);
    slots[314] = slots[313] << 23;
    slots[315] = slots[313] & 0xfffffe00u64;
    slots[316] = slots[315] >> 9;
    slots[317] = slots[316] | slots[314];
    slots[318] = (slots[317]).wrapping_add(slots[306]);
    slots[319] = slots[318] ^ 0xffffffffffffffffu64;
    slots[320] = slots[306] & slots[319];
    slots[321] = slots[318] & slots[294];
    slots[322] = slots[321] | slots[320];
    slots[323] = (slots[25]).wrapping_add(slots[282]);
    slots[324] = (slots[323]).wrapping_add(slots[322]);
    slots[325] = (slots[324]).wrapping_add(0x572d04b3u64);
    slots[326] = slots[325] << 18;
    slots[327] = slots[325] & 0xffffc000u64;
    slots[328] = slots[327] >> 14;
    slots[329] = slots[328] | slots[326];
    slots[330] = (slots[329]).wrapping_add(slots[318]);
    slots[331] = slots[330] ^ 0xffffffffffffffffu64;
    slots[332] = slots[318] & slots[331];
    slots[333] = slots[330] & slots[306];
    slots[334] = slots[333] | slots[332];
    slots[335] = (slots[294]).wrapping_add(0xffffffff9803a6e9u64);
    slots[336] = (slots[335]).wrapping_add(slots[334]);
    slots[337] = (slots[336]).wrapping_add(0x5ead8d1au64);
    slots[338] = slots[337] << 12;
    slots[339] = slots[337] & 0xfff00000u64;
    slots[340] = slots[339] >> 20;
    slots[341] = slots[340] | slots[338];
    slots[342] = (slots[341]).wrapping_add(slots[330]);
    slots[343] = slots[342] ^ 0xffffffffffffffffu64;
    slots[344] = slots[330] & slots[343];
    slots[345] = slots[342] & slots[318];
    slots[346] = slots[345] | slots[344];
    slots[347] = (slots[306]).wrapping_add(slots[346]);
    slots[348] = (slots[347]).wrapping_add(0xffffffffcd2d1a9cu64);
    slots[349] = slots[348] & 0xffffffe0u64;
    slots[350] = slots[348] << 27;
    slots[351] = slots[349] >> 5;
    slots[352] = slots[351] | slots[350];
    slots[353] = (slots[352]).wrapping_add(slots[342]);
    slots[354] = slots[353] ^ 0xffffffffffffffffu64;
    slots[355] = slots[342] & slots[354];
    slots[356] = slots[353] & slots[330];
    slots[357] = slots[356] | slots[355];
    slots[358] = (slots[19]).wrapping_add(slots[318]);
    slots[359] = (slots[358]).wrapping_add(slots[357]);
    slots[360] = (slots[359]).wrapping_add(0xffffffff957db7e4u64);
    slots[361] = slots[360] & 0xfffffe00u64;
    slots[362] = slots[360] << 23;
    slots[363] = slots[361] >> 9;
    slots[364] = slots[363] | slots[362];
    slots[365] = (slots[364]).wrapping_add(slots[353]);
    slots[366] = slots[365] & slots[342];
    slots[367] = slots[365] ^ 0xffffffffffffffffu64;
    slots[368] = slots[353] & slots[367];
    slots[369] = slots[366] | slots[368];
    slots[370] = (slots[47]).wrapping_add(slots[330]);
    slots[371] = (slots[370]).wrapping_add(slots[369]);
    slots[372] = (slots[371]).wrapping_add(0xffffffffa4d7e6f1u64);
    slots[373] = slots[372] & 0xffffc000u64;
    slots[374] = slots[372] << 18;
    slots[375] = slots[373] >> 14;
    slots[376] = slots[375] | slots[374];
    slots[377] = (slots[376]).wrapping_add(slots[365]);
    slots[378] = slots[377] & slots[353];
    slots[379] = slots[377] ^ 0xffffffffffffffffu64;
    slots[380] = slots[365] & slots[379];
    slots[381] = slots[378] | slots[380];
    slots[382] = (slots[342]).wrapping_add(0xda0000u64);
    slots[383] = (slots[382]).wrapping_add(slots[381]);
    slots[384] = (slots[383]).wrapping_add(0xfffffffff211ebafu64);
    slots[385] = slots[384] & 0xfff00000u64;
    slots[386] = slots[384] << 12;
    slots[387] = slots[385] >> 20;
    slots[388] = slots[387] | slots[386];
    slots[389] = (slots[388]).wrapping_add(slots[377]);
    slots[390] = slots[389] & slots[367];
    slots[391] = slots[377] & slots[365];
    slots[392] = slots[390] | slots[391];
    slots[393] = (slots[37]).wrapping_add(slots[353]);
    slots[394] = (slots[393]).wrapping_add(slots[392]);
    slots[395] = (slots[394]).wrapping_add(0x27b7def7u64);
    slots[396] = slots[395] << 28;
    slots[397] = slots[395] & 0xfffffff0u64;
    slots[398] = slots[397] >> 4;
    slots[399] = slots[398] | slots[396];
    slots[400] = (slots[399]).wrapping_add(slots[389]);
    slots[401] = slots[400] & slots[379];
    slots[402] = slots[389] & slots[377];
    slots[403] = slots[401] | slots[402];
    slots[404] = (slots[365]).wrapping_add(0xffffffff9803a6e9u64);
    slots[405] = (slots[404]).wrapping_add(slots[403]);
    slots[406] = (slots[405]).wrapping_add(0x37ee92deu64);
    slots[407] = slots[406] << 21;
    slots[408] = slots[406] & 0xfffff800u64;
    slots[409] = slots[408] >> 11;
    slots[410] = slots[409] | slots[407];
    slots[411] = (slots[410]).wrapping_add(slots[400]);
    slots[412] = slots[389] ^ 0xffffffffffffffffu64;
    slots[413] = slots[411] & slots[412];
    slots[414] = slots[400] & slots[389];
    slots[415] = slots[413] | slots[414];
    slots[416] = (slots[377]).wrapping_add(0x1c43ecf9u64);
    slots[417] = (slots[416]).wrapping_add(slots[415]);
    slots[418] = (slots[417]).wrapping_add(0xffffffff9c660adau64);
    slots[419] = slots[418] << 16;
    slots[420] = slots[418] & 0xffff0000u64;
    slots[421] = slots[420] >> 16;
    slots[422] = slots[421] | slots[419];
    slots[423] = (slots[422]).wrapping_add(slots[411]);
    slots[424] = slots[400] ^ 0xffffffffffffffffu64;
    slots[425] = slots[423] & slots[424];
    slots[426] = slots[411] & slots[400];
    slots[427] = slots[425] | slots[426];
    slots[428] = (slots[389]).wrapping_add(0x647b0f13u64);
    slots[429] = (slots[428]).wrapping_add(slots[427]);
    slots[430] = (slots[429]).wrapping_add(0x7a555619u64);
    slots[431] = slots[430] << 9;
    slots[432] = slots[430] & 0xff800000u64;
    slots[433] = slots[432] >> 23;
    slots[434] = slots[433] | slots[431];
    slots[435] = (slots[434]).wrapping_add(slots[423]);
    slots[436] = slots[411] ^ 0xffffffffffffffffu64;
    slots[437] = slots[435] & slots[436];
    slots[438] = slots[423] & slots[411];
    slots[439] = slots[437] | slots[438];
    slots[440] = (slots[13]).wrapping_add(slots[400]);
    slots[441] = (slots[440]).wrapping_add(slots[439]);
    slots[442] = (slots[441]).wrapping_add(0x113a799au64);
    slots[443] = slots[442] << 28;
    slots[444] = slots[442] & 0xfffffff0u64;
    slots[445] = slots[444] >> 4;
    slots[446] = slots[445] | slots[443];
    slots[447] = (slots[446]).wrapping_add(slots[435]);
    slots[448] = slots[423] ^ 0xffffffffffffffffu64;
    slots[449] = slots[447] & slots[448];
    slots[450] = slots[435] & slots[423];
    slots[451] = slots[449] | slots[450];
    slots[452] = (slots[31]).wrapping_add(slots[411]);
    slots[453] = (slots[452]).wrapping_add(slots[451]);
    slots[454] = (slots[453]).wrapping_add(0xffffffffecf22c38u64);
    slots[455] = slots[454] << 21;
    slots[456] = slots[454] & 0xfffff800u64;
    slots[457] = slots[456] >> 11;
    slots[458] = slots[457] | slots[455];
    slots[459] = (slots[458]).wrapping_add(slots[447]);
    slots[460] = slots[435] ^ 0xffffffffffffffffu64;
    slots[461] = slots[459] & slots[460];
    slots[462] = slots[447] & slots[435];
    slots[463] = slots[461] | slots[462];
    slots[464] = (slots[47]).wrapping_add(slots[423]);
    slots[465] = (slots[464]).wrapping_add(slots[463]);
    slots[466] = (slots[465]).wrapping_add(0x76f2ae9eu64);
    slots[467] = slots[466] << 16;
    slots[468] = slots[466] & 0xffff0000u64;
    slots[469] = slots[468] >> 16;
    slots[470] = slots[469] | slots[467];
    slots[471] = (slots[470]).wrapping_add(slots[459]);
    slots[472] = slots[447] ^ 0xffffffffffffffffu64;
    slots[473] = slots[471] & slots[472];
    slots[474] = slots[459] & slots[447];
    slots[475] = slots[473] | slots[474];
    slots[476] = (slots[435]).wrapping_add(0xfffffffff2621cb8u64);
    slots[477] = (slots[476]).wrapping_add(slots[475]);
    slots[478] = (slots[477]).wrapping_add(0xffffffffb5e735e7u64);
    slots[479] = slots[478] << 9;
    slots[480] = slots[478] & 0xff800000u64;
    slots[481] = slots[480] >> 23;
    slots[482] = slots[481] | slots[479];
    slots[483] = (slots[482]).wrapping_add(slots[471]);
    slots[484] = slots[459] ^ 0xffffffffffffffffu64;
    slots[485] = slots[483] & slots[484];
    slots[486] = slots[471] & slots[459];
    slots[487] = slots[485] | slots[486];
    slots[488] = (slots[447]).wrapping_add(slots[487]);
    slots[489] = (slots[488]).wrapping_add(0x25dd8b50u64);
    slots[490] = slots[489] << 28;
    slots[491] = slots[489] & 0xfffffff0u64;
    slots[492] = slots[491] >> 4;
    slots[493] = slots[492] | slots[490];
    slots[494] = (slots[493]).wrapping_add(slots[483]);
    slots[495] = slots[471] ^ 0xffffffffffffffffu64;
    slots[496] = slots[494] & slots[495];
    slots[497] = slots[483] & slots[471];
    slots[498] = slots[496] | slots[497];
    slots[499] = (slots[7]).wrapping_add(slots[459]);
    slots[500] = (slots[499]).wrapping_add(slots[498]);
    slots[501] = (slots[500]).wrapping_add(0x13b7c77bu64);
    slots[502] = slots[501] << 21;
    slots[503] = slots[501] & 0xfffff800u64;
    slots[504] = slots[503] >> 11;
    slots[505] = slots[504] | slots[502];
    slots[506] = (slots[505]).wrapping_add(slots[494]);
    slots[507] = slots[483] ^ 0xffffffffffffffffu64;
    slots[508] = slots[506] & slots[507];
    slots[509] = slots[494] & slots[483];
    slots[510] = slots[508] | slots[509];
    slots[511] = (slots[25]).wrapping_add(slots[471]);
    slots[512] = (slots[511]).wrapping_add(slots[510]);
    slots[513] = (slots[512]).wrapping_add(0xffffffffeb8bdcb9u64);
    slots[514] = slots[513] << 16;
    slots[515] = slots[513] & 0xffff0000u64;
    slots[516] = slots[515] >> 16;
    slots[517] = slots[516] | slots[514];
    slots[518] = (slots[517]).wrapping_add(slots[506]);
    slots[519] = slots[494] ^ 0xffffffffffffffffu64;
    slots[520] = slots[518] & slots[519];
    slots[521] = slots[506] & slots[494];
    slots[522] = slots[520] | slots[521];
    slots[523] = (slots[43]).wrapping_add(slots[483]);
    slots[524] = (slots[523]).wrapping_add(slots[522]);
    slots[525] = (slots[524]).wrapping_add(0x49c05c20u64);
    slots[526] = slots[525] << 9;
    slots[527] = slots[525] & 0xff800000u64;
    slots[528] = slots[527] >> 23;
    slots[529] = slots[528] | slots[526];
    slots[530] = (slots[529]).wrapping_add(slots[518]);
    slots[531] = slots[506] ^ 0xffffffffffffffffu64;
    slots[532] = slots[530] & slots[531];
    slots[533] = slots[518] & slots[506];
    slots[534] = slots[532] | slots[533];
    slots[535] = (slots[494]).wrapping_add(0x6ce1c012u64);
    slots[536] = (slots[535]).wrapping_add(slots[534]);
    slots[537] = (slots[536]).wrapping_add(0xffffffff8f5cc2e6u64);
    slots[538] = slots[537] & 0xfffffff0u64;
    slots[539] = slots[537] << 28;
    slots[540] = slots[538] >> 4;
    slots[541] = slots[540] | slots[539];
    slots[542] = (slots[541]).wrapping_add(slots[530]);
    slots[543] = slots[518] ^ 0xffffffffffffffffu64;
    slots[544] = slots[542] & slots[543];
    slots[545] = slots[530] & slots[518];
    slots[546] = slots[544] | slots[545];
    slots[547] = (slots[506]).wrapping_add(0xda0000u64);
    slots[548] = (slots[547]).wrapping_add(slots[546]);
    slots[549] = (slots[548]).wrapping_add(0x40ffcb39u64);
    slots[550] = slots[549] & 0xfffff800u64;
    slots[551] = slots[549] << 21;
    slots[552] = slots[550] >> 11;
    slots[553] = slots[552] | slots[551];
    slots[554] = (slots[553]).wrapping_add(slots[542]);
    slots[555] = slots[530] ^ 0xffffffffffffffffu64;
    slots[556] = slots[554] & slots[555];
    slots[557] = slots[542] & slots[530];
    slots[558] = slots[556] | slots[557];
    slots[559] = (slots[518]).wrapping_add(slots[558]);
    slots[560] = (slots[559]).wrapping_add(0xffffffffa518a162u64);
    slots[561] = slots[560] & 0xffff0000u64;
    slots[562] = slots[560] << 16;
    slots[563] = slots[561] >> 16;
    slots[564] = slots[563] | slots[562];
    slots[565] = (slots[7]).wrapping_add(slots[542]);
    slots[566] = slots[542] ^ 0xffffffffffffffffu64;
    slots[567] = slots[554] & slots[542];
    slots[568] = (slots[564]).wrapping_add(slots[554]);
    slots[569] = slots[568] & slots[566];
    slots[570] = slots[569] | slots[567];
    slots[571] = (slots[19]).wrapping_add(slots[530]);
    slots[572] = (slots[571]).wrapping_add(slots[570]);
    slots[573] = (slots[572]).wrapping_add(0x28d948a2u64);
    slots[574] = slots[573] & 0xff800000u64;
    slots[575] = slots[573] << 9;
    slots[576] = slots[574] >> 23;
    slots[577] = slots[576] | slots[575];
    slots[578] = (slots[47]).wrapping_add(slots[554]);
    slots[579] = (slots[577]).wrapping_add(slots[568]);
    slots[580] = slots[579] ^ 0xffffffffffffffffu64;
    slots[581] = slots[554] | slots[580];
    slots[582] = slots[581] ^ slots[568];
    slots[583] = (slots[565]).wrapping_add(slots[582]);
    slots[584] = (slots[583]).wrapping_add(0xffffffffd994af4eu64);
    slots[585] = slots[584] << 26;
    slots[586] = slots[584] & 0xffffffc0u64;
    slots[587] = slots[586] >> 6;
    slots[588] = slots[587] | slots[585];
    slots[589] = (slots[568]).wrapping_add(0x647b0f13u64);
    slots[590] = (slots[588]).wrapping_add(slots[579]);
    slots[591] = slots[590] ^ 0xffffffffffffffffu64;
    slots[592] = slots[568] | slots[591];
    slots[593] = slots[592] ^ slots[579];
    slots[594] = (slots[578]).wrapping_add(slots[593]);
    slots[595] = (slots[594]).wrapping_add(0x17e7ba4du64);
    slots[596] = slots[595] << 22;
    slots[597] = slots[595] & 0xfffffc00u64;
    slots[598] = slots[597] >> 10;
    slots[599] = slots[598] | slots[596];
    slots[600] = (slots[37]).wrapping_add(slots[579]);
    slots[601] = (slots[599]).wrapping_add(slots[590]);
    slots[602] = slots[601] ^ 0xffffffffffffffffu64;
    slots[603] = slots[579] | slots[602];
    slots[604] = slots[603] ^ slots[590];
    slots[605] = (slots[589]).wrapping_add(slots[604]);
    slots[606] = (slots[605]).wrapping_add(0x1b9063e2u64);
    slots[607] = slots[606] << 17;
    slots[608] = slots[606] & 0xffff8000u64;
    slots[609] = slots[608] >> 15;
    slots[610] = slots[609] | slots[607];
    slots[611] = (slots[590]).wrapping_add(0xda0000u64);
    slots[612] = (slots[610]).wrapping_add(slots[601]);
    slots[613] = slots[612] ^ 0xffffffffffffffffu64;
    slots[614] = slots[590] | slots[613];
    slots[615] = slots[614] ^ slots[601];
    slots[616] = (slots[600]).wrapping_add(slots[615]);
    slots[617] = (slots[616]).wrapping_add(0x255131f9u64);
    slots[618] = slots[617] << 11;
    slots[619] = slots[617] & 0xffe00000u64;
    slots[620] = slots[619] >> 21;
    slots[621] = slots[620] | slots[618];
    slots[622] = (slots[25]).wrapping_add(slots[601]);
    slots[623] = (slots[621]).wrapping_add(slots[612]);
    slots[624] = slots[623] ^ 0xffffffffffffffffu64;
    slots[625] = slots[601] | slots[624];
    slots[626] = slots[625] ^ slots[612];
    slots[627] = (slots[611]).wrapping_add(slots[626]);
    slots[628] = (slots[627]).wrapping_add(0x57de67fcu64);
    slots[629] = slots[628] << 26;
    slots[630] = slots[628] & 0xffffffc0u64;
    slots[631] = slots[630] >> 6;
    slots[632] = slots[631] | slots[629];
    slots[633] = (slots[612]).wrapping_add(0xfffffffff2621cb8u64);
    slots[634] = (slots[632]).wrapping_add(slots[623]);
    slots[635] = slots[634] ^ 0xffffffffffffffffu64;
    slots[636] = slots[612] | slots[635];
    slots[637] = slots[636] ^ slots[623];
    slots[638] = (slots[622]).wrapping_add(slots[637]);
    slots[639] = (slots[638]).wrapping_add(0x25899b58u64);
    slots[640] = slots[639] << 22;
    slots[641] = slots[639] & 0xfffffc00u64;
    slots[642] = slots[641] >> 10;
    slots[643] = slots[642] | slots[640];
    slots[644] = (slots[13]).wrapping_add(slots[623]);
    slots[645] = (slots[643]).wrapping_add(slots[634]);
    slots[646] = slots[645] ^ 0xffffffffffffffffu64;
    slots[647] = slots[623] | slots[646];
    slots[648] = slots[647] ^ slots[634];
    slots[649] = (slots[633]).wrapping_add(slots[648]);
    slots[650] = (slots[649]).wrapping_add(0xffffffff9126c3a0u64);
    slots[651] = slots[650] << 17;
    slots[652] = slots[650] & 0xffff8000u64;
    slots[653] = slots[652] >> 15;
    slots[654] = slots[653] | slots[651];
    slots[655] = (slots[634]).wrapping_add(0xffffffff9803a6e9u64);
    slots[656] = (slots[654]).wrapping_add(slots[645]);
    slots[657] = slots[656] ^ 0xffffffffffffffffu64;
    slots[658] = slots[634] | slots[657];
    slots[659] = slots[658] ^ slots[645];
    slots[660] = (slots[644]).wrapping_add(slots[659]);
    slots[661] = (slots[660]).wrapping_add(0xffffffffb596c523u64);
    slots[662] = slots[661] << 11;
    slots[663] = slots[661] & 0xffe00000u64;
    slots[664] = slots[663] >> 21;
    slots[665] = slots[664] | slots[662];
    slots[666] = (slots[665]).wrapping_add(slots[656]);
    slots[667] = slots[666] ^ 0xffffffffffffffffu64;
    slots[668] = slots[645] | slots[667];
    slots[669] = slots[668] ^ slots[656];
    slots[670] = (slots[655]).wrapping_add(slots[669]);
    slots[671] = (slots[670]).wrapping_add(0xffffffffb1fd28efu64);
    slots[672] = slots[671] << 26;
    slots[673] = slots[671] & 0xffffffc0u64;
    slots[674] = slots[673] >> 6;
    slots[675] = slots[674] | slots[672];
    slots[676] = (slots[43]).wrapping_add(slots[656]);
    slots[677] = (slots[675]).wrapping_add(slots[666]);
    slots[678] = slots[677] ^ 0xffffffffffffffffu64;
    slots[679] = slots[656] | slots[678];
    slots[680] = slots[679] ^ slots[666];
    slots[681] = (slots[645]).wrapping_add(slots[680]);
    slots[682] = (slots[681]).wrapping_add(0x4b78b265u64);
    slots[683] = slots[682] << 22;
    slots[684] = slots[682] & 0xfffffc00u64;
    slots[685] = slots[684] >> 10;
    slots[686] = slots[685] | slots[683];
    slots[687] = (slots[686]).wrapping_add(slots[677]);
    slots[688] = slots[687] ^ 0xffffffffffffffffu64;
    slots[689] = slots[666] | slots[688];
    slots[690] = slots[689] ^ slots[677];
    slots[691] = (slots[676]).wrapping_add(slots[690]);
    slots[692] = (slots[691]).wrapping_add(0x5c0b8b53u64);
    slots[693] = slots[692] << 17;
    slots[694] = slots[692] & 0xffff8000u64;
    slots[695] = slots[694] >> 15;
    slots[696] = slots[695] | slots[693];
    slots[697] = (slots[31]).wrapping_add(slots[677]);
    slots[698] = (slots[696]).wrapping_add(slots[687]);
    slots[699] = slots[698] ^ 0xffffffffffffffffu64;
    slots[700] = slots[677] | slots[699];
    slots[701] = slots[700] ^ slots[687];
    slots[702] = (slots[666]).wrapping_add(slots[701]);
    slots[703] = (slots[702]).wrapping_add(0xffffffffa26ab404u64);
    slots[704] = slots[703] << 11;
    slots[705] = slots[703] & 0xffe00000u64;
    slots[706] = slots[705] >> 21;
    slots[707] = slots[706] | slots[704];
    slots[708] = (slots[687]).wrapping_add(0x1c43ecf9u64);
    slots[709] = (slots[707]).wrapping_add(slots[698]);
    slots[710] = slots[709] ^ 0xffffffffffffffffu64;
    slots[711] = slots[687] | slots[710];
    slots[712] = slots[711] ^ slots[698];
    slots[713] = (slots[697]).wrapping_add(slots[712]);
    slots[714] = (slots[713]).wrapping_add(0x38b6ca86u64);
    slots[715] = slots[714] & 0xffffffc0u64;
    slots[716] = slots[714] << 26;
    slots[717] = slots[715] >> 6;
    slots[718] = slots[717] | slots[716];
    slots[719] = (slots[19]).wrapping_add(slots[698]);
    slots[720] = (slots[718]).wrapping_add(slots[709]);
    slots[721] = slots[720] ^ 0xffffffffffffffffu64;
    slots[722] = slots[698] | slots[721];
    slots[723] = slots[722] ^ slots[709];
    slots[724] = (slots[708]).wrapping_add(slots[723]);
    slots[725] = (slots[724]).wrapping_add(0xffffffff8d17d94au64);
    slots[726] = slots[725] & 0xfffffc00u64;
    slots[727] = slots[725] << 22;
    slots[728] = slots[726] >> 10;
    slots[729] = slots[728] | slots[727];
    slots[730] = (slots[709]).wrapping_add(0x6ce1c012u64);
    slots[731] = (slots[729]).wrapping_add(slots[720]);
    slots[732] = slots[731] ^ 0xffffffffffffffffu64;
    slots[733] = slots[709] | slots[732];
    slots[734] = slots[733] ^ slots[720];
    slots[735] = (slots[719]).wrapping_add(slots[734]);
    slots[736] = (slots[731]).wrapping_add(0x9c4d7d6u64);
    slots[737] = (slots[735]).wrapping_add(0xffffffffbcee287eu64);
    slots[738] = slots[737] & 0xffff8000u64;
    slots[739] = slots[737] << 17;
    slots[740] = slots[738] >> 15;
    slots[741] = slots[740] | slots[739];
    slots[742] = (slots[720]).wrapping_add(0xffffffffece39db5u64);
    slots[743] = slots[742] >> 16;
    slots[744] = slots[742] >> 8;
    slots[745] = slots[742] >> 24;
    slots[746] = (slots[736]).wrapping_mul(0x85u64);
    slots[747] = slots[736] & 0xffffffffu64;
    slots[748] = slots[747] >> 8;
    slots[749] = (slots[746]).wrapping_add(slots[748]);
    slots[750] = slots[749] & 0xffu64;
    slots[751] = (slots[750]).wrapping_mul(0x85u64);
    slots[752] = (slots[748]).wrapping_mul(0x85u64);
    slots[753] = slots[747] >> 16;
    slots[754] = (slots[752]).wrapping_add(slots[753]);
    slots[755] = (slots[754]).wrapping_mul(0x85u64);
    slots[756] = (slots[751]).wrapping_add(slots[753]);
    slots[757] = (slots[756]).wrapping_mul(0x85u64);
    slots[758] = slots[747] >> 24;
    slots[759] = (slots[753]).wrapping_mul(0x85u64);
    slots[760] = (slots[759]).wrapping_add(slots[758]);
    slots[761] = (slots[757]).wrapping_add(slots[758]);
    slots[762] = (slots[755]).wrapping_add(slots[758]);
    slots[763] = (slots[741]).wrapping_add(slots[731]);
    slots[764] = (slots[763]).wrapping_add(0x73880622u64);
    slots[765] = (slots[763]).wrapping_add(0x32d88f3fu64);
    slots[766] = slots[763] ^ 0xffffffffffffffffu64;
    slots[767] = slots[720] | slots[766];
    slots[768] = slots[767] ^ slots[731];
    slots[769] = (slots[730]).wrapping_add(slots[768]);
    slots[770] = (slots[769]).wrapping_add(0x7b3d4c4au64);
    slots[771] = slots[770] & 0xffe00000u64;
    slots[772] = slots[770] << 11;
    slots[773] = slots[771] >> 21;
    slots[774] = slots[773] | slots[772];
    slots[775] = (slots[765]).wrapping_add(slots[774]);
    slots[776] = slots[764] >> 8;
    slots[777] = slots[764] >> 16;
    slots[778] = slots[764] >> 24;
    slots[779] = slots[762] & 0xffu64;
    slots[780] = (slots[779]).wrapping_mul(0x85u64);
    slots[781] = (slots[761]).wrapping_mul(0x85u64);
    slots[782] = (slots[760]).wrapping_mul(0x85u64);
    slots[783] = (slots[782]).wrapping_add(slots[775]);
    slots[784] = (slots[781]).wrapping_add(slots[775]);
    slots[785] = (slots[780]).wrapping_add(slots[775]);
    slots[786] = slots[775] & 0xffffffffu64;
    slots[787] = slots[784] & 0xffu64;
    slots[788] = (slots[787]).wrapping_mul(0x85u64);
    slots[789] = slots[783] & 0xffu64;
    slots[790] = (slots[789]).wrapping_mul(0x85u64);
    slots[791] = slots[786] >> 8;
    slots[792] = (slots[790]).wrapping_add(slots[791]);
    slots[793] = (slots[788]).wrapping_add(slots[791]);
    slots[794] = (slots[785]).wrapping_mul(0x85u64);
    slots[795] = (slots[794]).wrapping_add(slots[791]);
    slots[796] = (slots[795]).wrapping_mul(0x85u64);
    slots[797] = (slots[793]).wrapping_mul(0x85u64);
    slots[798] = slots[786] >> 16;
    slots[799] = (slots[797]).wrapping_add(slots[798]);
    slots[800] = (slots[796]).wrapping_add(slots[798]);
    slots[801] = (slots[792]).wrapping_mul(0x85u64);
    slots[802] = (slots[801]).wrapping_add(slots[798]);
    slots[803] = (slots[802]).wrapping_mul(0x85u64);
    slots[804] = slots[800] & 0xffu64;
    slots[805] = (slots[804]).wrapping_mul(0x85u64);
    slots[806] = slots[786] >> 24;
    slots[807] = (slots[805]).wrapping_add(slots[806]);
    slots[808] = (slots[803]).wrapping_add(slots[806]);
    slots[809] = (slots[799]).wrapping_mul(0x85u64);
    slots[810] = (slots[809]).wrapping_add(slots[806]);
    slots[811] = slots[764] & 0xffu64;
    slots[812] = slots[811] << 56;
    slots[813] = ((slots[812] as i64) >> 56) as u64;
    slots[814] = slots[813] & 0xffu64;
    slots[815] = slots[810] & 0xffu64;
    slots[816] = (slots[815]).wrapping_mul(0x85u64);
    slots[817] = slots[808] & 0xffu64;
    slots[818] = (slots[817]).wrapping_mul(0x85u64);
    slots[819] = (slots[818]).wrapping_add(slots[814]);
    slots[820] = (slots[816]).wrapping_add(slots[814]);
    slots[821] = (slots[807]).wrapping_mul(0x85u64);
    slots[822] = (slots[821]).wrapping_add(slots[814]);
    slots[823] = slots[776] & 0xffu64;
    slots[824] = slots[823] << 56;
    slots[825] = ((slots[824] as i64) >> 56) as u64;
    slots[826] = slots[825] & 0xffu64;
    slots[827] = (slots[822]).wrapping_mul(0x85u64);
    slots[828] = (slots[820]).wrapping_mul(0x85u64);
    slots[829] = (slots[828]).wrapping_add(slots[826]);
    slots[830] = (slots[827]).wrapping_add(slots[826]);
    slots[831] = (slots[819]).wrapping_mul(0x85u64);
    slots[832] = (slots[831]).wrapping_add(slots[826]);
    slots[833] = slots[777] & 0xffu64;
    slots[834] = slots[833] << 56;
    slots[835] = ((slots[834] as i64) >> 56) as u64;
    slots[836] = slots[835] & 0xffu64;
    slots[837] = (slots[832]).wrapping_mul(0x85u64);
    slots[838] = slots[830] & 0xffu64;
    slots[839] = (slots[838]).wrapping_mul(0x85u64);
    slots[840] = (slots[839]).wrapping_add(slots[836]);
    slots[841] = (slots[837]).wrapping_add(slots[836]);
    slots[842] = (slots[829]).wrapping_mul(0x85u64);
    slots[843] = (slots[842]).wrapping_add(slots[836]);
    slots[844] = slots[778] & 0xffu64;
    slots[845] = slots[844] << 56;
    slots[846] = ((slots[845] as i64) >> 56) as u64;
    slots[847] = slots[846] & 0xffu64;
    slots[848] = slots[843] & 0xffu64;
    slots[849] = (slots[848]).wrapping_mul(0x85u64);
    slots[850] = slots[841] & 0xffu64;
    slots[851] = (slots[850]).wrapping_mul(0x85u64);
    slots[852] = (slots[840]).wrapping_mul(0x85u64);
    slots[853] = (slots[852]).wrapping_add(slots[847]);
    slots[854] = (slots[851]).wrapping_add(slots[847]);
    slots[855] = (slots[849]).wrapping_add(slots[847]);
    slots[856] = slots[743] & 0xffu64;
    slots[857] = slots[856] << 56;
    slots[858] = ((slots[857] as i64) >> 56) as u64;
    slots[859] = slots[858] & 0xffu64;
    slots[860] = slots[744] & 0xffu64;
    slots[861] = slots[860] << 56;
    slots[862] = ((slots[861] as i64) >> 56) as u64;
    slots[863] = slots[862] & 0xffu64;
    slots[864] = slots[742] & 0xffu64;
    slots[865] = slots[864] << 56;
    slots[866] = ((slots[865] as i64) >> 56) as u64;
    slots[867] = slots[866] & 0xffu64;
    slots[868] = (slots[853]).wrapping_mul(0x85u64);
    slots[869] = (slots[868]).wrapping_add(slots[867]);
    slots[870] = slots[869] & 0xffu64;
    slots[871] = (slots[870]).wrapping_mul(0x85u64);
    slots[872] = (slots[871]).wrapping_add(slots[863]);
    slots[873] = (slots[872]).wrapping_mul(0x85u64);
    slots[874] = (slots[873]).wrapping_add(slots[859]);
    slots[875] = slots[874] << 8;
    slots[876] = slots[875] & 0x6f00u64;
    slots[877] = (slots[855]).wrapping_mul(0x85u64);
    slots[878] = (slots[877]).wrapping_add(slots[867]);
    slots[879] = (slots[854]).wrapping_mul(0x85u64);
    slots[880] = (slots[879]).wrapping_add(slots[867]);
    slots[881] = (slots[880]).wrapping_mul(0x85u64);
    slots[882] = (slots[881]).wrapping_add(slots[863]);
    slots[883] = (slots[878]).wrapping_mul(0x85u64);
    slots[884] = (slots[883]).wrapping_add(slots[863]);
    slots[885] = slots[884] & 0x3fu64;
    slots[886] = slots[885] | slots[876];
    slots[887] = slots[882] & 0xffu64;
    slots[888] = (slots[887]).wrapping_mul(0x85u64);
    slots[889] = (slots[888]).wrapping_add(slots[859]);
    slots[890] = (slots[889]).wrapping_mul(0x85u64);
    slots[891] = slots[745] & 0xffu64;
    slots[892] = slots[891] << 56;
    slots[893] = ((slots[892] as i64) >> 56) as u64;
    slots[894] = (slots[890]).wrapping_add(slots[893]);
    slots[895] = slots[894] << 16;
    slots[896] = slots[895] & 0x7b0000u64;
    slots[897] = slots[886] | slots[896];
    slots[898] = slots[897] | 0x63000000u64;
    slots[899] = slots[898] & 0xffffffffu64;
    Ok((slots[899] & 0xffffffff) as u32)
}
pub fn notice_id(bytes: &[u8]) -> Result<u32> {
    from_md5_hex(&hex::encode(md5(bytes)))
}

#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn independent_arithmetic_vectors() {
        for (input, expected) in [
            ("00000000000000000000000000000000", 1661168143),
            ("ffffffffffffffffffffffffffffffff", 1667433512),
            ("0123456789abcdef0123456789abcdef", 1663058469),
        ] {
            assert_eq!(from_md5_hex(input).unwrap(), expected);
        }
        for (input, expected) in [
            ("", 1661159480),
            ("a", 1665223448),
            ("abc", 1668286726),
            ("synthetic notice checksum", 1662085121),
        ] {
            assert_eq!(notice_id(input.as_bytes()).unwrap(), expected);
        }
    }
    #[test]
    fn input_domain_restricted() {
        for s in [
            "",
            "0123",
            "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
            "0000000000000000000000000000000g",
        ] {
            assert!(from_md5_hex(s).is_err());
        }
    }
}