blob: e033366886afe845196a59994cc9263255677356 [file] [log] [blame]
// See file LICENSE for more information.
library impl.block_cipher.aes_fast;
import 'dart:typed_data';
import 'package:pointycastle/api.dart';
import 'package:pointycastle/src/impl/base_block_cipher.dart';
import 'package:pointycastle/src/registry/registry.dart';
import 'package:pointycastle/src/ufixnum.dart';
/// An implementation of the AES (Rijndael), from FIPS-197.
///
/// For further details see: [http://csrc.nist.gov/encryption/aes/]
///
/// This implementation is based on optimizations from Dr. Brian Gladman's paper
/// and C code at [http://fp.gladman.plus.com/cryptography_technology/rijndael/]
class AESFastEngine extends BaseBlockCipher {
static final FactoryConfig factoryConfig =
StaticFactoryConfig(BlockCipher, 'AES', () => AESFastEngine());
static const _BLOCK_SIZE = 16;
late bool _forEncryption;
List<List<int>>? _workingKey;
late int _rounds;
late int _c0, _c1, _c2, _c3;
@override
String get algorithmName => 'AES';
@override
int get blockSize => _BLOCK_SIZE;
@override
void reset() {
_rounds = 0;
_c0 = _c1 = _c2 = _c3 = 0;
_forEncryption = false;
_workingKey = null;
}
@override
void init(bool forEncryption, covariant KeyParameter params) {
var key = params.key;
var kc = (key.lengthInBytes / 4).floor(); // key length in words
if (((kc != 4) && (kc != 6) && (kc != 8)) ||
((kc * 4) != key.lengthInBytes)) {
throw ArgumentError('Key length must be 128/192/256 bits');
}
_forEncryption = forEncryption;
_rounds = kc +
6; // This is not always true for the generalized Rijndael that allows larger block sizes
_workingKey = List.generate(
_rounds + 1,
(int i) =>
List<int>.filled(4, 0, growable: false)); // 4 words in a block
// Copy the key into the round key array.
var keyView = ByteData.view(
params.key.buffer, params.key.offsetInBytes, params.key.length);
for (var i = 0, t = 0; i < key.lengthInBytes; i += 4, t++) {
var value = unpack32(keyView, i, Endian.little);
_workingKey![t >> 2][t & 3] = value;
}
// While not enough round key material calculated calculate values.
var k = (_rounds + 1) << 2;
for (var i = kc; i < k; i++) {
var temp = _workingKey![(i - 1) >> 2][(i - 1) & 3].toInt();
if ((i % kc) == 0) {
temp = _subWord(_shift(temp, 8)) ^ _rcon[((i / kc) - 1).floor()];
} else if ((kc > 6) && ((i % kc) == 4)) {
temp = _subWord(temp);
}
var value = _workingKey![(i - kc) >> 2][(i - kc) & 3] ^ temp;
_workingKey![i >> 2][i & 3] = value;
}
if (!forEncryption) {
for (var j = 1; j < _rounds; j++) {
for (var i = 0; i < 4; i++) {
var value = _invMcol(_workingKey![j][i].toInt());
_workingKey![j][i] = value;
}
}
}
}
@override
int processBlock(Uint8List inp, int inpOff, Uint8List out, int outOff) {
if (_workingKey == null) {
throw StateError('AES engine not initialised');
}
if ((inpOff + (32 / 2)) > inp.lengthInBytes) {
throw ArgumentError('Input buffer too short');
}
if ((outOff + (32 / 2)) > out.lengthInBytes) {
throw ArgumentError('Output buffer too short');
}
var inpView = ByteData.view(inp.buffer, inp.offsetInBytes, inp.length);
var outView = ByteData.view(out.buffer, out.offsetInBytes, out.length);
if (_forEncryption) {
_unpackBlock(inpView, inpOff);
_encryptBlock(_workingKey!);
_packBlock(outView, outOff);
} else {
_unpackBlock(inpView, inpOff);
_decryptBlock(_workingKey!);
_packBlock(outView, outOff);
}
return _BLOCK_SIZE;
}
void _encryptBlock(List<List<int?>> kw) {
int r, r0, r1, r2, r3;
_c0 ^= kw[0][0]!.toInt();
_c1 ^= kw[0][1]!.toInt();
_c2 ^= kw[0][2]!.toInt();
_c3 ^= kw[0][3]!.toInt();
r = 1;
while (r < _rounds - 1) {
r0 = _t0[_c0 & 255] ^
_t1[(_c1 >> 8) & 255] ^
_t2[(_c2 >> 16) & 255] ^
_t3[(_c3 >> 24) & 255] ^
kw[r][0]!.toInt();
r1 = _t0[_c1 & 255] ^
_t1[(_c2 >> 8) & 255] ^
_t2[(_c3 >> 16) & 255] ^
_t3[(_c0 >> 24) & 255] ^
kw[r][1]!.toInt();
r2 = _t0[_c2 & 255] ^
_t1[(_c3 >> 8) & 255] ^
_t2[(_c0 >> 16) & 255] ^
_t3[(_c1 >> 24) & 255] ^
kw[r][2]!.toInt();
r3 = _t0[_c3 & 255] ^
_t1[(_c0 >> 8) & 255] ^
_t2[(_c1 >> 16) & 255] ^
_t3[(_c2 >> 24) & 255] ^
kw[r][3]!.toInt();
r++;
_c0 = _t0[r0 & 255] ^
_t1[(r1 >> 8) & 255] ^
_t2[(r2 >> 16) & 255] ^
_t3[(r3 >> 24) & 255] ^
kw[r][0]!.toInt();
_c1 = _t0[r1 & 255] ^
_t1[(r2 >> 8) & 255] ^
_t2[(r3 >> 16) & 255] ^
_t3[(r0 >> 24) & 255] ^
kw[r][1]!.toInt();
_c2 = _t0[r2 & 255] ^
_t1[(r3 >> 8) & 255] ^
_t2[(r0 >> 16) & 255] ^
_t3[(r1 >> 24) & 255] ^
kw[r][2]!.toInt();
_c3 = _t0[r3 & 255] ^
_t1[(r0 >> 8) & 255] ^
_t2[(r1 >> 16) & 255] ^
_t3[(r2 >> 24) & 255] ^
kw[r][3]!.toInt();
r++;
}
r0 = _t0[_c0 & 255] ^
_t1[(_c1 >> 8) & 255] ^
_t2[(_c2 >> 16) & 255] ^
_t3[(_c3 >> 24) & 255] ^
kw[r][0]!.toInt();
r1 = _t0[_c1 & 255] ^
_t1[(_c2 >> 8) & 255] ^
_t2[(_c3 >> 16) & 255] ^
_t3[(_c0 >> 24) & 255] ^
kw[r][1]!.toInt();
r2 = _t0[_c2 & 255] ^
_t1[(_c3 >> 8) & 255] ^
_t2[(_c0 >> 16) & 255] ^
_t3[(_c1 >> 24) & 255] ^
kw[r][2]!.toInt();
r3 = _t0[_c3 & 255] ^
_t1[(_c0 >> 8) & 255] ^
_t2[(_c1 >> 16) & 255] ^
_t3[(_c2 >> 24) & 255] ^
kw[r][3]!.toInt();
r++;
// the final round's table is a simple function of S so we don't use a whole other four tables for it
_c0 = (_s[r0 & 255] & 255) ^
((_s[(r1 >> 8) & 255] & 255) << 8) ^
((_s[(r2 >> 16) & 255] & 255) << 16) ^
(_s[(r3 >> 24) & 255] << 24) ^
kw[r][0]!.toInt();
_c1 = (_s[r1 & 255] & 255) ^
((_s[(r2 >> 8) & 255] & 255) << 8) ^
((_s[(r3 >> 16) & 255] & 255) << 16) ^
(_s[(r0 >> 24) & 255] << 24) ^
kw[r][1]!.toInt();
_c2 = (_s[r2 & 255] & 255) ^
((_s[(r3 >> 8) & 255] & 255) << 8) ^
((_s[(r0 >> 16) & 255] & 255) << 16) ^
(_s[(r1 >> 24) & 255] << 24) ^
kw[r][2]!.toInt();
_c3 = (_s[r3 & 255] & 255) ^
((_s[(r0 >> 8) & 255] & 255) << 8) ^
((_s[(r1 >> 16) & 255] & 255) << 16) ^
(_s[(r2 >> 24) & 255] << 24) ^
kw[r][3]!.toInt();
}
void _decryptBlock(List<List<int?>> kw) {
int r, r0, r1, r2, r3;
_c0 ^= kw[_rounds][0]!.toInt();
_c1 ^= kw[_rounds][1]!.toInt();
_c2 ^= kw[_rounds][2]!.toInt();
_c3 ^= kw[_rounds][3]!.toInt();
r = _rounds - 1;
while (r > 1) {
r0 = _tinv0[_c0 & 255] ^
_tinv1[(_c3 >> 8) & 255] ^
_tinv2[(_c2 >> 16) & 255] ^
_tinv3[(_c1 >> 24) & 255] ^
kw[r][0]!.toInt();
r1 = _tinv0[_c1 & 255] ^
_tinv1[(_c0 >> 8) & 255] ^
_tinv2[(_c3 >> 16) & 255] ^
_tinv3[(_c2 >> 24) & 255] ^
kw[r][1]!.toInt();
r2 = _tinv0[_c2 & 255] ^
_tinv1[(_c1 >> 8) & 255] ^
_tinv2[(_c0 >> 16) & 255] ^
_tinv3[(_c3 >> 24) & 255] ^
kw[r][2]!.toInt();
r3 = _tinv0[_c3 & 255] ^
_tinv1[(_c2 >> 8) & 255] ^
_tinv2[(_c1 >> 16) & 255] ^
_tinv3[(_c0 >> 24) & 255] ^
kw[r][3]!.toInt();
r--;
_c0 = _tinv0[r0 & 255] ^
_tinv1[(r3 >> 8) & 255] ^
_tinv2[(r2 >> 16) & 255] ^
_tinv3[(r1 >> 24) & 255] ^
kw[r][0]!.toInt();
_c1 = _tinv0[r1 & 255] ^
_tinv1[(r0 >> 8) & 255] ^
_tinv2[(r3 >> 16) & 255] ^
_tinv3[(r2 >> 24) & 255] ^
kw[r][1]!.toInt();
_c2 = _tinv0[r2 & 255] ^
_tinv1[(r1 >> 8) & 255] ^
_tinv2[(r0 >> 16) & 255] ^
_tinv3[(r3 >> 24) & 255] ^
kw[r][2]!.toInt();
_c3 = _tinv0[r3 & 255] ^
_tinv1[(r2 >> 8) & 255] ^
_tinv2[(r1 >> 16) & 255] ^
_tinv3[(r0 >> 24) & 255] ^
kw[r][3]!.toInt();
r--;
}
r0 = _tinv0[_c0 & 255] ^
_tinv1[(_c3 >> 8) & 255] ^
_tinv2[(_c2 >> 16) & 255] ^
_tinv3[(_c1 >> 24) & 255] ^
kw[r][0]!.toInt();
r1 = _tinv0[_c1 & 255] ^
_tinv1[(_c0 >> 8) & 255] ^
_tinv2[(_c3 >> 16) & 255] ^
_tinv3[(_c2 >> 24) & 255] ^
kw[r][1]!.toInt();
r2 = _tinv0[_c2 & 255] ^
_tinv1[(_c1 >> 8) & 255] ^
_tinv2[(_c0 >> 16) & 255] ^
_tinv3[(_c3 >> 24) & 255] ^
kw[r][2]!.toInt();
r3 = _tinv0[_c3 & 255] ^
_tinv1[(_c2 >> 8) & 255] ^
_tinv2[(_c1 >> 16) & 255] ^
_tinv3[(_c0 >> 24) & 255] ^
kw[r][3]!.toInt();
// the final round's table is a simple function of Si so we don't use a whole other four tables for it
_c0 = (_si[r0 & 255] & 255) ^
((_si[(r3 >> 8) & 255] & 255) << 8) ^
((_si[(r2 >> 16) & 255] & 255) << 16) ^
(_si[(r1 >> 24) & 255] << 24) ^
kw[0][0]!.toInt();
_c1 = (_si[r1 & 255] & 255) ^
((_si[(r0 >> 8) & 255] & 255) << 8) ^
((_si[(r3 >> 16) & 255] & 255) << 16) ^
(_si[(r2 >> 24) & 255] << 24) ^
kw[0][1]!.toInt();
_c2 = (_si[r2 & 255] & 255) ^
((_si[(r1 >> 8) & 255] & 255) << 8) ^
((_si[(r0 >> 16) & 255] & 255) << 16) ^
(_si[(r3 >> 24) & 255] << 24) ^
kw[0][2]!.toInt();
_c3 = (_si[r3 & 255] & 255) ^
((_si[(r2 >> 8) & 255] & 255) << 8) ^
((_si[(r1 >> 16) & 255] & 255) << 16) ^
(_si[(r0 >> 24) & 255] << 24) ^
kw[0][3]!.toInt();
}
void _unpackBlock(ByteData view, int off) {
_c0 = unpack32(view, off, Endian.little);
_c1 = unpack32(view, off + 4, Endian.little);
_c2 = unpack32(view, off + 8, Endian.little);
_c3 = unpack32(view, off + 12, Endian.little);
}
void _packBlock(ByteData view, int off) {
pack32(_c0, view, off, Endian.little);
pack32(_c1, view, off + 4, Endian.little);
pack32(_c2, view, off + 8, Endian.little);
pack32(_c3, view, off + 12, Endian.little);
}
}
int _shift(int r, int shift) => rotr32(r, shift);
/* multiply four bytes in GF(2^8) by 'x' {02} in parallel */
const int _m1 = 0x80808080;
const int _m2 = 0x7f7f7f7f;
const int _m3 = 0x0000001b;
int _fFmulX(int x) {
var lsr = shiftr32((x & _m1), 7);
return (((x & _m2) << 1) ^ lsr * _m3);
}
///
/// The following defines provide alternative definitions of FFmulX that might
/// give improved performance if a fast 32-bit multiply is not available.
/// private int FFmulX(int x) { int u = x & m1; u |= (u >> 1); return ((x & m2) << 1) ^ ((u >>> 3) | (u >>> 6)); }
/// private static final int m4 = 0x1b1b1b1b;
/// private int FFmulX(int x) { int u = x & m1; return ((x & m2) << 1) ^ ((u - (u >>> 7)) & m4); }
///
int _invMcol(int x) {
var f2 = _fFmulX(x);
var f4 = _fFmulX(f2);
var f8 = _fFmulX(f4);
var f9 = x ^ f8;
return f2 ^
f4 ^
f8 ^
_shift(f2 ^ f9, 8) ^
_shift(f4 ^ f9, 16) ^
_shift(f9, 24);
}
int _subWord(int x) {
return (_s[x & 255] & 255 |
((_s[(x >> 8) & 255] & 255) << 8) |
((_s[(x >> 16) & 255] & 255) << 16) |
_s[(x >> 24) & 255] << 24);
}
// The S box
final _s = [
99,
124,
119,
123,
242,
107,
111,
197,
48,
1,
103,
43,
254,
215,
171,
118,
202,
130,
201,
125,
250,
89,
71,
240,
173,
212,
162,
175,
156,
164,
114,
192,
183,
253,
147,
38,
54,
63,
247,
204,
52,
165,
229,
241,
113,
216,
49,
21,
4,
199,
35,
195,
24,
150,
5,
154,
7,
18,
128,
226,
235,
39,
178,
117,
9,
131,
44,
26,
27,
110,
90,
160,
82,
59,
214,
179,
41,
227,
47,
132,
83,
209,
0,
237,
32,
252,
177,
91,
106,
203,
190,
57,
74,
76,
88,
207,
208,
239,
170,
251,
67,
77,
51,
133,
69,
249,
2,
127,
80,
60,
159,
168,
81,
163,
64,
143,
146,
157,
56,
245,
188,
182,
218,
33,
16,
255,
243,
210,
205,
12,
19,
236,
95,
151,
68,
23,
196,
167,
126,
61,
100,
93,
25,
115,
96,
129,
79,
220,
34,
42,
144,
136,
70,
238,
184,
20,
222,
94,
11,
219,
224,
50,
58,
10,
73,
6,
36,
92,
194,
211,
172,
98,
145,
149,
228,
121,
231,
200,
55,
109,
141,
213,
78,
169,
108,
86,
244,
234,
101,
122,
174,
8,
186,
120,
37,
46,
28,
166,
180,
198,
232,
221,
116,
31,
75,
189,
139,
138,
112,
62,
181,
102,
72,
3,
246,
14,
97,
53,
87,
185,
134,
193,
29,
158,
225,
248,
152,
17,
105,
217,
142,
148,
155,
30,
135,
233,
206,
85,
40,
223,
140,
161,
137,
13,
191,
230,
66,
104,
65,
153,
45,
15,
176,
84,
187,
22
];
// The inverse S-box
final _si = [
82,
9,
106,
213,
48,
54,
165,
56,
191,
64,
163,
158,
129,
243,
215,
251,
124,
227,
57,
130,
155,
47,
255,
135,
52,
142,
67,
68,
196,
222,
233,
203,
84,
123,
148,
50,
166,
194,
35,
61,
238,
76,
149,
11,
66,
250,
195,
78,
8,
46,
161,
102,
40,
217,
36,
178,
118,
91,
162,
73,
109,
139,
209,
37,
114,
248,
246,
100,
134,
104,
152,
22,
212,
164,
92,
204,
93,
101,
182,
146,
108,
112,
72,
80,
253,
237,
185,
218,
94,
21,
70,
87,
167,
141,
157,
132,
144,
216,
171,
0,
140,
188,
211,
10,
247,
228,
88,
5,
184,
179,
69,
6,
208,
44,
30,
143,
202,
63,
15,
2,
193,
175,
189,
3,
1,
19,
138,
107,
58,
145,
17,
65,
79,
103,
220,
234,
151,
242,
207,
206,
240,
180,
230,
115,
150,
172,
116,
34,
231,
173,
53,
133,
226,
249,
55,
232,
28,
117,
223,
110,
71,
241,
26,
113,
29,
41,
197,
137,
111,
183,
98,
14,
170,
24,
190,
27,
252,
86,
62,
75,
198,
210,
121,
32,
154,
219,
192,
254,
120,
205,
90,
244,
31,
221,
168,
51,
136,
7,
199,
49,
177,
18,
16,
89,
39,
128,
236,
95,
96,
81,
127,
169,
25,
181,
74,
13,
45,
229,
122,
159,
147,
201,
156,
239,
160,
224,
59,
77,
174,
42,
245,
176,
200,
235,
187,
60,
131,
83,
153,
97,
23,
43,
4,
126,
186,
119,
214,
38,
225,
105,
20,
99,
85,
33,
12,
125,
];
// vector used in calculating key schedule (powers of x in GF(256))
final _rcon = [
0x01,
0x02,
0x04,
0x08,
0x10,
0x20,
0x40,
0x80,
0x1b,
0x36,
0x6c,
0xd8,
0xab,
0x4d,
0x9a,
0x2f,
0x5e,
0xbc,
0x63,
0xc6,
0x97,
0x35,
0x6a,
0xd4,
0xb3,
0x7d,
0xfa,
0xef,
0xc5,
0x91
];
// precomputation tables of calculations for rounds
final _t0 = [
0xa56363c6,
0x847c7cf8,
0x997777ee,
0x8d7b7bf6,
0x0df2f2ff,
0xbd6b6bd6,
0xb16f6fde,
0x54c5c591,
0x50303060,
0x03010102,
0xa96767ce,
0x7d2b2b56,
0x19fefee7,
0x62d7d7b5,
0xe6abab4d,
0x9a7676ec,
0x45caca8f,
0x9d82821f,
0x40c9c989,
0x877d7dfa,
0x15fafaef,
0xeb5959b2,
0xc947478e,
0x0bf0f0fb,
0xecadad41,
0x67d4d4b3,
0xfda2a25f,
0xeaafaf45,
0xbf9c9c23,
0xf7a4a453,
0x967272e4,
0x5bc0c09b,
0xc2b7b775,
0x1cfdfde1,
0xae93933d,
0x6a26264c,
0x5a36366c,
0x413f3f7e,
0x02f7f7f5,
0x4fcccc83,
0x5c343468,
0xf4a5a551,
0x34e5e5d1,
0x08f1f1f9,
0x937171e2,
0x73d8d8ab,
0x53313162,
0x3f15152a,
0x0c040408,
0x52c7c795,
0x65232346,
0x5ec3c39d,
0x28181830,
0xa1969637,
0x0f05050a,
0xb59a9a2f,
0x0907070e,
0x36121224,
0x9b80801b,
0x3de2e2df,
0x26ebebcd,
0x6927274e,
0xcdb2b27f,
0x9f7575ea,
0x1b090912,
0x9e83831d,
0x742c2c58,
0x2e1a1a34,
0x2d1b1b36,
0xb26e6edc,
0xee5a5ab4,
0xfba0a05b,
0xf65252a4,
0x4d3b3b76,
0x61d6d6b7,
0xceb3b37d,
0x7b292952,
0x3ee3e3dd,
0x712f2f5e,
0x97848413,
0xf55353a6,
0x68d1d1b9,
0x00000000,
0x2cededc1,
0x60202040,
0x1ffcfce3,
0xc8b1b179,
0xed5b5bb6,
0xbe6a6ad4,
0x46cbcb8d,
0xd9bebe67,
0x4b393972,
0xde4a4a94,
0xd44c4c98,
0xe85858b0,
0x4acfcf85,
0x6bd0d0bb,
0x2aefefc5,
0xe5aaaa4f,
0x16fbfbed,
0xc5434386,
0xd74d4d9a,
0x55333366,
0x94858511,
0xcf45458a,
0x10f9f9e9,
0x06020204,
0x817f7ffe,
0xf05050a0,
0x443c3c78,
0xba9f9f25,
0xe3a8a84b,
0xf35151a2,
0xfea3a35d,
0xc0404080,
0x8a8f8f05,
0xad92923f,
0xbc9d9d21,
0x48383870,
0x04f5f5f1,
0xdfbcbc63,
0xc1b6b677,
0x75dadaaf,
0x63212142,
0x30101020,
0x1affffe5,
0x0ef3f3fd,
0x6dd2d2bf,
0x4ccdcd81,
0x140c0c18,
0x35131326,
0x2fececc3,
0xe15f5fbe,
0xa2979735,
0xcc444488,
0x3917172e,
0x57c4c493,
0xf2a7a755,
0x827e7efc,
0x473d3d7a,
0xac6464c8,
0xe75d5dba,
0x2b191932,
0x957373e6,
0xa06060c0,
0x98818119,
0xd14f4f9e,
0x7fdcdca3,
0x66222244,
0x7e2a2a54,
0xab90903b,
0x8388880b,
0xca46468c,
0x29eeeec7,
0xd3b8b86b,
0x3c141428,
0x79dedea7,
0xe25e5ebc,
0x1d0b0b16,
0x76dbdbad,
0x3be0e0db,
0x56323264,
0x4e3a3a74,
0x1e0a0a14,
0xdb494992,
0x0a06060c,
0x6c242448,
0xe45c5cb8,
0x5dc2c29f,
0x6ed3d3bd,
0xefacac43,
0xa66262c4,
0xa8919139,
0xa4959531,
0x37e4e4d3,
0x8b7979f2,
0x32e7e7d5,
0x43c8c88b,
0x5937376e,
0xb76d6dda,
0x8c8d8d01,
0x64d5d5b1,
0xd24e4e9c,
0xe0a9a949,
0xb46c6cd8,
0xfa5656ac,
0x07f4f4f3,
0x25eaeacf,
0xaf6565ca,
0x8e7a7af4,
0xe9aeae47,
0x18080810,
0xd5baba6f,
0x887878f0,
0x6f25254a,
0x722e2e5c,
0x241c1c38,
0xf1a6a657,
0xc7b4b473,
0x51c6c697,
0x23e8e8cb,
0x7cdddda1,
0x9c7474e8,
0x211f1f3e,
0xdd4b4b96,
0xdcbdbd61,
0x868b8b0d,
0x858a8a0f,
0x907070e0,
0x423e3e7c,
0xc4b5b571,
0xaa6666cc,
0xd8484890,
0x05030306,
0x01f6f6f7,
0x120e0e1c,
0xa36161c2,
0x5f35356a,
0xf95757ae,
0xd0b9b969,
0x91868617,
0x58c1c199,
0x271d1d3a,
0xb99e9e27,
0x38e1e1d9,
0x13f8f8eb,
0xb398982b,
0x33111122,
0xbb6969d2,
0x70d9d9a9,
0x898e8e07,
0xa7949433,
0xb69b9b2d,
0x221e1e3c,
0x92878715,
0x20e9e9c9,
0x49cece87,
0xff5555aa,
0x78282850,
0x7adfdfa5,
0x8f8c8c03,
0xf8a1a159,
0x80898909,
0x170d0d1a,
0xdabfbf65,
0x31e6e6d7,
0xc6424284,
0xb86868d0,
0xc3414182,
0xb0999929,
0x772d2d5a,
0x110f0f1e,
0xcbb0b07b,
0xfc5454a8,
0xd6bbbb6d,
0x3a16162c
];
final _t1 = [
0x6363c6a5,
0x7c7cf884,
0x7777ee99,
0x7b7bf68d,
0xf2f2ff0d,
0x6b6bd6bd,
0x6f6fdeb1,
0xc5c59154,
0x30306050,
0x01010203,
0x6767cea9,
0x2b2b567d,
0xfefee719,
0xd7d7b562,
0xabab4de6,
0x7676ec9a,
0xcaca8f45,
0x82821f9d,
0xc9c98940,
0x7d7dfa87,
0xfafaef15,
0x5959b2eb,
0x47478ec9,
0xf0f0fb0b,
0xadad41ec,
0xd4d4b367,
0xa2a25ffd,
0xafaf45ea,
0x9c9c23bf,
0xa4a453f7,
0x7272e496,
0xc0c09b5b,
0xb7b775c2,
0xfdfde11c,
0x93933dae,
0x26264c6a,
0x36366c5a,
0x3f3f7e41,
0xf7f7f502,
0xcccc834f,
0x3434685c,
0xa5a551f4,
0xe5e5d134,
0xf1f1f908,
0x7171e293,
0xd8d8ab73,
0x31316253,
0x15152a3f,
0x0404080c,
0xc7c79552,
0x23234665,
0xc3c39d5e,
0x18183028,
0x969637a1,
0x05050a0f,
0x9a9a2fb5,
0x07070e09,
0x12122436,
0x80801b9b,
0xe2e2df3d,
0xebebcd26,
0x27274e69,
0xb2b27fcd,
0x7575ea9f,
0x0909121b,
0x83831d9e,
0x2c2c5874,
0x1a1a342e,
0x1b1b362d,
0x6e6edcb2,
0x5a5ab4ee,
0xa0a05bfb,
0x5252a4f6,
0x3b3b764d,
0xd6d6b761,
0xb3b37dce,
0x2929527b,
0xe3e3dd3e,
0x2f2f5e71,
0x84841397,
0x5353a6f5,
0xd1d1b968,
0x00000000,
0xededc12c,
0x20204060,
0xfcfce31f,
0xb1b179c8,
0x5b5bb6ed,
0x6a6ad4be,
0xcbcb8d46,
0xbebe67d9,
0x3939724b,
0x4a4a94de,
0x4c4c98d4,
0x5858b0e8,
0xcfcf854a,
0xd0d0bb6b,
0xefefc52a,
0xaaaa4fe5,
0xfbfbed16,
0x434386c5,
0x4d4d9ad7,
0x33336655,
0x85851194,
0x45458acf,
0xf9f9e910,
0x02020406,
0x7f7ffe81,
0x5050a0f0,
0x3c3c7844,
0x9f9f25ba,
0xa8a84be3,
0x5151a2f3,
0xa3a35dfe,
0x404080c0,
0x8f8f058a,
0x92923fad,
0x9d9d21bc,
0x38387048,
0xf5f5f104,
0xbcbc63df,
0xb6b677c1,
0xdadaaf75,
0x21214263,
0x10102030,
0xffffe51a,
0xf3f3fd0e,
0xd2d2bf6d,
0xcdcd814c,
0x0c0c1814,
0x13132635,
0xececc32f,
0x5f5fbee1,
0x979735a2,
0x444488cc,
0x17172e39,
0xc4c49357,
0xa7a755f2,
0x7e7efc82,
0x3d3d7a47,
0x6464c8ac,
0x5d5dbae7,
0x1919322b,
0x7373e695,
0x6060c0a0,
0x81811998,
0x4f4f9ed1,
0xdcdca37f,
0x22224466,
0x2a2a547e,
0x90903bab,
0x88880b83,
0x46468cca,
0xeeeec729,
0xb8b86bd3,
0x1414283c,
0xdedea779,
0x5e5ebce2,
0x0b0b161d,
0xdbdbad76,
0xe0e0db3b,
0x32326456,
0x3a3a744e,
0x0a0a141e,
0x494992db,
0x06060c0a,
0x2424486c,
0x5c5cb8e4,
0xc2c29f5d,
0xd3d3bd6e,
0xacac43ef,
0x6262c4a6,
0x919139a8,
0x959531a4,
0xe4e4d337,
0x7979f28b,
0xe7e7d532,
0xc8c88b43,
0x37376e59,
0x6d6ddab7,
0x8d8d018c,
0xd5d5b164,
0x4e4e9cd2,
0xa9a949e0,
0x6c6cd8b4,
0x5656acfa,
0xf4f4f307,
0xeaeacf25,
0x6565caaf,
0x7a7af48e,
0xaeae47e9,
0x08081018,
0xbaba6fd5,
0x7878f088,
0x25254a6f,
0x2e2e5c72,
0x1c1c3824,
0xa6a657f1,
0xb4b473c7,
0xc6c69751,
0xe8e8cb23,
0xdddda17c,
0x7474e89c,
0x1f1f3e21,
0x4b4b96dd,
0xbdbd61dc,
0x8b8b0d86,
0x8a8a0f85,
0x7070e090,
0x3e3e7c42,
0xb5b571c4,
0x6666ccaa,
0x484890d8,
0x03030605,
0xf6f6f701,
0x0e0e1c12,
0x6161c2a3,
0x35356a5f,
0x5757aef9,
0xb9b969d0,
0x86861791,
0xc1c19958,
0x1d1d3a27,
0x9e9e27b9,
0xe1e1d938,
0xf8f8eb13,
0x98982bb3,
0x11112233,
0x6969d2bb,
0xd9d9a970,
0x8e8e0789,
0x949433a7,
0x9b9b2db6,
0x1e1e3c22,
0x87871592,
0xe9e9c920,
0xcece8749,
0x5555aaff,
0x28285078,
0xdfdfa57a,
0x8c8c038f,
0xa1a159f8,
0x89890980,
0x0d0d1a17,
0xbfbf65da,
0xe6e6d731,
0x424284c6,
0x6868d0b8,
0x414182c3,
0x999929b0,
0x2d2d5a77,
0x0f0f1e11,
0xb0b07bcb,
0x5454a8fc,
0xbbbb6dd6,
0x16162c3a
];
final _t2 = [
0x63c6a563,
0x7cf8847c,
0x77ee9977,
0x7bf68d7b,
0xf2ff0df2,
0x6bd6bd6b,
0x6fdeb16f,
0xc59154c5,
0x30605030,
0x01020301,
0x67cea967,
0x2b567d2b,
0xfee719fe,
0xd7b562d7,
0xab4de6ab,
0x76ec9a76,
0xca8f45ca,
0x821f9d82,
0xc98940c9,
0x7dfa877d,
0xfaef15fa,
0x59b2eb59,
0x478ec947,
0xf0fb0bf0,
0xad41ecad,
0xd4b367d4,
0xa25ffda2,
0xaf45eaaf,
0x9c23bf9c,
0xa453f7a4,
0x72e49672,
0xc09b5bc0,
0xb775c2b7,
0xfde11cfd,
0x933dae93,
0x264c6a26,
0x366c5a36,
0x3f7e413f,
0xf7f502f7,
0xcc834fcc,
0x34685c34,
0xa551f4a5,
0xe5d134e5,
0xf1f908f1,
0x71e29371,
0xd8ab73d8,
0x31625331,
0x152a3f15,
0x04080c04,
0xc79552c7,
0x23466523,
0xc39d5ec3,
0x18302818,
0x9637a196,
0x050a0f05,
0x9a2fb59a,
0x070e0907,
0x12243612,
0x801b9b80,
0xe2df3de2,
0xebcd26eb,
0x274e6927,
0xb27fcdb2,
0x75ea9f75,
0x09121b09,
0x831d9e83,
0x2c58742c,
0x1a342e1a,
0x1b362d1b,
0x6edcb26e,
0x5ab4ee5a,
0xa05bfba0,
0x52a4f652,
0x3b764d3b,
0xd6b761d6,
0xb37dceb3,
0x29527b29,
0xe3dd3ee3,
0x2f5e712f,
0x84139784,
0x53a6f553,
0xd1b968d1,
0x00000000,
0xedc12ced,
0x20406020,
0xfce31ffc,
0xb179c8b1,
0x5bb6ed5b,
0x6ad4be6a,
0xcb8d46cb,
0xbe67d9be,
0x39724b39,
0x4a94de4a,
0x4c98d44c,
0x58b0e858,
0xcf854acf,
0xd0bb6bd0,
0xefc52aef,
0xaa4fe5aa,
0xfbed16fb,
0x4386c543,
0x4d9ad74d,
0x33665533,
0x85119485,
0x458acf45,
0xf9e910f9,
0x02040602,
0x7ffe817f,
0x50a0f050,
0x3c78443c,
0x9f25ba9f,
0xa84be3a8,
0x51a2f351,
0xa35dfea3,
0x4080c040,
0x8f058a8f,
0x923fad92,
0x9d21bc9d,
0x38704838,
0xf5f104f5,
0xbc63dfbc,
0xb677c1b6,
0xdaaf75da,
0x21426321,
0x10203010,
0xffe51aff,
0xf3fd0ef3,
0xd2bf6dd2,
0xcd814ccd,
0x0c18140c,
0x13263513,
0xecc32fec,
0x5fbee15f,
0x9735a297,
0x4488cc44,
0x172e3917,
0xc49357c4,
0xa755f2a7,
0x7efc827e,
0x3d7a473d,
0x64c8ac64,
0x5dbae75d,
0x19322b19,
0x73e69573,
0x60c0a060,
0x81199881,
0x4f9ed14f,
0xdca37fdc,
0x22446622,
0x2a547e2a,
0x903bab90,
0x880b8388,
0x468cca46,
0xeec729ee,
0xb86bd3b8,
0x14283c14,
0xdea779de,
0x5ebce25e,
0x0b161d0b,
0xdbad76db,
0xe0db3be0,
0x32645632,
0x3a744e3a,
0x0a141e0a,
0x4992db49,
0x060c0a06,
0x24486c24,
0x5cb8e45c,
0xc29f5dc2,
0xd3bd6ed3,
0xac43efac,
0x62c4a662,
0x9139a891,
0x9531a495,
0xe4d337e4,
0x79f28b79,
0xe7d532e7,
0xc88b43c8,
0x376e5937,
0x6ddab76d,
0x8d018c8d,
0xd5b164d5,
0x4e9cd24e,
0xa949e0a9,
0x6cd8b46c,
0x56acfa56,
0xf4f307f4,
0xeacf25ea,
0x65caaf65,
0x7af48e7a,
0xae47e9ae,
0x08101808,
0xba6fd5ba,
0x78f08878,
0x254a6f25,
0x2e5c722e,
0x1c38241c,
0xa657f1a6,
0xb473c7b4,
0xc69751c6,
0xe8cb23e8,
0xdda17cdd,
0x74e89c74,
0x1f3e211f,
0x4b96dd4b,
0xbd61dcbd,
0x8b0d868b,
0x8a0f858a,
0x70e09070,
0x3e7c423e,
0xb571c4b5,
0x66ccaa66,
0x4890d848,
0x03060503,
0xf6f701f6,
0x0e1c120e,
0x61c2a361,
0x356a5f35,
0x57aef957,
0xb969d0b9,
0x86179186,
0xc19958c1,
0x1d3a271d,
0x9e27b99e,
0xe1d938e1,
0xf8eb13f8,
0x982bb398,
0x11223311,
0x69d2bb69,
0xd9a970d9,
0x8e07898e,
0x9433a794,
0x9b2db69b,
0x1e3c221e,
0x87159287,
0xe9c920e9,
0xce8749ce,
0x55aaff55,
0x28507828,
0xdfa57adf,
0x8c038f8c,
0xa159f8a1,
0x89098089,
0x0d1a170d,
0xbf65dabf,
0xe6d731e6,
0x4284c642,
0x68d0b868,
0x4182c341,
0x9929b099,
0x2d5a772d,
0x0f1e110f,
0xb07bcbb0,
0x54a8fc54,
0xbb6dd6bb,
0x162c3a16
];
final _t3 = [
0xc6a56363,
0xf8847c7c,
0xee997777,
0xf68d7b7b,
0xff0df2f2,
0xd6bd6b6b,
0xdeb16f6f,
0x9154c5c5,
0x60503030,
0x02030101,
0xcea96767,
0x567d2b2b,
0xe719fefe,
0xb562d7d7,
0x4de6abab,
0xec9a7676,
0x8f45caca,
0x1f9d8282,
0x8940c9c9,
0xfa877d7d,
0xef15fafa,
0xb2eb5959,
0x8ec94747,
0xfb0bf0f0,
0x41ecadad,
0xb367d4d4,
0x5ffda2a2,
0x45eaafaf,
0x23bf9c9c,
0x53f7a4a4,
0xe4967272,
0x9b5bc0c0,
0x75c2b7b7,
0xe11cfdfd,
0x3dae9393,
0x4c6a2626,
0x6c5a3636,
0x7e413f3f,
0xf502f7f7,
0x834fcccc,
0x685c3434,
0x51f4a5a5,
0xd134e5e5,
0xf908f1f1,
0xe2937171,
0xab73d8d8,
0x62533131,
0x2a3f1515,
0x080c0404,
0x9552c7c7,
0x46652323,
0x9d5ec3c3,
0x30281818,
0x37a19696,
0x0a0f0505,
0x2fb59a9a,
0x0e090707,
0x24361212,
0x1b9b8080,
0xdf3de2e2,
0xcd26ebeb,
0x4e692727,
0x7fcdb2b2,
0xea9f7575,
0x121b0909,
0x1d9e8383,
0x58742c2c,
0x342e1a1a,
0x362d1b1b,
0xdcb26e6e,
0xb4ee5a5a,
0x5bfba0a0,
0xa4f65252,
0x764d3b3b,
0xb761d6d6,
0x7dceb3b3,
0x527b2929,
0xdd3ee3e3,
0x5e712f2f,
0x13978484,
0xa6f55353,
0xb968d1d1,
0x00000000,
0xc12ceded,
0x40602020,
0xe31ffcfc,
0x79c8b1b1,
0xb6ed5b5b,
0xd4be6a6a,
0x8d46cbcb,
0x67d9bebe,
0x724b3939,
0x94de4a4a,
0x98d44c4c,
0xb0e85858,
0x854acfcf,
0xbb6bd0d0,
0xc52aefef,
0x4fe5aaaa,
0xed16fbfb,
0x86c54343,
0x9ad74d4d,
0x66553333,
0x11948585,
0x8acf4545,
0xe910f9f9,
0x04060202,
0xfe817f7f,
0xa0f05050,
0x78443c3c,
0x25ba9f9f,
0x4be3a8a8,
0xa2f35151,
0x5dfea3a3,
0x80c04040,
0x058a8f8f,
0x3fad9292,
0x21bc9d9d,
0x70483838,
0xf104f5f5,
0x63dfbcbc,
0x77c1b6b6,
0xaf75dada,
0x42632121,
0x20301010,
0xe51affff,
0xfd0ef3f3,
0xbf6dd2d2,
0x814ccdcd,
0x18140c0c,
0x26351313,
0xc32fecec,
0xbee15f5f,
0x35a29797,
0x88cc4444,
0x2e391717,
0x9357c4c4,
0x55f2a7a7,
0xfc827e7e,
0x7a473d3d,
0xc8ac6464,
0xbae75d5d,
0x322b1919,
0xe6957373,
0xc0a06060,
0x19988181,
0x9ed14f4f,
0xa37fdcdc,
0x44662222,
0x547e2a2a,
0x3bab9090,
0x0b838888,
0x8cca4646,
0xc729eeee,
0x6bd3b8b8,
0x283c1414,
0xa779dede,
0xbce25e5e,
0x161d0b0b,
0xad76dbdb,
0xdb3be0e0,
0x64563232,
0x744e3a3a,
0x141e0a0a,
0x92db4949,
0x0c0a0606,
0x486c2424,
0xb8e45c5c,
0x9f5dc2c2,
0xbd6ed3d3,
0x43efacac,
0xc4a66262,
0x39a89191,
0x31a49595,
0xd337e4e4,
0xf28b7979,
0xd532e7e7,
0x8b43c8c8,
0x6e593737,
0xdab76d6d,
0x018c8d8d,
0xb164d5d5,
0x9cd24e4e,
0x49e0a9a9,
0xd8b46c6c,
0xacfa5656,
0xf307f4f4,
0xcf25eaea,
0xcaaf6565,
0xf48e7a7a,
0x47e9aeae,
0x10180808,
0x6fd5baba,
0xf0887878,
0x4a6f2525,
0x5c722e2e,
0x38241c1c,
0x57f1a6a6,
0x73c7b4b4,
0x9751c6c6,
0xcb23e8e8,
0xa17cdddd,
0xe89c7474,
0x3e211f1f,
0x96dd4b4b,
0x61dcbdbd,
0x0d868b8b,
0x0f858a8a,
0xe0907070,
0x7c423e3e,
0x71c4b5b5,
0xccaa6666,
0x90d84848,
0x06050303,
0xf701f6f6,
0x1c120e0e,
0xc2a36161,
0x6a5f3535,
0xaef95757,
0x69d0b9b9,
0x17918686,
0x9958c1c1,
0x3a271d1d,
0x27b99e9e,
0xd938e1e1,
0xeb13f8f8,
0x2bb39898,
0x22331111,
0xd2bb6969,
0xa970d9d9,
0x07898e8e,
0x33a79494,
0x2db69b9b,
0x3c221e1e,
0x15928787,
0xc920e9e9,
0x8749cece,
0xaaff5555,
0x50782828,
0xa57adfdf,
0x038f8c8c,
0x59f8a1a1,
0x09808989,
0x1a170d0d,
0x65dabfbf,
0xd731e6e6,
0x84c64242,
0xd0b86868,
0x82c34141,
0x29b09999,
0x5a772d2d,
0x1e110f0f,
0x7bcbb0b0,
0xa8fc5454,
0x6dd6bbbb,
0x2c3a1616
];
final _tinv0 = [
0x50a7f451,
0x5365417e,
0xc3a4171a,
0x965e273a,
0xcb6bab3b,
0xf1459d1f,
0xab58faac,
0x9303e34b,
0x55fa3020,
0xf66d76ad,
0x9176cc88,
0x254c02f5,
0xfcd7e54f,
0xd7cb2ac5,
0x80443526,
0x8fa362b5,
0x495ab1de,
0x671bba25,
0x980eea45,
0xe1c0fe5d,
0x02752fc3,
0x12f04c81,
0xa397468d,
0xc6f9d36b,
0xe75f8f03,
0x959c9215,
0xeb7a6dbf,
0xda595295,
0x2d83bed4,
0xd3217458,
0x2969e049,
0x44c8c98e,
0x6a89c275,
0x78798ef4,
0x6b3e5899,
0xdd71b927,
0xb64fe1be,
0x17ad88f0,
0x66ac20c9,
0xb43ace7d,
0x184adf63,
0x82311ae5,
0x60335197,
0x457f5362,
0xe07764b1,
0x84ae6bbb,
0x1ca081fe,
0x942b08f9,
0x58684870,
0x19fd458f,
0x876cde94,
0xb7f87b52,
0x23d373ab,
0xe2024b72,
0x578f1fe3,
0x2aab5566,
0x0728ebb2,
0x03c2b52f,
0x9a7bc586,
0xa50837d3,
0xf2872830,
0xb2a5bf23,
0xba6a0302,
0x5c8216ed,
0x2b1ccf8a,
0x92b479a7,
0xf0f207f3,
0xa1e2694e,
0xcdf4da65,
0xd5be0506,
0x1f6234d1,
0x8afea6c4,
0x9d532e34,
0xa055f3a2,
0x32e18a05,
0x75ebf6a4,
0x39ec830b,
0xaaef6040,
0x069f715e,
0x51106ebd,
0xf98a213e,
0x3d06dd96,
0xae053edd,
0x46bde64d,
0xb58d5491,
0x055dc471,
0x6fd40604,
0xff155060,
0x24fb9819,
0x97e9bdd6,
0xcc434089,
0x779ed967,
0xbd42e8b0,
0x888b8907,
0x385b19e7,
0xdbeec879,
0x470a7ca1,
0xe90f427c,
0xc91e84f8,
0x00000000,
0x83868009,
0x48ed2b32,
0xac70111e,
0x4e725a6c,
0xfbff0efd,
0x5638850f,
0x1ed5ae3d,
0x27392d36,
0x64d90f0a,
0x21a65c68,
0xd1545b9b,
0x3a2e3624,
0xb1670a0c,
0x0fe75793,
0xd296eeb4,
0x9e919b1b,
0x4fc5c080,
0xa220dc61,
0x694b775a,
0x161a121c,
0x0aba93e2,
0xe52aa0c0,
0x43e0223c,
0x1d171b12,
0x0b0d090e,
0xadc78bf2,
0xb9a8b62d,
0xc8a91e14,
0x8519f157,
0x4c0775af,
0xbbdd99ee,
0xfd607fa3,
0x9f2601f7,
0xbcf5725c,
0xc53b6644,
0x347efb5b,
0x7629438b,
0xdcc623cb,
0x68fcedb6,
0x63f1e4b8,
0xcadc31d7,
0x10856342,
0x40229713,
0x2011c684,
0x7d244a85,
0xf83dbbd2,
0x1132f9ae,
0x6da129c7,
0x4b2f9e1d,
0xf330b2dc,
0xec52860d,
0xd0e3c177,
0x6c16b32b,
0x99b970a9,
0xfa489411,
0x2264e947,
0xc48cfca8,
0x1a3ff0a0,
0xd82c7d56,
0xef903322,
0xc74e4987,
0xc1d138d9,
0xfea2ca8c,
0x360bd498,
0xcf81f5a6,
0x28de7aa5,
0x268eb7da,
0xa4bfad3f,
0xe49d3a2c,
0x0d927850,
0x9bcc5f6a,
0x62467e54,
0xc2138df6,
0xe8b8d890,
0x5ef7392e,
0xf5afc382,
0xbe805d9f,
0x7c93d069,
0xa92dd56f,
0xb31225cf,
0x3b99acc8,
0xa77d1810,
0x6e639ce8,
0x7bbb3bdb,
0x097826cd,
0xf418596e,
0x01b79aec,
0xa89a4f83,
0x656e95e6,
0x7ee6ffaa,
0x08cfbc21,
0xe6e815ef,
0xd99be7ba,
0xce366f4a,
0xd4099fea,
0xd67cb029,
0xafb2a431,
0x31233f2a,
0x3094a5c6,
0xc066a235,
0x37bc4e74,
0xa6ca82fc,
0xb0d090e0,
0x15d8a733,
0x4a9804f1,
0xf7daec41,
0x0e50cd7f,
0x2ff69117,
0x8dd64d76,
0x4db0ef43,
0x544daacc,
0xdf0496e4,
0xe3b5d19e,
0x1b886a4c,
0xb81f2cc1,
0x7f516546,
0x04ea5e9d,
0x5d358c01,
0x737487fa,
0x2e410bfb,
0x5a1d67b3,
0x52d2db92,
0x335610e9,
0x1347d66d,
0x8c61d79a,
0x7a0ca137,
0x8e14f859,
0x893c13eb,
0xee27a9ce,
0x35c961b7,
0xede51ce1,
0x3cb1477a,
0x59dfd29c,
0x3f73f255,
0x79ce1418,
0xbf37c773,
0xeacdf753,
0x5baafd5f,
0x146f3ddf,
0x86db4478,
0x81f3afca,
0x3ec468b9,
0x2c342438,
0x5f40a3c2,
0x72c31d16,
0x0c25e2bc,
0x8b493c28,
0x41950dff,
0x7101a839,
0xdeb30c08,
0x9ce4b4d8,
0x90c15664,
0x6184cb7b,
0x70b632d5,
0x745c6c48,
0x4257b8d0
];
final _tinv1 = [
0xa7f45150,
0x65417e53,
0xa4171ac3,
0x5e273a96,
0x6bab3bcb,
0x459d1ff1,
0x58faacab,
0x03e34b93,
0xfa302055,
0x6d76adf6,
0x76cc8891,
0x4c02f525,
0xd7e54ffc,
0xcb2ac5d7,
0x44352680,
0xa362b58f,
0x5ab1de49,
0x1bba2567,
0x0eea4598,
0xc0fe5de1,
0x752fc302,
0xf04c8112,
0x97468da3,
0xf9d36bc6,
0x5f8f03e7,
0x9c921595,
0x7a6dbfeb,
0x595295da,
0x83bed42d,
0x217458d3,
0x69e04929,
0xc8c98e44,
0x89c2756a,
0x798ef478,
0x3e58996b,
0x71b927dd,
0x4fe1beb6,
0xad88f017,
0xac20c966,
0x3ace7db4,
0x4adf6318,
0x311ae582,
0x33519760,
0x7f536245,
0x7764b1e0,
0xae6bbb84,
0xa081fe1c,
0x2b08f994,
0x68487058,
0xfd458f19,
0x6cde9487,
0xf87b52b7,
0xd373ab23,
0x024b72e2,
0x8f1fe357,
0xab55662a,
0x28ebb207,
0xc2b52f03,
0x7bc5869a,
0x0837d3a5,
0x872830f2,
0xa5bf23b2,
0x6a0302ba,
0x8216ed5c,
0x1ccf8a2b,
0xb479a792,
0xf207f3f0,
0xe2694ea1,
0xf4da65cd,
0xbe0506d5,
0x6234d11f,
0xfea6c48a,
0x532e349d,
0x55f3a2a0,
0xe18a0532,
0xebf6a475,
0xec830b39,
0xef6040aa,
0x9f715e06,
0x106ebd51,
0x8a213ef9,
0x06dd963d,
0x053eddae,
0xbde64d46,
0x8d5491b5,
0x5dc47105,
0xd406046f,
0x155060ff,
0xfb981924,
0xe9bdd697,
0x434089cc,
0x9ed96777,
0x42e8b0bd,
0x8b890788,
0x5b19e738,
0xeec879db,
0x0a7ca147,
0x0f427ce9,
0x1e84f8c9,
0x00000000,
0x86800983,
0xed2b3248,
0x70111eac,
0x725a6c4e,
0xff0efdfb,
0x38850f56,
0xd5ae3d1e,
0x392d3627,
0xd90f0a64,
0xa65c6821,
0x545b9bd1,
0x2e36243a,
0x670a0cb1,
0xe757930f,
0x96eeb4d2,
0x919b1b9e,
0xc5c0804f,
0x20dc61a2,
0x4b775a69,
0x1a121c16,
0xba93e20a,
0x2aa0c0e5,
0xe0223c43,
0x171b121d,
0x0d090e0b,
0xc78bf2ad,
0xa8b62db9,
0xa91e14c8,
0x19f15785,
0x0775af4c,
0xdd99eebb,
0x607fa3fd,
0x2601f79f,
0xf5725cbc,
0x3b6644c5,
0x7efb5b34,
0x29438b76,
0xc623cbdc,
0xfcedb668,
0xf1e4b863,
0xdc31d7ca,
0x85634210,
0x22971340,
0x11c68420,
0x244a857d,
0x3dbbd2f8,
0x32f9ae11,
0xa129c76d,
0x2f9e1d4b,
0x30b2dcf3,
0x52860dec,
0xe3c177d0,
0x16b32b6c,
0xb970a999,
0x489411fa,
0x64e94722,
0x8cfca8c4,
0x3ff0a01a,
0x2c7d56d8,
0x903322ef,
0x4e4987c7,
0xd138d9c1,
0xa2ca8cfe,
0x0bd49836,
0x81f5a6cf,
0xde7aa528,
0x8eb7da26,
0xbfad3fa4,
0x9d3a2ce4,
0x9278500d,
0xcc5f6a9b,
0x467e5462,
0x138df6c2,
0xb8d890e8,
0xf7392e5e,
0xafc382f5,
0x805d9fbe,
0x93d0697c,
0x2dd56fa9,
0x1225cfb3,
0x99acc83b,
0x7d1810a7,
0x639ce86e,
0xbb3bdb7b,
0x7826cd09,
0x18596ef4,
0xb79aec01,
0x9a4f83a8,
0x6e95e665,
0xe6ffaa7e,
0xcfbc2108,
0xe815efe6,
0x9be7bad9,
0x366f4ace,
0x099fead4,
0x7cb029d6,
0xb2a431af,
0x233f2a31,
0x94a5c630,
0x66a235c0,
0xbc4e7437,
0xca82fca6,
0xd090e0b0,
0xd8a73315,
0x9804f14a,
0xdaec41f7,
0x50cd7f0e,
0xf691172f,
0xd64d768d,
0xb0ef434d,
0x4daacc54,
0x0496e4df,
0xb5d19ee3,
0x886a4c1b,
0x1f2cc1b8,
0x5165467f,
0xea5e9d04,
0x358c015d,
0x7487fa73,
0x410bfb2e,
0x1d67b35a,
0xd2db9252,
0x5610e933,
0x47d66d13,
0x61d79a8c,
0x0ca1377a,
0x14f8598e,
0x3c13eb89,
0x27a9ceee,
0xc961b735,
0xe51ce1ed,
0xb1477a3c,
0xdfd29c59,
0x73f2553f,
0xce141879,
0x37c773bf,
0xcdf753ea,
0xaafd5f5b,
0x6f3ddf14,
0xdb447886,
0xf3afca81,
0xc468b93e,
0x3424382c,
0x40a3c25f,
0xc31d1672,
0x25e2bc0c,
0x493c288b,
0x950dff41,
0x01a83971,
0xb30c08de,
0xe4b4d89c,
0xc1566490,
0x84cb7b61,
0xb632d570,
0x5c6c4874,
0x57b8d042
];
final _tinv2 = [
0xf45150a7,
0x417e5365,
0x171ac3a4,
0x273a965e,
0xab3bcb6b,
0x9d1ff145,
0xfaacab58,
0xe34b9303,
0x302055fa,
0x76adf66d,
0xcc889176,
0x02f5254c,
0xe54ffcd7,
0x2ac5d7cb,
0x35268044,
0x62b58fa3,
0xb1de495a,
0xba25671b,
0xea45980e,
0xfe5de1c0,
0x2fc30275,
0x4c8112f0,
0x468da397,
0xd36bc6f9,
0x8f03e75f,
0x9215959c,
0x6dbfeb7a,
0x5295da59,
0xbed42d83,
0x7458d321,
0xe0492969,
0xc98e44c8,
0xc2756a89,
0x8ef47879,
0x58996b3e,
0xb927dd71,
0xe1beb64f,
0x88f017ad,
0x20c966ac,
0xce7db43a,
0xdf63184a,
0x1ae58231,
0x51976033,
0x5362457f,
0x64b1e077,
0x6bbb84ae,
0x81fe1ca0,
0x08f9942b,
0x48705868,
0x458f19fd,
0xde94876c,
0x7b52b7f8,
0x73ab23d3,
0x4b72e202,
0x1fe3578f,
0x55662aab,
0xebb20728,
0xb52f03c2,
0xc5869a7b,
0x37d3a508,
0x2830f287,
0xbf23b2a5,
0x0302ba6a,
0x16ed5c82,
0xcf8a2b1c,
0x79a792b4,
0x07f3f0f2,
0x694ea1e2,
0xda65cdf4,
0x0506d5be,
0x34d11f62,
0xa6c48afe,
0x2e349d53,
0xf3a2a055,
0x8a0532e1,
0xf6a475eb,
0x830b39ec,
0x6040aaef,
0x715e069f,
0x6ebd5110,
0x213ef98a,
0xdd963d06,
0x3eddae05,
0xe64d46bd,
0x5491b58d,
0xc471055d,
0x06046fd4,
0x5060ff15,
0x981924fb,
0xbdd697e9,
0x4089cc43,
0xd967779e,
0xe8b0bd42,
0x8907888b,
0x19e7385b,
0xc879dbee,
0x7ca1470a,
0x427ce90f,
0x84f8c91e,
0x00000000,
0x80098386,
0x2b3248ed,
0x111eac70,
0x5a6c4e72,
0x0efdfbff,
0x850f5638,
0xae3d1ed5,
0x2d362739,
0x0f0a64d9,
0x5c6821a6,
0x5b9bd154,
0x36243a2e,
0x0a0cb167,
0x57930fe7,
0xeeb4d296,
0x9b1b9e91,
0xc0804fc5,
0xdc61a220,
0x775a694b,
0x121c161a,
0x93e20aba,
0xa0c0e52a,
0x223c43e0,
0x1b121d17,
0x090e0b0d,
0x8bf2adc7,
0xb62db9a8,
0x1e14c8a9,
0xf1578519,
0x75af4c07,
0x99eebbdd,
0x7fa3fd60,
0x01f79f26,
0x725cbcf5,
0x6644c53b,
0xfb5b347e,
0x438b7629,
0x23cbdcc6,
0xedb668fc,
0xe4b863f1,
0x31d7cadc,
0x63421085,
0x97134022,
0xc6842011,
0x4a857d24,
0xbbd2f83d,
0xf9ae1132,
0x29c76da1,
0x9e1d4b2f,
0xb2dcf330,
0x860dec52,
0xc177d0e3,
0xb32b6c16,
0x70a999b9,
0x9411fa48,
0xe9472264,
0xfca8c48c,
0xf0a01a3f,
0x7d56d82c,
0x3322ef90,
0x4987c74e,
0x38d9c1d1,
0xca8cfea2,
0xd498360b,
0xf5a6cf81,
0x7aa528de,
0xb7da268e,
0xad3fa4bf,
0x3a2ce49d,
0x78500d92,
0x5f6a9bcc,
0x7e546246,
0x8df6c213,
0xd890e8b8,
0x392e5ef7,
0xc382f5af,
0x5d9fbe80,
0xd0697c93,
0xd56fa92d,
0x25cfb312,
0xacc83b99,
0x1810a77d,
0x9ce86e63,
0x3bdb7bbb,
0x26cd0978,
0x596ef418,
0x9aec01b7,
0x4f83a89a,
0x95e6656e,
0xffaa7ee6,
0xbc2108cf,
0x15efe6e8,
0xe7bad99b,
0x6f4ace36,
0x9fead409,
0xb029d67c,
0xa431afb2,
0x3f2a3123,
0xa5c63094,
0xa235c066,
0x4e7437bc,
0x82fca6ca,
0x90e0b0d0,
0xa73315d8,
0x04f14a98,
0xec41f7da,
0xcd7f0e50,
0x91172ff6,
0x4d768dd6,
0xef434db0,
0xaacc544d,
0x96e4df04,
0xd19ee3b5,
0x6a4c1b88,
0x2cc1b81f,
0x65467f51,
0x5e9d04ea,
0x8c015d35,
0x87fa7374,
0x0bfb2e41,
0x67b35a1d,
0xdb9252d2,
0x10e93356,
0xd66d1347,
0xd79a8c61,
0xa1377a0c,
0xf8598e14,
0x13eb893c,
0xa9ceee27,
0x61b735c9,
0x1ce1ede5,
0x477a3cb1,
0xd29c59df,
0xf2553f73,
0x141879ce,
0xc773bf37,
0xf753eacd,
0xfd5f5baa,
0x3ddf146f,
0x447886db,
0xafca81f3,
0x68b93ec4,
0x24382c34,
0xa3c25f40,
0x1d1672c3,
0xe2bc0c25,
0x3c288b49,
0x0dff4195,
0xa8397101,
0x0c08deb3,
0xb4d89ce4,
0x566490c1,
0xcb7b6184,
0x32d570b6,
0x6c48745c,
0xb8d04257
];
final _tinv3 = [
0x5150a7f4,
0x7e536541,
0x1ac3a417,
0x3a965e27,
0x3bcb6bab,
0x1ff1459d,
0xacab58fa,
0x4b9303e3,
0x2055fa30,
0xadf66d76,
0x889176cc,
0xf5254c02,
0x4ffcd7e5,
0xc5d7cb2a,
0x26804435,
0xb58fa362,
0xde495ab1,
0x25671bba,
0x45980eea,
0x5de1c0fe,
0xc302752f,
0x8112f04c,
0x8da39746,
0x6bc6f9d3,
0x03e75f8f,
0x15959c92,
0xbfeb7a6d,
0x95da5952,
0xd42d83be,
0x58d32174,
0x492969e0,
0x8e44c8c9,
0x756a89c2,
0xf478798e,
0x996b3e58,
0x27dd71b9,
0xbeb64fe1,
0xf017ad88,
0xc966ac20,
0x7db43ace,
0x63184adf,
0xe582311a,
0x97603351,
0x62457f53,
0xb1e07764,
0xbb84ae6b,
0xfe1ca081,
0xf9942b08,
0x70586848,
0x8f19fd45,
0x94876cde,
0x52b7f87b,
0xab23d373,
0x72e2024b,
0xe3578f1f,
0x662aab55,
0xb20728eb,
0x2f03c2b5,
0x869a7bc5,
0xd3a50837,
0x30f28728,
0x23b2a5bf,
0x02ba6a03,
0xed5c8216,
0x8a2b1ccf,
0xa792b479,
0xf3f0f207,
0x4ea1e269,
0x65cdf4da,
0x06d5be05,
0xd11f6234,
0xc48afea6,
0x349d532e,
0xa2a055f3,
0x0532e18a,
0xa475ebf6,
0x0b39ec83,
0x40aaef60,
0x5e069f71,
0xbd51106e,
0x3ef98a21,
0x963d06dd,
0xddae053e,
0x4d46bde6,
0x91b58d54,
0x71055dc4,
0x046fd406,
0x60ff1550,
0x1924fb98,
0xd697e9bd,
0x89cc4340,
0x67779ed9,
0xb0bd42e8,
0x07888b89,
0xe7385b19,
0x79dbeec8,
0xa1470a7c,
0x7ce90f42,
0xf8c91e84,
0x00000000,
0x09838680,
0x3248ed2b,
0x1eac7011,
0x6c4e725a,
0xfdfbff0e,
0x0f563885,
0x3d1ed5ae,
0x3627392d,
0x0a64d90f,
0x6821a65c,
0x9bd1545b,
0x243a2e36,
0x0cb1670a,
0x930fe757,
0xb4d296ee,
0x1b9e919b,
0x804fc5c0,
0x61a220dc,
0x5a694b77,
0x1c161a12,
0xe20aba93,
0xc0e52aa0,
0x3c43e022,
0x121d171b,
0x0e0b0d09,
0xf2adc78b,
0x2db9a8b6,
0x14c8a91e,
0x578519f1,
0xaf4c0775,
0xeebbdd99,
0xa3fd607f,
0xf79f2601,
0x5cbcf572,
0x44c53b66,
0x5b347efb,
0x8b762943,
0xcbdcc623,
0xb668fced,
0xb863f1e4,
0xd7cadc31,
0x42108563,
0x13402297,
0x842011c6,
0x857d244a,
0xd2f83dbb,
0xae1132f9,
0xc76da129,
0x1d4b2f9e,
0xdcf330b2,
0x0dec5286,
0x77d0e3c1,
0x2b6c16b3,
0xa999b970,
0x11fa4894,
0x472264e9,
0xa8c48cfc,
0xa01a3ff0,
0x56d82c7d,
0x22ef9033,
0x87c74e49,
0xd9c1d138,
0x8cfea2ca,
0x98360bd4,
0xa6cf81f5,
0xa528de7a,
0xda268eb7,
0x3fa4bfad,
0x2ce49d3a,
0x500d9278,
0x6a9bcc5f,
0x5462467e,
0xf6c2138d,
0x90e8b8d8,
0x2e5ef739,
0x82f5afc3,
0x9fbe805d,
0x697c93d0,
0x6fa92dd5,
0xcfb31225,
0xc83b99ac,
0x10a77d18,
0xe86e639c,
0xdb7bbb3b,
0xcd097826,
0x6ef41859,
0xec01b79a,
0x83a89a4f,
0xe6656e95,
0xaa7ee6ff,
0x2108cfbc,
0xefe6e815,
0xbad99be7,
0x4ace366f,
0xead4099f,
0x29d67cb0,
0x31afb2a4,
0x2a31233f,
0xc63094a5,
0x35c066a2,
0x7437bc4e,
0xfca6ca82,
0xe0b0d090,
0x3315d8a7,
0xf14a9804,
0x41f7daec,
0x7f0e50cd,
0x172ff691,
0x768dd64d,
0x434db0ef,
0xcc544daa,
0xe4df0496,
0x9ee3b5d1,
0x4c1b886a,
0xc1b81f2c,
0x467f5165,
0x9d04ea5e,
0x015d358c,
0xfa737487,
0xfb2e410b,
0xb35a1d67,
0x9252d2db,
0xe9335610,
0x6d1347d6,
0x9a8c61d7,
0x377a0ca1,
0x598e14f8,
0xeb893c13,
0xceee27a9,
0xb735c961,
0xe1ede51c,
0x7a3cb147,
0x9c59dfd2,
0x553f73f2,
0x1879ce14,
0x73bf37c7,
0x53eacdf7,
0x5f5baafd,
0xdf146f3d,
0x7886db44,
0xca81f3af,
0xb93ec468,
0x382c3424,
0xc25f40a3,
0x1672c31d,
0xbc0c25e2,
0x288b493c,
0xff41950d,
0x397101a8,
0x08deb30c,
0xd89ce4b4,
0x6490c156,
0x7b6184cb,
0xd570b632,
0x48745c6c,
0xd04257b8
];