Statistics
| Branch: | Revision:

ffmpeg / libavcodec / ra144.c @ 2912e87a

History | View | Annotate | Download (73 KB)

1
/*
2
 * Real Audio 1.0 (14.4K)
3
 * Copyright (c) 2003 the ffmpeg project
4
 *
5
 * This file is part of Libav.
6
 *
7
 * Libav is free software; you can redistribute it and/or
8
 * modify it under the terms of the GNU Lesser General Public
9
 * License as published by the Free Software Foundation; either
10
 * version 2.1 of the License, or (at your option) any later version.
11
 *
12
 * Libav is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
 * Lesser General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with Libav; if not, write to the Free Software
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
 */
21

    
22
#include <stdint.h>
23
#include "avcodec.h"
24
#include "celp_filters.h"
25
#include "ra144.h"
26

    
27
const int16_t ff_gain_val_tab[256][3] = {
28
    { 541, 956,  768}, { 877, 581,  568}, { 675,1574,  635}, {1248,1464,  668},
29
    {1246, 839, 1394}, {2560,1386,  991}, { 925, 687,  608}, {2208, 797, 1144},
30
    { 535, 832,  799}, { 762, 605, 1154}, { 832,1122, 1003}, {1180, 687, 1176},
31
    {1292, 901,  732}, {1656, 689,  896}, {1750,1248,  848}, {2284, 942, 1022},
32
    { 824,1472,  643}, { 517, 765,  512}, { 562,1816, 1522}, { 694,1826, 2700},
33
    { 704, 524,  672}, {1442, 757, 2232}, { 884, 551, 1266}, {2232,1007, 1692},
34
    { 932, 746,  777}, {1132, 822,  926}, {1226, 771,  611}, {2948,1342, 1008},
35
    {1302, 594, 1158}, {1602, 636, 1128}, {3408, 910, 1438}, {1996, 614,  575},
36
    { 665, 935,  628}, { 631,1192,  829}, { 644, 926, 1052}, { 879, 988, 1226},
37
    { 941,2768, 2772}, { 565,1344, 2304}, { 547, 628,  740}, { 639, 532, 1074},
38
    { 955,1208,  598}, {1124,1160,  900}, {1206, 899, 1242}, { 746, 533,  624},
39
    {1458,1028,  735}, {1706,1102,  692}, {1898,1018, 1004}, {2176, 988,  735},
40
    {1578, 782, 1642}, { 897, 516,  754}, {2068, 702, 1656}, {2344, 818, 1526},
41
    { 907, 652,  592}, {1056, 652,  642}, {2124,1416,  780}, {2664,1250,  727},
42
    {1894, 727, 1108}, {2196, 657,  981}, {4840, 920, 1704}, {4992,1238,  983},
43
    {2420, 909, 1094}, {2760, 935, 1032}, {2800, 612,  853}, {3068, 832,  574},
44
    { 523,1796,  923}, { 722,1916, 1382}, {1226,1542,  928}, { 758, 757,  584},
45
    { 512,1134,  577}, { 615,1276,  698}, { 574,2568, 2356}, { 993,2728, 3512},
46
    { 539, 890,  913}, { 694, 928, 1088}, { 805, 600, 1360}, {2160, 951, 3128},
47
    { 816, 950,  590}, { 955, 847,  811}, {1094, 883,  556}, {1304, 888,  604},
48
    { 863,1170,  855}, {1023, 997, 1032}, { 932,1228, 1280}, { 627, 564,  573},
49
    { 876, 900, 1448}, {1030, 857, 1792}, {1294, 953, 1758}, {1612, 854, 1714},
50
    {1090,1166,  631}, {1314,1202,  751}, {1480, 905,  795}, {1682,1016,  568},
51
    {1494,1178,  983}, { 878, 613,  526}, {1728,1446,  779}, {2136,1348,  774},
52
    { 950, 649,  939}, {1180, 703,  899}, {1236, 527, 1158}, {1450, 647,  972},
53
    {1282, 647,  707}, {1460, 663,  644}, {1614, 572,  578}, {3516,1222,  821},
54
    {2668, 729, 1682}, {3128, 585, 1502}, {3208, 733,  976}, {6800, 871, 1416},
55
    {3480, 743, 1408}, {3764, 899, 1170}, {3772, 632,  875}, {4092, 732,  638},
56
    {3112, 753, 2620}, {3372, 945, 1890}, {3768, 969, 2288}, {2016, 559,  854},
57
    {1736, 729,  787}, {1940, 686,  547}, {2140, 635,  674}, {4480,1272,  828},
58
    {3976, 592, 1666}, {4384, 621, 1388}, {4400, 801,  955}, {4656, 522,  646},
59
    {4848, 625, 1636}, {4984, 591,  874}, {5352, 535, 1001}, {11216,938, 1184},
60
    { 925,3280, 1476}, { 735,1580, 1088}, {1150,1576,  674}, { 655, 783,  528},
61
    { 527,2052, 1354}, { 782,1704, 1880}, { 578, 910, 1026}, { 692, 882, 1468},
62
    { 586, 683,  715}, { 739, 609,  717}, { 778, 773,  697}, { 922, 785,  813},
63
    { 766, 651,  984}, { 978, 596, 1030}, {1070, 757, 1080}, {1324, 687, 1178},
64
    {1108,2144,  979}, { 723, 982,  690}, { 936, 956,  527}, {1180,1002,  547},
65
    { 517,1306,  825}, { 832,1184,  974}, {1024, 957,  903}, {1262,1090,  906},
66
    {1028, 720,  649}, {1192, 679,  694}, {2468,1480,  979}, {2844,1370,  877},
67
    {1310, 835,  848}, {1508, 839,  698}, {1742,1030,  769}, {1910, 852,  573},
68
    {1280, 859, 1174}, {1584, 863, 1108}, {1686, 708, 1364}, {1942, 768, 1104},
69
    { 891, 536,  690}, {1016, 560,  663}, {2172, 870, 1348}, {2404, 999, 1170},
70
    {1890, 966,  889}, {2116, 912,  777}, {2296,1020,  714}, {4872,1844,  932},
71
    {2392, 778,  929}, {2604, 772,  744}, {2764, 957,  722}, {5832,1532,  984},
72
    {2188, 519, 1264}, {2332, 532,  922}, {5064, 995, 2412}, {2708, 571,  874},
73
    {2408, 545,  666}, {5016,1084,  875}, {5376, 983, 1196}, {5536, 979,  730},
74
    {5344, 634, 1744}, {5688, 706, 1348}, {5912, 977, 1190}, {6072, 905,  763},
75
    {6048, 582, 1526}, {11968,1013,1816}, {12864,937, 1900}, {12560,1086, 998},
76
    {1998, 684, 1884}, {2504, 633, 1992}, {1252, 567,  835}, {1478, 571,  973},
77
    {2620, 769, 1414}, {2808, 952, 1142}, {2908, 712, 1028}, {2976, 686,  741},
78
    {1462, 552,  714}, {3296, 991, 1452}, {1590, 615,  544}, {3480,1150,  824},
79
    {3212, 832,  923}, {3276, 839,  531}, {3548, 786,  852}, {3732, 764,  570},
80
    {5728, 906, 2616}, {6272, 804, 2252}, {3096, 535,  876}, {3228, 598,  649},
81
    {6536, 759, 1436}, {6648, 993,  846}, {6864, 567, 1210},{14016,1012, 1302},
82
    {3408, 548, 1098}, {7160,1008, 1742}, {7136,1000, 1182}, {7480,1032,  836},
83
    {7448, 612, 1552}, {7744, 614,  816}, {8384, 777, 1438}, {8784, 694,  786},
84
    { 882,1508, 1068}, { 597, 837,  766}, {1270, 954, 1408}, { 803, 550,  798},
85
    {1398,1308,  798}, {1848,1534,  738}, { 970, 675,  608}, {1264, 706,  684},
86
    {1716, 767, 1126}, {2108, 765, 1404}, {2236, 924, 1003}, {2472,1048,  611},
87
    { 999, 942,  963}, {1094, 857,  935}, {2936, 926, 1138}, {1934, 746,  551},
88
    {3336, 633, 1762}, {3764, 701, 1454}, {1890, 564,  636}, {4096,1126,  793},
89
    {3936, 556, 1140}, {3936, 540,  740}, {4216, 764,  874}, {8480,1328, 1014},
90
    {2184, 515, 1042}, {4432, 934, 1344}, {4784, 945, 1112}, {5016,1062,  733},
91
    {9216,1020, 2028}, {9968, 924, 1188}, {5424, 909, 1206}, {6512, 744, 1086}
92
};
93

    
94
const uint8_t ff_gain_exp_tab[256] = {
95
   15, 15, 15, 15, 15, 16, 14, 15, 14, 14, 14, 14, 14, 14, 14, 14,
96
   14, 13, 14, 14, 13, 14, 13, 14, 13, 13, 13, 14, 13, 13, 14, 13,
97
   13, 13, 13, 13, 14, 13, 12, 12, 13, 13, 13, 12, 13, 13, 13, 13,
98
   13, 12, 13, 13, 12, 12, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13,
99
   13, 13, 13, 12, 12, 12, 13, 13, 12, 12, 12, 13, 12, 12, 12, 12,
100
   12, 12, 12, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12,
101
   12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 13, 13, 13, 13,
102
   13, 13, 13, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14,
103
   13, 12, 12, 11, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
104
   12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 11, 11, 11, 11,
105
   12, 12, 12, 12, 11, 11, 12, 12, 12, 12, 12, 13, 12, 12, 12, 13,
106
   12, 12, 13, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14,
107
   12, 12, 11, 11, 12, 12, 12, 12, 11, 12, 11, 12, 12, 12, 12, 12,
108
   13, 13, 12, 12, 13, 13, 13, 14, 12, 13, 13, 13, 13, 13, 13, 13,
109
   11, 10, 11, 10, 11, 11, 10, 10, 11, 11, 11, 11, 10,  9, 11, 10,
110
   12, 12, 11, 12, 12, 12, 12, 13, 11, 12, 12, 12, 13, 13, 12, 12
111
};
112

    
113
const int8_t ff_cb1_vects[128][40]={
114
    {
115
     38,  -4,  15,  -4,  14, -13,  12, -11,  -2,  -6,
116
     -6, -11, -45, -16, -11, -13,  -7,   6, -12,   4,
117
    -20,   3, -16,  12,  -1,  12,  46,  24,   0,  33,
118
     -3,   9, -12, -12,  -8,  -7,  17,  -6,   0,  -2,
119
    }, {
120
     60, -16,   3, -22,  10, -32,   0, -28, -17, -18,
121
     -3, -25, -37, -23, -10,   3,   2,   3,   0,   3,
122
    -14,   0, -14,  -1,   0,   2,  32,   9,  -1,  25,
123
      7,  13,  -5,  13,   8,   1,   2,   8, -10,   6,
124
    }, {
125
     27, -12,  28,  -2,   6,  -7,  15,   9, -11,   1,
126
    -13, -11, -40,   4, -29, -14, -19,  -5, -23,  -8,
127
    -30, -13, -17,   0, -14,  12,  34,  20,  -2,  25,
128
      2, -16,  -4, -12,  15,  16,  29,   7,  24,  10,
129
    }, {
130
     49, -24,  16, -20,   2, -26,   2,  -7, -25, -10,
131
    -11, -25, -32,  -3, -27,   2,  -8,  -8, -11,  -9,
132
    -24, -17, -16, -14, -13,   2,  20,   5,  -4,  17,
133
     14, -12,   3,  13,  33,  25,  14,  23,  15,  19,
134
    }, {
135
     46,  -6,  21,   8,  -2, -16,  -5,  -8, -11,   4,
136
      8,  15, -24,   4,  -2, -26,  -3, -16, -16, -14,
137
     -9,  -2,  -1,   4,  19,   7,  36,  17,   9,  13,
138
      0,  31,  -5, -12,   7,  -8,  11, -15, -13,  -4,
139
    }, {
140
     68, -18,   9,  -9,  -6, -35, -18, -25, -26,  -7,
141
     10,   1, -16,  -3,  -1,  -9,   6, -19,  -4, -15,
142
     -4,  -6,   0,  -8,  20,  -2,  23,   2,   7,   5,
143
     12,  35,   1,  13,  24,   0,  -3,   0, -22,   4,
144
    }, {
145
     35, -14,  34,  10, -10, -10,  -1,  12, -20,  12,
146
      0,  15, -18,  24, -20, -27, -14, -28, -27, -27,
147
    -20, -19,  -2,  -8,   5,   7,  25,  13,   5,   5,
148
      6,   5,   2, -12,  31,  15,  23,  -1,  12,   8,
149
    }, {
150
     57, -26,  22,  -7, -14, -28, -14,  -3, -35,   0,
151
      3,   1, -11,  16, -18, -10,  -4, -31, -15, -28,
152
    -14, -23,  -1, -21,   7,  -2,  11,  -1,   3,  -1,
153
     18,   9,  10,  13,  49,  24,   8,  14,   2,  16,
154
    }, {
155
     25,  15,  22,  11,  18,   4,  15, -22,   8,  -2,
156
    -17,  -9, -48, -20, -30, -17, -16,  11,  -1,  16,
157
      2,  10,  -5,  26,  -2,  -4,  22,   0,   2,  10,
158
     -6,  13, -14,  10, -23,   0,  10,  -2,   1,   0,
159
    }, {
160
     47,   3,  11,  -6,  15, -13,   2, -38,  -6, -13,
161
    -15, -22, -40, -28, -28,   0,  -5,   8,  10,  15,
162
      7,   7,  -4,  13,  -1, -14,   9, -14,   0,   2,
163
      4,  18,  -7,  36,  -6,   8,  -3,  13,  -7,   8,
164
    }, {
165
     14,   7,  36,  13,  10,  10,  18,   0,   0,   5,
166
    -25,  -8, -43,   0, -48, -18, -27,   0, -12,   3,
167
     -7,  -6,  -7,  13, -15,  -5,  11,  -3,   0,   2,
168
      0, -12,  -6,  10,   0,  23,  22,  11,  26,  12,
169
    }, {
170
     36,  -5,  24,  -4,   7,  -7,   6, -17, -14,  -5,
171
    -22, -22, -35,  -8, -46,  -1, -17,  -3,   0,   2,
172
     -2, -10,  -5,   0, -14, -15,  -2, -18,  -2,  -4,
173
     11,  -7,   1,  36,  18,  32,   7,  27,  17,  20,
174
    }, {
175
     33,  13,  29,  24,   1,   1,  -2, -18,   0,   9,
176
     -3,  17, -27,   0, -21, -30, -12, -11,  -5,  -2,
177
     12,   4,   9,  19,  18,  -9,  13,  -6,  11,  -8,
178
     -2,  35,  -8,  10,  -7,  -1,   4, -11, -10,  -2,
179
    }, {
180
     55,   1,  17,   6,  -1, -16, -15, -35, -15,  -2,
181
      0,   4, -19,  -8, -20, -13,  -1, -14,   7,  -3,
182
     18,   0,  10,   5,  19, -19,   0, -21,   8, -16,
183
      9,  39,   0,  36,  10,   7,  -9,   4, -20,   5,
184
    }, {
185
     22,   5,  42,  26,  -6,   8,   1,   2,  -9,  17,
186
    -10,  18, -21,  19, -39, -31, -23, -23, -16, -15,
187
      2, -12,   7,   6,   5,  -9,   1, -10,   7, -16,
188
      4,   9,   0,  10,  17,  22,  16,   2,  14,   9,
189
    }, {
190
     44,  -6,  30,   8,  -9, -10, -11, -14, -23,   5,
191
     -8,   4, -14,  12, -37, -14, -12, -26,  -4, -16,
192
      8, -16,   9,  -7,   6, -19, -12, -25,   5, -24,
193
     15,  13,   8,  36,  34,  31,   1,  18,   4,  18,
194
    }, {
195
     -3,  -5,  -9,  -7,  15,  -1,   5,  13,   2,  12,
196
      5,   2, -21, -23,  -2, -16,   0,   5,  -6,  13,
197
    -23,   3, -32,  10, -15,   8,  44,  28,   9,  37,
198
     -2,  13,  -9, -15, -12, -27,  -7, -12,   0, -11,
199
    }, {
200
     18, -17, -21, -25,  11, -19,  -6,  -3, -11,   0,
201
      7, -11, -13, -31,  -1,   0,   9,   1,   5,  12,
202
    -18,   0, -31,  -2, -13,  -1,  30,  14,   7,  29,
203
      9,  18,  -1,  10,   4, -18, -22,   3, -10,  -2,
204
    }, {
205
    -13, -13,   3,  -5,   7,   4,   9,  34,  -5,  20,
206
     -2,   3, -16,  -3, -20, -17, -11,  -7, -17,   0,
207
    -34, -13, -33,  -2, -28,   8,  32,  24,   5,  29,
208
      3, -12,   0, -15,  11,  -3,   3,   2,  24,   1,
209
    }, {
210
      8, -25,  -8, -23,   3, -13,  -3,  17, -20,   8,
211
      0, -10,  -8, -11, -18,   0,  -1, -10,  -5,   0,
212
    -28, -17, -32, -15, -26,  -1,  19,   9,   3,  21,
213
     15,  -7,   6,   9,  29,   5, -10,  17,  15,   9,
214
    }, {
215
      4,  -6,  -3,   5,  -1,  -4, -11,  16,  -6,  23,
216
     19,  29,   0,  -3,   6, -30,   3, -17, -10,  -5,
217
    -13,  -2, -17,   3,   5,   3,  35,  21,  17,  17,
218
      2,  35,  -2, -15,   3, -28, -13, -21, -13, -13,
219
    }, {
220
     26, -19, -15, -12,  -5, -22, -24,   0, -21,  12,
221
     21,  15,   8, -11,   7, -12,  14, -20,   2,  -6,
222
     -7,  -6, -16,  -9,   6,  -5,  21,   7,  15,  10,
223
     13,  39,   5,  10,  20, -19, -28,  -5, -22,  -5,
224
    }, {
225
     -5, -15,   9,   7,  -9,   2,  -8,  37, -14,  31,
226
     11,  29,   5,  16, -11, -30,  -7, -29, -21, -18,
227
    -23, -19, -18,  -9,  -7,   3,  23,  17,  14,   9,
228
      8,   9,   6, -15,  27,  -4,  -2,  -6,  12,  -1,
229
    }, {
230
     16, -27,  -2, -10, -13, -16, -20,  20, -29,  20,
231
     14,  16,  13,   8,  -9, -13,   2, -33,  -9, -19,
232
    -17, -23, -17, -22,  -6,  -6,   9,   2,  12,   2,
233
     20,  13,  13,  10,  45,   4, -16,   8,   2,   7,
234
    }, {
235
    -16,  14,  -2,   8,  20,  17,   9,   2,  14,  16,
236
     -6,   5, -24, -28, -21, -20,  -8,   9,   4,  25,
237
     -1,  11, -22,  24, -15,  -8,  21,   5,  11,  14,
238
     -5,  18, -11,   7, -27, -20, -14,  -7,   1,  -9,
239
    }, {
240
      6,   2, -14,  -9,  16,  -1,  -3, -14,   0,   5,
241
     -3,  -8, -16, -36, -19,  -3,   1,   6,  17,  24,
242
      4,   7, -21,  11, -14, -18,   7,  -9,   9,   7,
243
      6,  22,  -3,  33, -10, -11, -28,   7,  -7,   0,
244
    }, {
245
    -26,   6,  11,  10,  12,  23,  12,  23,   5,  24,
246
    -13,   5, -19,  -8, -38, -21, -20,  -2,  -6,  12,
247
    -11,  -5, -23,  11, -29,  -9,   9,   0,   7,   6,
248
      1,  -7,  -2,   7,  -3,   3,  -2,   6,  27,   3,
249
    }, {
250
     -4,  -6,   0,  -7,   8,   4,   0,   6,  -9,  13,
251
    -11,  -7, -11, -15, -37,  -4,  -9,  -5,   5,  11,
252
     -5,  -9, -22,  -1, -27, -18,  -4, -14,   5,   0,
253
     12,  -3,   4,  32,  14,  12, -17,  22,  17,  11,
254
    }, {
255
     -8,  12,   3,  21,   3,  14,  -8,   5,   4,  28,
256
      7,  32,  -2,  -8, -12, -34,  -4, -12,   1,   6,
257
      9,   4,  -7,  17,   4, -13,  11,  -1,  19,  -4,
258
      0,  39,  -4,   7, -11, -21, -20, -16, -10, -11,
259
    }, {
260
     13,   0,  -8,   3,   0,  -4, -21, -11,  -9,  16,
261
     10,  18,   5, -16, -10, -16,   5, -15,  13,   5,
262
     15,   1,  -6,   4,   6, -23,  -2, -16,  17, -12,
263
     10,  44,   3,  33,   6, -12, -34,  -1, -20,  -3,
264
    }, {
265
    -18,   4,  17,  23,  -4,  20,  -4,  26,  -3,  36,
266
      0,  32,   2,  12, -29, -34, -16, -24, -10,  -6,
267
      0, -12,  -8,   4,  -8, -13,   0,  -6,  16, -12,
268
      5,  13,   3,   7,  13,   3,  -8,  -2,  14,   0,
269
    }, {
270
      3,  -7,   5,   5,  -8,   2, -17,   9, -18,  24,
271
      2,  19,  10,   4, -28, -17,  -5, -28,   2,  -7,
272
      4, -15,  -7,  -8,  -6, -23, -13, -21,  14, -20,
273
     17,  18,  11,  33,  30,  11, -23,  13,   5,   9,
274
    }, {
275
     60,  10,   7,  -1,   9,  -8,   6, -13,   2, -15,
276
     -1, -10, -13, -11,  15,   0,   6,   9,  -1,   0,
277
    -13,   1, -11,  -3, -13,  21,  13,  26,  -7,  31,
278
    -10,  -7, -16, -33, -31, -10,  22,  -8,   1,  -2,
279
    }, {
280
     82,  -1,  -4, -19,   6, -27,  -6, -29, -12, -26,
281
      1, -24,  -5, -18,  17,  17,  17,   6,  10,   0,
282
     -7,  -2,  -9, -16, -12,  11,   0,  11,  -9,  23,
283
      0,  -3,  -8,  -8, -13,  -1,   8,   7,  -7,   6,
284
    }, {
285
     49,   2,  21,   0,   1,  -2,   9,   8,  -6,  -6,
286
     -8, -10,  -8,   9,  -2,   0,  -4,  -2, -13, -12,
287
    -23, -15, -12, -16, -26,  21,   2,  21, -11,  23,
288
     -4, -33,  -7, -33,  -6,  13,  34,   5,  27,  10,
289
    }, {
290
     71, -10,   9, -17,  -1, -20,  -3,  -8, -21, -18,
291
     -6, -24,   0,   1,   0,  16,   6,  -5,   0, -13,
292
    -17, -19, -11, -29, -25,  11, -11,   6, -13,  15,
293
      7, -29,   0,  -8,  11,  22,  20,  21,  17,  18,
294
    }, {
295
     67,   8,  14,  11,  -7, -11, -11,  -9,  -7,  -3,
296
     13,  16,   8,   9,  24, -12,  10, -13,  -5, -17,
297
     -2,  -4,   3, -10,   6,  17,   4,  19,   0,  11,
298
     -6,  13,  -9, -33, -14, -10,  16, -17, -10,  -4,
299
    }, {
300
     90,  -3,   2,  -6, -10, -29, -24, -26, -21, -15,
301
     15,   2,  16,   1,  25,   4,  21, -16,   6, -18,
302
      3,  -8,   5, -24,   8,   7,  -9,   4,  -1,   3,
303
      5,  18,  -1,  -7,   2,  -1,   2,  -1, -19,   3,
304
    }, {
305
     57,   0,  27,  13, -14,  -5,  -7,  11, -15,   4,
306
      5,  16,  13,  29,   6, -13,   0, -25, -16, -31,
307
    -12, -22,   2, -23,  -6,  16,  -7,  14,  -2,   3,
308
      0, -12,   0, -33,   9,  13,  28,  -3,  14,   7,
309
    }, {
310
     79, -11,  15,  -4, -18, -23, -20,  -5, -30,  -7,
311
      7,   2,  21,  21,   8,   3,  10, -28,  -4, -31,
312
     -6, -25,   3, -37,  -4,   7, -20,   0,  -4,  -4,
313
     11,  -7,   6,  -8,  27,  22,  14,  12,   5,  16,
314
    }, {
315
     47,  30,  15,  14,  14,   9,   9, -23,  13, -10,
316
    -12,  -7, -16, -15,  -3,  -3,  -1,  14,   9,  12,
317
      9,   8,   0,  10, -14,   4,  -9,   2,  -5,   8,
318
    -13,  -3, -18, -10, -45,  -3,  16,  -4,   4,   0,
319
    }, {
320
     69,  17,   3,  -3,  10,  -8,  -3, -40,  -1, -21,
321
    -10, -21,  -8, -23,  -1,  13,   8,  11,  21,  11,
322
     15,   4,   0,  -2, -13,  -5, -23, -12,  -7,   0,
323
     -1,   0, -10,  14, -28,   5,   1,  11,  -5,   7,
324
    }, {
325
     36,  21,  28,  16,   6,  16,  12,  -2,   4,  -2,
326
    -20,  -7, -11,   4, -20,  -4, -12,   2,  -1,   0,
327
      0,  -8,  -2,  -2, -27,   4, -21,  -2,  -9,   0,
328
     -6, -29,  -9, -10, -21,  21,  28,  10,  29,  11,
329
    }, {
330
     58,   9,  16,  -1,   2,  -2,   0, -19, -10, -13,
331
    -17, -21,  -3,  -3, -19,  12,  -2,   0,  10,  -1,
332
      5, -12,   0, -15, -26,  -5, -34, -16, -11,  -7,
333
      4, -25,  -2,  14,  -3,  29,  13,  25,  20,  20,
334
    }, {
335
     55,  28,  21,  27,  -2,   7,  -8, -20,   4,   1,
336
      1,  18,   5,   4,   5, -16,   2,  -8,   5,  -5,
337
     19,   2,  14,   3,   6,   0, -18,  -4,   2, -11,
338
     -8,  18, -11, -10, -29,  -3,  10, -13,  -8,  -3,
339
    }, {
340
     77,  16,   9,   9,  -6, -11, -21, -37, -10, -10,
341
      4,   5,  13,  -3,   7,   0,  13, -11,  17,  -6,
342
     25,  -1,  15,  -9,   7,  -9, -32, -19,   0, -18,
343
      2,  22,  -3,  15, -12,   5,  -4,   2, -17,   5,
344
    }, {
345
     44,  20,  34,  29, -10,  13,  -4,   0,  -4,   9,
346
     -5,  19,  10,  24, -11, -17,  -8, -20,  -5, -19,
347
      9, -14,  12,  -9,  -6,   0, -30,  -9,   0, -19,
348
     -2,  -7,  -2, -10,  -5,  20,  21,   1,  17,   9,
349
    }, {
350
     66,   8,  23,  11, -14,  -5, -17, -16, -19,  -2,
351
     -3,   5,  18,  17, -10,   0,   1, -23,   6, -20,
352
     15, -18,  14, -22,  -5, -10, -44, -23,  -2, -26,
353
      9,  -3,   4,  14,  12,  29,   7,  16,   7,  18,
354
    }, {
355
     18,   9, -17,  -4,  11,   3,   0,  11,   7,   4,
356
     10,   3,  10, -18,  24,  -3,  14,   7,   4,  10,
357
    -16,   1, -27,  -4, -27,  17,  12,  30,   0,  35,
358
     -9,  -3, -12, -36, -35, -30,  -2, -13,   2, -11,
359
    }, {
360
     40,  -2, -29, -22,   7, -14, -12,  -5,  -7,  -7,
361
     12,  -9,  18, -26,  26,  14,  24,   4,  16,   9,
362
    -10,  -2, -26, -18, -26,   7,  -1,  15,  -1,  27,
363
      2,   0,  -4, -11, -17, -21, -16,   1,  -7,  -3,
364
    }, {
365
      8,   1,  -3,  -2,   3,  10,   3,  32,  -1,  12,
366
      2,   4,  15,   1,   7,  -3,   2,  -4,  -6,  -3,
367
    -26, -15, -29, -17, -40,  17,   0,  26,  -2,  27,
368
     -2, -29,  -4, -36, -10,  -6,   9,   0,  27,   0,
369
    }, {
370
     30, -11, -15, -20,   0,  -8,  -9,  15, -15,   0,
371
      5,  -9,  23,  -6,   8,  13,  13,  -7,   5,  -3,
372
    -20, -19, -27, -31, -39,   7, -13,  11,  -4,  19,
373
      8, -25,   3, -11,   7,   2,  -4,  16,  18,   9,
374
    }, {
375
     26,   7, -11,   8,  -5,   1, -17,  14,  -1,  15,
376
     24,  30,  32,   1,  33, -16,  18, -14,   0,  -8,
377
     -6,  -4, -12, -12,  -6,  13,   2,  23,   8,  15,
378
     -4,  17,  -5, -36, -18, -30,  -8, -22, -10, -14,
379
    }, {
380
     48,  -4, -23,  -9,  -9, -17, -30,  -2, -16,   3,
381
     26,  16,  40,  -6,  35,   1,  28, -17,  12,  -9,
382
      0,  -8, -11, -25,  -5,   3, -10,   8,   6,   7,
383
      6,  22,   1, -11,  -1, -21, -22,  -7, -19,  -5,
384
    }, {
385
     15,   0,   2,  10, -13,   7, -14,  35, -10,  23,
386
     16,  31,  37,  21,  16, -17,   6, -26, -10, -21,
387
    -16, -21, -13, -25, -19,  13,  -8,  19,   5,   7,
388
      1,  -8,   2, -36,   5,  -6,   3,  -8,  15,  -1,
389
    }, {
390
     37, -12,  -9,  -7, -17, -11, -26,  18, -25,  12,
391
     19,  17,  45,  14,  17,   0,  17, -30,   1, -22,
392
    -10, -25, -12, -38, -18,   3, -22,   4,   3,   0,
393
     13,  -3,  10, -11,  23,   2, -10,   7,   5,   7,
394
    }, {
395
      5,  29,  -9,  11,  15,  22,   3,   0,  18,   8,
396
     -1,   6,   7, -23,   6,  -6,   5,  12,  15,  21,
397
      5,   8, -17,   9, -28,   0, -11,   6,   2,  12,
398
    -11,   0, -14, -13, -49, -22,  -8,  -9,   4,  -9,
399
    }, {
400
     27,  16, -21,  -6,  12,   3,  -9, -16,   3,  -2,
401
      1,  -7,  15, -31,   7,  10,  16,   9,  27,  21,
402
     11,   5, -16,  -3, -26,  -9, -24,  -7,   0,   4,
403
      0,   4,  -6,  11, -32, -14, -23,   6,  -5,  -1,
404
    }, {
405
     -4,  20,   3,  13,   8,  28,   6,  21,  10,  16,
406
     -8,   7,  12,  -3, -11,  -7,  -5,   0,   4,   8,
407
     -4,  -8, -18,  -3, -41,   0, -22,   2,   0,   4,
408
     -5, -25,  -6, -14, -25,   1,   2,   4,  29,   2,
409
    }, {
410
     17,   8,  -8,  -4,   4,  10,  -6,   5,  -4,   5,
411
     -6,  -6,  20, -10,  -9,   9,   4,  -2,  16,   7,
412
      1, -12, -17, -16, -39,  -9, -36, -12,  -2,  -3,
413
      6, -21,   1,  11,  -7,  10, -11,  20,  20,  11,
414
    }, {
415
     13,  27,  -3,  24,  -1,  19, -14,   3,   9,  20,
416
     12,  33,  29,  -3,  15, -20,   9,  -9,  11,   3,
417
     16,   2,  -2,   2,  -7,  -3, -20,   0,  10,  -7,
418
     -7,  22,  -7, -13, -33, -23, -14, -18,  -7, -12,
419
    }, {
420
     35,  15, -15,   6,  -4,   1, -27, -12,  -5,   8,
421
     15,  19,  37, -11,  16,  -2,  20, -12,  23,   2,
422
     22,  -1,  -1, -11,  -5, -13, -34, -14,   8, -14,
423
      4,  26,   0,  11, -16, -14, -29,  -2, -17,  -3,
424
    }, {
425
      3,  19,   9,  26,  -8,  26, -10,  24,   0,  28,
426
      5,  33,  34,  17,  -2, -20,  -1, -22,   0, -10,
427
      6, -14,  -3, -10, -20,  -4, -32,  -4,   7, -15,
428
      0,  -3,   0, -13,  -9,   0,  -3,  -4,  17,   0,
429
    }, {
430
     25,   7,  -2,   8, -12,   7, -23,   8, -13,  16,
431
      7,  20,  42,   9,   0,  -3,   9, -25,  12, -10,
432
     12, -18,  -2, -24, -19, -13, -46, -19,   5, -22,
433
     10,   0,   8,  11,   8,   9, -17,  11,   7,   8,
434
    }, {
435
    -25,  -7,   2,  -8,  12,  -7,  23,  -8,  13, -16,
436
     -7, -20, -42,  -9,   0,   3,  -9,  25, -12,  10,
437
    -12,  18,   2,  24,  19,  13,  46,  19,  -5,  22,
438
    -10,   0,  -8, -11,  -8,  -9,  17, -11,  -7,  -8,
439
    }, {
440
     -3, -19,  -9, -26,   8, -26,  10, -24,   0, -28,
441
     -5, -33, -34, -17,   2,  20,   1,  22,   0,  10,
442
     -6,  14,   3,  10,  20,   4,  32,   4,  -7,  15,
443
      0,   3,   0,  13,   9,   0,   3,   4, -17,   0,
444
    }, {
445
    -35, -15,  15,  -6,   4,  -1,  27,  12,   5,  -8,
446
    -15, -19, -37,  11, -16,   2, -20,  12, -23,  -2,
447
    -22,   1,   1,  11,   5,  13,  34,  14,  -8,  14,
448
     -4, -26,   0, -11,  16,  14,  29,   2,  17,   3,
449
    }, {
450
    -13, -27,   3, -24,   1, -19,  14,  -3,  -9, -20,
451
    -12, -33, -29,   3, -15,  20,  -9,   9, -11,  -3,
452
    -16,  -2,   2,  -2,   7,   3,  20,   0, -10,   7,
453
      7, -22,   7,  13,  33,  23,  14,  18,   7,  12,
454
    }, {
455
    -17,  -8,   8,   4,  -4, -10,   6,  -5,   4,  -5,
456
      6,   6, -20,  10,   9,  -9,  -4,   2, -16,  -7,
457
     -1,  12,  17,  16,  39,   9,  36,  12,   2,   3,
458
     -6,  21,  -1, -11,   7, -10,  11, -20, -20, -11,
459
    }, {
460
      4, -20,  -3, -13,  -8, -28,  -6, -21, -10, -16,
461
      8,  -7, -12,   3,  11,   7,   5,   0,  -4,  -8,
462
      4,   8,  18,   3,  41,   0,  22,  -2,   0,  -4,
463
      5,  25,   6,  14,  25,  -1,  -2,  -4, -29,  -2,
464
    }, {
465
    -27, -16,  21,   6, -12,  -3,   9,  16,  -3,   2,
466
     -1,   7, -15,  31,  -7, -10, -16,  -9, -27, -21,
467
    -11,  -5,  16,   3,  26,   9,  24,   7,   0,  -4,
468
      0,  -4,   6, -11,  32,  14,  23,  -6,   5,   1,
469
    }, {
470
     -5, -29,   9, -11, -15, -22,  -3,   0, -18,  -8,
471
      1,  -6,  -7,  23,  -6,   6,  -5, -12, -15, -21,
472
     -5,  -8,  17,  -9,  28,   0,  11,  -6,  -2, -12,
473
     11,   0,  14,  13,  49,  22,   8,   9,  -4,   9,
474
    }, {
475
    -37,  12,   9,   7,  17,  11,  26, -18,  25, -12,
476
    -19, -17, -45, -14, -17,   0, -17,  30,  -1,  22,
477
     10,  25,  12,  38,  18,  -3,  22,  -4,  -3,   0,
478
    -13,   3, -10,  11, -23,  -2,  10,  -7,  -5,  -7,
479
    }, {
480
    -15,   0,  -2, -10,  13,  -7,  14, -35,  10, -23,
481
    -16, -31, -37, -21, -16,  17,  -6,  26,  10,  21,
482
     16,  21,  13,  25,  19, -13,   8, -19,  -5,  -7,
483
     -1,   8,  -2,  36,  -5,   6,  -3,   8, -15,   1,
484
    }, {
485
    -48,   4,  23,   9,   9,  17,  30,   2,  16,  -3,
486
    -26, -16, -40,   6, -35,  -1, -28,  17, -12,   9,
487
      0,   8,  11,  25,   5,  -3,  10,  -8,  -6,  -7,
488
     -6, -22,  -1,  11,   1,  21,  22,   7,  19,   5,
489
    }, {
490
    -26,  -7,  11,  -8,   5,  -1,  17, -14,   1, -15,
491
    -24, -30, -32,  -1, -33,  16, -18,  14,   0,   8,
492
      6,   4,  12,  12,   6, -13,  -2, -23,  -8, -15,
493
      4, -17,   5,  36,  18,  30,   8,  22,  10,  14,
494
    }, {
495
    -30,  11,  15,  20,   0,   8,   9, -15,  15,   0,
496
     -5,   9, -23,   6,  -8, -13, -13,   7,  -5,   3,
497
     20,  19,  27,  31,  39,  -7,  13, -11,   4, -19,
498
     -8,  25,  -3,  11,  -7,  -2,   4, -16, -18,  -9,
499
    }, {
500
     -8,  -1,   3,   2,  -3, -10,  -3, -32,   1, -12,
501
     -2,  -4, -15,  -1,  -7,   3,  -2,   4,   6,   3,
502
     26,  15,  29,  17,  40, -17,   0, -26,   2, -27,
503
      2,  29,   4,  36,  10,   6,  -9,   0, -27,   0,
504
    }, {
505
    -40,   2,  29,  22,  -7,  14,  12,   5,   7,   7,
506
    -12,   9, -18,  26, -26, -14, -24,  -4, -16,  -9,
507
     10,   2,  26,  18,  26,  -7,   1, -15,   1, -27,
508
     -2,   0,   4,  11,  17,  21,  16,  -1,   7,   3,
509
    }, {
510
    -18,  -9,  17,   4, -11,  -3,   0, -11,  -7,  -4,
511
    -10,  -3, -10,  18, -24,   3, -14,  -7,  -4, -10,
512
     16,  -1,  27,   4,  27, -17, -12, -30,   0, -35,
513
      9,   3,  12,  36,  35,  30,   2,  13,  -2,  11,
514
    }, {
515
    -66,  -8, -23, -11,  14,   5,  17,  16,  19,   2,
516
      3,  -5, -18, -17,  10,   0,  -1,  23,  -6,  20,
517
    -15,  18, -14,  22,   5,  10,  44,  23,   2,  26,
518
     -9,   3,  -4, -14, -12, -29,  -7, -16,  -7, -18,
519
    }, {
520
    -44, -20, -34, -29,  10, -13,   4,   0,   4,  -9,
521
      5, -19, -10, -24,  11,  17,   8,  20,   5,  19,
522
     -9,  14, -12,   9,   6,   0,  30,   9,   0,  19,
523
      2,   7,   2,  10,   5, -20, -21,  -1, -17,  -9,
524
    }, {
525
    -77, -16,  -9,  -9,   6,  11,  21,  37,  10,  10,
526
     -4,  -5, -13,   3,  -7,   0, -13,  11, -17,   6,
527
    -25,   1, -15,   9,  -7,   9,  32,  19,   0,  18,
528
     -2, -22,   3, -15,  12,  -5,   4,  -2,  17,  -5,
529
    }, {
530
    -55, -28, -21, -27,   2,  -7,   8,  20,  -4,  -1,
531
     -1, -18,  -5,  -4,  -5,  16,  -2,   8,  -5,   5,
532
    -19,  -2, -14,  -3,  -6,   0,  18,   4,  -2,  11,
533
      8, -18,  11,  10,  29,   3, -10,  13,   8,   3,
534
    }, {
535
    -58,  -9, -16,   1,  -2,   2,   0,  19,  10,  13,
536
     17,  21,   3,   3,  19, -12,   2,   0, -10,   1,
537
     -5,  12,   0,  15,  26,   5,  34,  16,  11,   7,
538
     -4,  25,   2, -14,   3, -29, -13, -25, -20, -20,
539
    }, {
540
    -36, -21, -28, -16,  -6, -16, -12,   2,  -4,   2,
541
     20,   7,  11,  -4,  20,   4,  12,  -2,   1,   0,
542
      0,   8,   2,   2,  27,  -4,  21,   2,   9,   0,
543
      6,  29,   9,  10,  21, -21, -28, -10, -29, -11,
544
    }, {
545
    -69, -17,  -3,   3, -10,   8,   3,  40,   1,  21,
546
     10,  21,   8,  23,   1, -13,  -8, -11, -21, -11,
547
    -15,  -4,   0,   2,  13,   5,  23,  12,   7,   0,
548
      1,   0,  10, -14,  28,  -5,  -1, -11,   5,  -7,
549
    }, {
550
    -47, -30, -15, -14, -14,  -9,  -9,  23, -13,  10,
551
     12,   7,  16,  15,   3,   3,   1, -14,  -9, -12,
552
     -9,  -8,   0, -10,  14,  -4,   9,  -2,   5,  -8,
553
     13,   3,  18,  10,  45,   3, -16,   4,  -4,   0,
554
    }, {
555
    -79,  11, -15,   4,  18,  23,  20,   5,  30,   7,
556
     -7,  -2, -21, -21,  -8,  -3, -10,  28,   4,  31,
557
      6,  25,  -3,  37,   4,  -7,  20,   0,   4,   4,
558
    -11,   7,  -6,   8, -27, -22, -14, -12,  -5, -16,
559
    }, {
560
    -57,   0, -27, -13,  14,   5,   7, -11,  15,  -4,
561
     -5, -16, -13, -29,  -6,  13,   0,  25,  16,  31,
562
     12,  22,  -2,  23,   6, -16,   7, -14,   2,  -3,
563
      0,  12,   0,  33,  -9, -13, -28,   3, -14,  -7,
564
    }, {
565
    -90,   3,  -2,   6,  10,  29,  24,  26,  21,  15,
566
    -15,  -2, -16,  -1, -25,  -4, -21,  16,  -6,  18,
567
     -3,   8,  -5,  24,  -8,  -7,   9,  -4,   1,  -3,
568
     -5, -18,   1,   7,  -2,   1,  -2,   1,  19,  -3,
569
    }, {
570
    -67,  -8, -14, -11,   7,  11,  11,   9,   7,   3,
571
    -13, -16,  -8,  -9, -24,  12, -10,  13,   5,  17,
572
      2,   4,  -3,  10,  -6, -17,  -4, -19,   0, -11,
573
      6, -13,   9,  33,  14,  10, -16,  17,  10,   4,
574
    }, {
575
    -71,  10,  -9,  17,   1,  20,   3,   8,  21,  18,
576
      6,  24,   0,  -1,   0, -16,  -6,   5,   0,  13,
577
     17,  19,  11,  29,  25, -11,  11,  -6,  13, -15,
578
     -7,  29,   0,   8, -11, -22, -20, -21, -17, -18,
579
    }, {
580
    -49,  -2, -21,   0,  -1,   2,  -9,  -8,   6,   6,
581
      8,  10,   8,  -9,   2,   0,   4,   2,  13,  12,
582
     23,  15,  12,  16,  26, -21,  -2, -21,  11, -23,
583
      4,  33,   7,  33,   6, -13, -34,  -5, -27, -10,
584
    }, {
585
    -82,   1,   4,  19,  -6,  27,   6,  29,  12,  26,
586
     -1,  24,   5,  18, -17, -17, -17,  -6, -10,   0,
587
      7,   2,   9,  16,  12, -11,   0, -11,   9, -23,
588
      0,   3,   8,   8,  13,   1,  -8,  -7,   7,  -6,
589
    }, {
590
    -60, -10,  -7,   1,  -9,   8,  -6,  13,  -2,  15,
591
      1,  10,  13,  11, -15,   0,  -6,  -9,   1,   0,
592
     13,  -1,  11,   3,  13, -21, -13, -26,   7, -31,
593
     10,   7,  16,  33,  31,  10, -22,   8,  -1,   2,
594
    }, {
595
     -3,   7,  -5,  -5,   8,  -2,  17,  -9,  18, -24,
596
     -2, -19, -10,  -4,  28,  17,   5,  28,  -2,   7,
597
     -4,  15,   7,   8,   6,  23,  13,  21, -14,  20,
598
    -17, -18, -11, -33, -30, -11,  23, -13,  -5,  -9,
599
    }, {
600
     18,  -4, -17, -23,   4, -20,   4, -26,   3, -36,
601
      0, -32,  -2, -12,  29,  34,  16,  24,  10,   6,
602
      0,  12,   8,  -4,   8,  13,   0,   6, -16,  12,
603
     -5, -13,  -3,  -7, -13,  -3,   8,   2, -14,   0,
604
    }, {
605
    -13,   0,   8,  -3,   0,   4,  21,  11,   9, -16,
606
    -10, -18,  -5,  16,  10,  16,  -5,  15, -13,  -5,
607
    -15,  -1,   6,  -4,  -6,  23,   2,  16, -17,  12,
608
    -10, -44,  -3, -33,  -6,  12,  34,   1,  20,   3,
609
    }, {
610
      8, -12,  -3, -21,  -3, -14,   8,  -5,  -4, -28,
611
     -7, -32,   2,   8,  12,  34,   4,  12,  -1,  -6,
612
     -9,  -4,   7, -17,  -4,  13, -11,   1, -19,   4,
613
      0, -39,   4,  -7,  11,  21,  20,  16,  10,  11,
614
    }, {
615
      4,   6,   0,   7,  -8,  -4,   0,  -6,   9, -13,
616
     11,   7,  11,  15,  37,   4,   9,   5,  -5, -11,
617
      5,   9,  22,   1,  27,  18,   4,  14,  -5,   0,
618
    -12,   3,  -4, -32, -14, -12,  17, -22, -17, -11,
619
    }, {
620
     26,  -6, -11, -10, -12, -23, -12, -23,  -5, -24,
621
     13,  -5,  19,   8,  38,  21,  20,   2,   6, -12,
622
     11,   5,  23, -11,  29,   9,  -9,   0,  -7,  -6,
623
     -1,   7,   2,  -7,   3,  -3,   2,  -6, -27,  -3,
624
    }, {
625
     -6,  -2,  14,   9, -16,   1,   3,  14,   0,  -5,
626
      3,   8,  16,  36,  19,   3,  -1,  -6, -17, -24,
627
     -4,  -7,  21, -11,  14,  18,  -7,   9,  -9,  -7,
628
     -6, -22,   3, -33,  10,  11,  28,  -7,   7,   0,
629
    }, {
630
     16, -14,   2,  -8, -20, -17,  -9,  -2, -14, -16,
631
      6,  -5,  24,  28,  21,  20,   8,  -9,  -4, -25,
632
      1, -11,  22, -24,  15,   8, -21,  -5, -11, -14,
633
      5, -18,  11,  -7,  27,  20,  14,   7,  -1,   9,
634
    }, {
635
    -16,  27,   2,  10,  13,  16,  20, -20,  29, -20,
636
    -14, -16, -13,  -8,   9,  13,  -2,  33,   9,  19,
637
     17,  23,  17,  22,   6,   6,  -9,  -2, -12,  -2,
638
    -20, -13, -13, -10, -45,  -4,  16,  -8,  -2,  -7,
639
    }, {
640
      5,  15,  -9,  -7,   9,  -2,   8, -37,  14, -31,
641
    -11, -29,  -5, -16,  11,  30,   7,  29,  21,  18,
642
     23,  19,  18,   9,   7,  -3, -23, -17, -14,  -9,
643
     -8,  -9,  -6,  15, -27,   4,   2,   6, -12,   1,
644
    }, {
645
    -26,  19,  15,  12,   5,  22,  24,   0,  21, -12,
646
    -21, -15,  -8,  11,  -7,  12, -14,  20,  -2,   6,
647
      7,   6,  16,   9,  -6,   5, -21,  -7, -15, -10,
648
    -13, -39,  -5, -10, -20,  19,  28,   5,  22,   5,
649
    }, {
650
     -4,   6,   3,  -5,   1,   4,  11, -16,   6, -23,
651
    -19, -29,   0,   3,  -6,  30,  -3,  17,  10,   5,
652
     13,   2,  17,  -3,  -5,  -3, -35, -21, -17, -17,
653
     -2, -35,   2,  15,  -3,  28,  13,  21,  13,  13,
654
    }, {
655
     -8,  25,   8,  23,  -3,  13,   3, -17,  20,  -8,
656
      0,  10,   8,  11,  18,   0,   1,  10,   5,   0,
657
     28,  17,  32,  15,  26,   1, -19,  -9,  -3, -21,
658
    -15,   7,  -6,  -9, -29,  -5,  10, -17, -15,  -9,
659
    }, {
660
     13,  13,  -3,   5,  -7,  -4,  -9, -34,   5, -20,
661
      2,  -3,  16,   3,  20,  17,  11,   7,  17,   0,
662
     34,  13,  33,   2,  28,  -8, -32, -24,  -5, -29,
663
     -3,  12,   0,  15, -11,   3,  -3,  -2, -24,  -1,
664
    }, {
665
    -18,  17,  21,  25, -11,  19,   6,   3,  11,   0,
666
     -7,  11,  13,  31,   1,   0,  -9,  -1,  -5, -12,
667
     18,   0,  31,   2,  13,   1, -30, -14,  -7, -29,
668
     -9, -18,   1, -10,  -4,  18,  22,  -3,  10,   2,
669
    }, {
670
      3,   5,   9,   7, -15,   1,  -5, -13,  -2, -12,
671
     -5,  -2,  21,  23,   2,  16,   0,  -5,   6, -13,
672
     23,  -3,  32, -10,  15,  -8, -44, -28,  -9, -37,
673
      2, -13,   9,  15,  12,  27,   7,  12,   0,  11,
674
    }, {
675
    -44,   6, -30,  -8,   9,  10,  11,  14,  23,  -5,
676
      8,  -4,  14, -12,  37,  14,  12,  26,   4,  16,
677
     -8,  16,  -9,   7,  -6,  19,  12,  25,  -5,  24,
678
    -15, -13,  -8, -36, -34, -31,  -1, -18,  -4, -18,
679
    }, {
680
    -22,  -5, -42, -26,   6,  -8,  -1,  -2,   9, -17,
681
     10, -18,  21, -19,  39,  31,  23,  23,  16,  15,
682
     -2,  12,  -7,  -6,  -5,   9,  -1,  10,  -7,  16,
683
     -4,  -9,   0, -10, -17, -22, -16,  -2, -14,  -9,
684
    }, {
685
    -55,  -1, -17,  -6,   1,  16,  15,  35,  15,   2,
686
      0,  -4,  19,   8,  20,  13,   1,  14,  -7,   3,
687
    -18,   0, -10,  -5, -19,  19,   0,  21,  -8,  16,
688
     -9, -39,   0, -36, -10,  -7,   9,  -4,  20,  -5,
689
    }, {
690
    -33, -13, -29, -24,  -1,  -1,   2,  18,   0,  -9,
691
      3, -17,  27,   0,  21,  30,  12,  11,   5,   2,
692
    -12,  -4,  -9, -19, -18,   9, -13,   6, -11,   8,
693
      2, -35,   8, -10,   7,   1,  -4,  11,  10,   2,
694
    }, {
695
    -36,   5, -24,   4,  -7,   7,  -6,  17,  14,   5,
696
     22,  22,  35,   8,  46,   1,  17,   3,   0,  -2,
697
      2,  10,   5,   0,  14,  15,   2,  18,   2,   4,
698
    -11,   7,  -1, -36, -18, -32,  -7, -27, -17, -20,
699
    }, {
700
    -14,  -7, -36, -13, -10, -10, -18,   0,   0,  -5,
701
     25,   8,  43,   0,  48,  18,  27,   0,  12,  -3,
702
      7,   6,   7, -13,  15,   5, -11,   3,   0,  -2,
703
      0,  12,   6, -10,   0, -23, -22, -11, -26, -12,
704
    }, {
705
    -47,  -3, -11,   6, -15,  13,  -2,  38,   6,  13,
706
     15,  22,  40,  28,  28,   0,   5,  -8, -10, -15,
707
     -7,  -7,   4, -13,   1,  14,  -9,  14,   0,  -2,
708
     -4, -18,   7, -36,   6,  -8,   3, -13,   7,  -8,
709
    }, {
710
    -25, -15, -22, -11, -18,  -4, -15,  22,  -8,   2,
711
     17,   9,  48,  20,  30,  17,  16, -11,   1, -16,
712
     -2, -10,   5, -26,   2,   4, -22,   0,  -2, -10,
713
      6, -13,  14, -10,  23,   0, -10,   2,  -1,   0,
714
    }, {
715
    -57,  26, -22,   7,  14,  28,  14,   3,  35,   0,
716
     -3,  -1,  11, -16,  18,  10,   4,  31,  15,  28,
717
     14,  23,   1,  21,  -7,   2, -11,   1,  -3,   1,
718
    -18,  -9, -10, -13, -49, -24,  -8, -14,  -2, -16,
719
    }, {
720
    -35,  14, -34, -10,  10,  10,   1, -12,  20, -12,
721
      0, -15,  18, -24,  20,  27,  14,  28,  27,  27,
722
     20,  19,   2,   8,  -5,  -7, -25, -13,  -5,  -5,
723
     -6,  -5,  -2,  12, -31, -15, -23,   1, -12,  -8,
724
    }, {
725
    -68,  18,  -9,   9,   6,  35,  18,  25,  26,   7,
726
    -10,  -1,  16,   3,   1,   9,  -6,  19,   4,  15,
727
      4,   6,   0,   8, -20,   2, -23,  -2,  -7,  -5,
728
    -12, -35,  -1, -13, -24,   0,   3,   0,  22,  -4,
729
    }, {
730
    -46,   6, -21,  -8,   2,  16,   5,   8,  11,  -4,
731
     -8, -15,  24,  -4,   2,  26,   3,  16,  16,  14,
732
      9,   2,   1,  -4, -19,  -7, -36, -17,  -9, -13,
733
      0, -31,   5,  12,  -7,   8, -11,  15,  13,   4,
734
    }, {
735
    -49,  24, -16,  20,  -2,  26,  -2,   7,  25,  10,
736
     11,  25,  32,   3,  27,  -2,   8,   8,  11,   9,
737
     24,  17,  16,  14,  13,  -2, -20,  -5,   4, -17,
738
    -14,  12,  -3, -13, -33, -25, -14, -23, -15, -19,
739
    }, {
740
    -27,  12, -28,   2,  -6,   7, -15,  -9,  11,  -1,
741
     13,  11,  40,  -4,  29,  14,  19,   5,  23,   8,
742
     30,  13,  17,   0,  14, -12, -34, -20,   2, -25,
743
     -2,  16,   4,  12, -15, -16, -29,  -7, -24, -10,
744
    }, {
745
    -60,  16,  -3,  22, -10,  32,   0,  28,  17,  18,
746
      3,  25,  37,  23,  10,  -3,  -2,  -3,   0,  -3,
747
     14,   0,  14,   1,   0,  -2, -32,  -9,   1, -25,
748
     -7, -13,   5, -13,  -8,  -1,  -2,  -8,  10,  -6,
749
    }, {
750
    -38,   4, -15,   4, -14,  13, -12,  11,   2,   6,
751
      6,  11,  45,  16,  11,  13,   7,  -6,  12,  -4,
752
     20,  -3,  16, -12,   1, -12, -46, -24,   0, -33,
753
      3,  -9,  12,  12,   8,   7, -17,   6,   0,   2
754
    }
755
};
756

    
757
const int8_t ff_cb2_vects[128][40]={
758
    {
759
     73, -32, -60, -15, -26,  59,   2, -33,  30, -10,
760
     -3, -17,   8,  30,  -1, -26,  -4, -22,  10,  16,
761
    -36,  -5, -11,  56,  37,   6, -10,  -5, -13,  -3,
762
      6,  -5,  11,   4, -19,  -5, -16,  41,  24,  13,
763
    }, {
764
      4, -11, -37,  23,  -5,  46,  -2, -29,  -5, -39,
765
    -21,  -9,   0,  49,  12,  -9, -16, -26,  22,  15,
766
    -45, -20,  -5,  40,  22,  17, -26,  31, -14,   2,
767
    -14,  10,  30,  20, -27,  -9, -39,  39,  18,   5,
768
    }, {
769
     34, -25, -48, -28, -11,  34,  -2, -41,   9,  -7,
770
    -17,  21,  20,  24, -17, -33,   0, -24,  10,  42,
771
      3,  -5,  10,  42,  11,   8,  -3,   3,  16,   9,
772
     22,  -2,   0, -33, -10,  18,   7,  58,  10,  28,
773
    }, {
774
    -34,  -4, -25,  10,   9,  21,  -7, -36, -26, -36,
775
    -35,  28,  12,  42,  -3, -16, -12, -28,  21,  42,
776
     -5, -21,  16,  26,  -4,  19, -19,  39,  15,  15,
777
      1,  13,  19, -17, -17,  14, -15,  55,   4,  19,
778
    }, {
779
     28, -20, -51, -14,  -6,   7,   0, -26,  27,  -4,
780
     18, -40,  -6,  16,  -1, -15,   0, -55,  -5, -16,
781
    -19,  14,  -3,  49,  14,   1, -22, -30, -12,   0,
782
     24,  15,   9, -17, -45, -29,   4,  28,  51,  35,
783
    }, {
784
    -40,   0, -28,  24,  14,  -5,  -4, -21,  -7, -33,
785
      0, -32, -15,  35,  12,   1, -11, -58,   5, -16,
786
    -28,   0,   1,  33,   0,  11, -39,   5, -14,   6,
787
      3,  31,  28,  -1, -53, -33, -19,  25,  46,  26,
788
    }, {
789
    -11, -14, -39, -27,   9, -17,  -4, -33,   6,   0,
790
      4,  -1,   5,  10, -17, -22,   5, -57,  -5,   9,
791
     20,  13,  18,  35, -11,   3, -16, -22,  17,  13,
792
     40,  19,  -1, -55, -35,  -5,  27,  44,  37,  49,
793
    }, {
794
    -80,   6, -16,  11,  30, -30,  -9, -28, -28, -29,
795
    -13,   6,  -2,  28,  -3,  -5,  -7, -60,   5,   9,
796
     11,  -1,  24,  19, -27,  13, -32,  13,  15,  19,
797
     19,  35,  17, -39, -43,  -9,   4,  42,  32,  41,
798
    }, {
799
     78, -21, -43,   4, -38,  17,  17,  -5,  55,  24,
800
    -15, -36,  14,   4,  24, -24,  12,   5,  17,  31,
801
    -54,  -5,  -2,  27,  43, -12,   2,   9,  -9, -15,
802
     22,  -3,  28,  21, -20,   3,  20,  28,   9,  -5,
803
    }, {
804
      9,  -1, -20,  43, -17,   3,  12,   0,  20,  -4,
805
    -33, -29,   6,  22,  38,  -7,   0,   1,  29,  30,
806
    -63, -21,   3,  11,  27,  -1, -14,  45, -10,  -9,
807
      1,  12,  47,  37, -28,   0,  -2,  26,   4, -13,
808
    }, {
809
     39, -14, -30,  -8, -22,  -8,  12, -12,  34,  27,
810
    -29,   2,  26,  -2,   8, -31,  16,   3,  17,  57,
811
    -14,  -6,  19,  13,  16, -10,   8,  17,  20,  -2,
812
     38,   0,  17, -16, -11,  27,  44,  45,  -4,   8,
813
    }, {
814
    -29,   5,  -7,  30,  -1, -21,   7,  -7,   0,   0,
815
    -47,   9,  18,  15,  22, -14,   4,   0,  28,  57,
816
    -23, -21,  25,  -2,   1,   0,  -7,  53,  19,   3,
817
     17,  15,  36,   0, -19,  24,  21,  43,  -9,   0,
818
    }, {
819
     33, -10, -34,   5, -17, -35,  15,   1,  53,  30,
820
      6, -59,   0, -10,  24, -13,  17, -27,   1,  -1,
821
    -37,  13,   4,  20,  20, -18, -10, -16,  -8, -11,
822
     39,  18,  26,   0, -46, -20,  41,  15,  37,  15,
823
    }, {
824
    -35,  10, -11,  44,   3, -48,  10,   6,  17,   2,
825
    -11, -51,  -8,   8,  38,   3,   4, -31,  12,  -2,
826
    -46,  -1,  10,   4,   5,  -7, -26,  19, -10,  -5,
827
     18,  34,  45,  15, -54, -24,  18,  13,  31,   7,
828
    }, {
829
     -5,  -3, -21,  -7,  -2, -60,  10,  -5,  32,  34,
830
     -7, -20,  11, -16,   8, -20,  21, -29,   1,  24,
831
      2,  13,  27,   6,  -5, -15,  -3,  -8,  21,   1,
832
     55,  21,  15, -38, -37,   3,  65,  32,  23,  30,
833
    }, {
834
    -74,  17,   0,  31,  18, -73,   5,   0,  -3,   5,
835
    -25, -12,   3,   1,  22,  -3,   9, -33,  12,  24,
836
     -6,  -2,  33,  -9, -21,  -5, -20,  27,  19,   7,
837
     34,  37,  34, -22, -44,   0,  41,  29,  17,  21,
838
    }, {
839
     76, -35, -31, -28, -49,  43, -40,   0,  29, -14,
840
      8,   5,  10,  18, -26, -46,   0,   7,   6,   3,
841
    -25,  -7,  -2,  40,  28,  14,  18,  -3, -27, -28,
842
     -8, -45, -13,  34, -13, -27, -15,  31,  12,   3,
843
    }, {
844
      7, -15,  -9,   9, -28,  29, -45,   5,  -6, -43,
845
     -9,  12,   2,  36, -12, -30, -11,   3,  17,   3,
846
    -34, -22,   3,  24,  12,  24,   2,  32, -28, -22,
847
    -29, -29,   5,  50, -21, -31, -38,  29,   7,  -5,
848
    }, {
849
     36, -29, -19, -41, -34,  18, -45,  -6,   8, -10,
850
     -5,  43,  23,  11, -42, -53,   5,   5,   6,  30,
851
     14,  -8,  20,  26,   1,  16,  25,   4,   3, -15,
852
      7, -41, -23,  -3,  -4,  -3,   8,  48,  -1,  17,
853
    }, {
854
    -32,  -8,   3,  -2, -13,   4, -50,  -1, -27, -39,
855
    -23,  51,  15,  30, -27, -37,  -7,   1,  17,  29,
856
      5, -23,  25,  10, -14,  26,   8,  41,   1,  -9,
857
    -13, -26,  -5,  12, -12,  -7, -14,  45,  -6,   9,
858
    }, {
859
     31, -24, -23, -27, -29,  -9, -43,   8,  26,  -7,
860
     30, -17,  -4,   3, -26, -35,   5, -24, -10, -28,
861
     -9,  12,   5,  33,   5,   8,   5, -29, -26, -24,
862
      9, -23, -14,  12, -39, -52,   5,  18,  39,  24,
863
    }, {
864
    -37,  -3,   0,  10,  -7, -22, -48,  12,  -8, -36,
865
     12,  -9, -12,  22, -12, -19,  -6, -28,   0, -29,
866
    -18,  -3,  11,  17, -10,  18, -10,   7, -27, -18,
867
    -11,  -7,   3,  28, -47, -55, -18,  15,  34,  16,
868
    }, {
869
     -8, -17, -10, -40, -13, -34, -47,   0,   5,  -4,
870
     16,  21,   8,  -2, -42, -43,  10, -26, -10,  -2,
871
     31,  11,  27,  19, -21,  10,  12, -20,   3, -11,
872
     25, -20, -25, -25, -29, -28,  28,  34,  25,  38,
873
    }, {
874
    -77,   2,  11,  -1,   7, -47, -52,   5, -29, -33,
875
     -1,  28,   0,  15, -28, -26,  -2, -30,   0,  -2,
876
     22,  -4,  33,   3, -36,  21,  -3,  15,   2,  -5,
877
      4,  -4,  -6,  -9, -37, -31,   5,  32,  20,  30,
878
    }, {
879
     81, -25, -14,  -8, -61,   0, -25,  28,  54,  20,
880
     -3, -14,  17,  -8,   0, -44,  16,  35,  13,  18,
881
    -43,  -7,   6,  11,  33,  -4,  30,  11, -22, -40,
882
      6, -43,   3,  50, -14, -18,  22,  18,  -1, -16,
883
    }, {
884
     12,  -4,   8,  29, -39, -12, -30,  33,  19,  -8,
885
    -21,  -6,   8,   9,  13, -28,   4,  31,  24,  18,
886
    -52, -23,  12,  -4,  18,   5,  14,  47, -24, -34,
887
    -14, -27,  22,  66, -22, -22,  -1,  16,  -6, -24,
888
    }, {
889
     41, -18,  -2, -21, -45, -24, -30,  21,  33,  24,
890
    -17,  24,  29, -15, -16, -51,  21,  33,  13,  45,
891
     -3,  -8,  28,  -2,   7,  -2,  37,  19,   7, -27,
892
     22, -39,  -7,  12,  -5,   5,  45,  35, -15,  -1,
893
    }, {
894
    -27,   1,  20,  17, -24, -38, -35,  26,  -1,  -4,
895
    -35,  32,  21,   3,  -2, -35,   8,  29,  24,  44,
896
    -12, -24,  34, -18,  -8,   7,  21,  55,   5, -21,
897
      2, -23,  11,  28, -13,   1,  22,  33, -21, -10,
898
    }, {
899
     36, -13,  -5,  -7, -40, -51, -28,  36,  52,  27,
900
     18, -36,   2, -22,   0, -33,  21,   2,  -3, -13,
901
    -26,  11,  14,   4,  10, -10,  18, -14, -22, -36,
902
     24, -21,   1,  28, -40, -42,  42,   5,  25,   5,
903
    }, {
904
    -32,   6,  17,  31, -19, -65, -33,  41,  16,  -1,
905
      0, -29,  -6,  -4,  13, -17,   9,  -1,   8, -14,
906
    -35,  -3,  19, -11,  -4,   0,   1,  21, -23, -30,
907
      3,  -5,  20,  44, -48, -46,  19,   3,  20,  -3,
908
    }, {
909
     -3,  -7,   6, -20, -25, -77, -32,  29,  31,  30,
910
      4,   2,  14, -29, -16, -40,  26,   0,  -3,  12,
911
     13,  10,  36,  -9, -15,  -8,  24,  -6,   7, -22,
912
     40, -17,  -8,  -9, -31, -18,  66,  22,  11,  19,
913
    }, {
914
    -72,  13,  29,  18,  -4, -90, -37,  34,  -4,   1,
915
    -13,   9,   6, -11,  -2, -24,  13,  -3,   7,  11,
916
      4,  -4,  42, -25, -31,   1,   8,  29,   6, -17,
917
     19,  -2,  10,   6, -38, -22,  42,  19,   6,  11,
918
    }, {
919
    116, -20, -68, -30, -28,  83,  28, -18,  32, -22,
920
    -13, -21,   5,  28,   5,  -7, -24,  -8, -22,  17,
921
    -23,  30, -25,  45,  15,  -9, -11, -18,  22, -10,
922
      4,  -2,  19, -12,  23,   3, -43,   2,  12,  -4,
923
    }, {
924
     47,   0, -45,   7,  -7,  69,  23, -13,  -2, -51,
925
    -32, -14,  -3,  47,  19,   8, -37, -11, -10,  16,
926
    -32,  15, -19,  29,   0,   1, -28,  18,  20,  -4,
927
    -16,  13,  38,   3,  15,   0, -66,   0,   7, -13,
928
    }, {
929
     77, -13, -56, -43, -13,  57,  23, -26,  11, -19,
930
    -27,  16,  17,  22, -10, -15, -19, -10, -22,  43,
931
     16,  30,  -2,  31, -11,  -6,  -5,  -9,  52,   2,
932
     20,   0,   8, -50,  33,  27, -19,  19,  -1,   9,
933
    }, {
934
      8,   6, -33,  -4,   7,  44,  18, -21, -23, -48,
935
    -46,  24,   9,  40,   3,   1, -32, -13, -11,  43,
936
      7,  14,   3,  15, -26,   3, -21,  26,  50,   8,
937
      0,  16,  27, -34,  25,  23, -43,  17,  -6,   1,
938
    }, {
939
     71,  -9, -59, -29,  -8,  30,  26, -11,  30, -16,
940
      8, -44,  -9,  14,   5,   2, -19, -40, -38, -15,
941
     -7,  50, -17,  38,  -7, -14, -24, -43,  22,  -6,
942
     22,  19,  17, -34,  -2, -20, -23, -10,  39,  16,
943
    }, {
944
      2,  11, -36,   9,  13,  17,  21,  -6,  -5, -45,
945
    -10, -36, -18,  33,  19,  19, -31, -44, -27, -15,
946
    -16,  34, -11,  22, -22,  -4, -40,  -7,  21,   0,
947
      1,  35,  36, -18, -10, -24, -46, -12,  34,   8,
948
    }, {
949
     32,  -2, -47, -42,   7,   5,  21, -18,   9, -12,
950
     -5,  -5,   2,   8, -10,  -4, -14, -42, -38,  10,
951
     33,  49,   5,  24, -33, -12, -17, -35,  52,   6,
952
     38,  22,   7, -72,   7,   3,   0,   6,  25,  30,
953
    }, {
954
    -36,  18, -24,  -3,  28,  -7,  16, -13, -26, -41,
955
    -24,   1,  -5,  26,   3,  12, -27, -46, -27,  10,
956
     24,  34,  10,   8, -49,  -2, -34,   0,  51,  12,
957
     17,  38,  25, -56,   0,   0, -22,   3,  20,  22,
958
    }, {
959
    121,  -9, -50, -10, -40,  40,  43,   9,  58,  12,
960
    -25, -41,  11,   2,  31,  -5,  -8,  19, -15,  32,
961
    -41,  30, -16,  16,  20, -28,   0,  -3,  26, -22,
962
     19,   0,  36,   4,  22,  12,  -6,  -9,  -1, -24,
963
    }, {
964
     52,  10, -27,  27, -18,  26,  38,  14,  23, -16,
965
    -44, -33,   3,  20,  45,  10, -20,  15,  -3,  31,
966
    -50,  14, -10,   0,   5, -17, -15,  32,  24, -16,
967
     -1,  15,  55,  20,  14,   8, -29, -12,  -7, -32,
968
    }, {
969
     82,  -3, -38, -23, -24,  15,  38,   2,  37,  15,
970
    -39,  -2,  23,  -4,  15, -12,  -3,  17, -15,  58,
971
     -1,  29,   6,   2,  -5, -26,   7,   4,  56,  -9,
972
     35,   3,  25, -33,  32,  36,  17,   7, -15,  -9,
973
    }, {
974
     13,  17, -15,  15,  -3,   1,  33,   7,   1, -12,
975
    -58,   5,  15,  13,  29,   3, -16,  13,  -4,  57,
976
    -10,  13,  11, -13, -21, -15,  -9,  40,  55,  -3,
977
     14,  19,  44, -17,  24,  32,  -5,   4, -21, -18,
978
    }, {
979
     76,   1, -41,  -9, -19, -12,  41,  17,  55,  18,
980
     -3, -63,  -3, -12,  30,   5,  -3, -12, -31,   0,
981
    -24,  49,  -8,   9,  -1, -33, -12, -29,  27, -18,
982
     37,  21,  34, -17,  -3, -11,  14, -23,  25,  -2,
983
    }, {
984
      7,  22, -18,  29,   1, -25,  36,  21,  20,  -9,
985
    -22, -56, -11,   6,  45,  21, -15, -16, -20,  -1,
986
    -33,  34,  -2,  -6, -17, -23, -28,   6,  25, -12,
987
     16,  37,  53,  -1, -11, -15,  -8, -25,  20, -11,
988
    }, {
989
     37,   8, -29, -22,  -4, -37,  36,   9,  34,  22,
990
    -17, -24,   8, -18,  15,  -2,   1, -14, -31,  25,
991
     15,  48,  13,  -4, -28, -31,  -5, -21,  57,  -4,
992
     53,  24,  23, -55,   6,  12,  37,  -6,  11,  11,
993
    }, {
994
    -31,  28,  -6,  16,  16, -50,  31,  14,   0,  -6,
995
    -36, -17,   0,   0,  29,  14, -11, -18, -20,  25,
996
      6,  33,  19, -20, -43, -21, -21,  14,  55,   0,
997
     32,  40,  42, -39,  -1,   8,  14,  -8,   6,   3,
998
    }, {
999
    119, -24, -39, -44, -51,  66, -14,  15,  31, -26,
1000
     -1,   0,   7,  16, -19, -28, -19,  22, -26,   4,
1001
    -13,  28, -16,  29,   5,  -1,  16, -16,   8, -35,
1002
    -10, -42,  -4,  17,  29, -19, -42,  -7,   0, -15,
1003
    }, {
1004
     50,  -3, -16,  -5, -30,  53, -19,  20,  -3, -55,
1005
    -19,   8,   0,  34,  -5, -11, -32,  18, -15,   4,
1006
    -22,  13, -10,  13,  -9,   8,   0,  19,   7, -29,
1007
    -31, -26,  13,  33,  21, -22, -65,  -9,  -4, -23,
1008
    }, {
1009
     79, -17, -27, -56, -36,  41, -19,   8,  10, -22,
1010
    -15,  39,  20,   9, -35, -35, -15,  20, -26,  31,
1011
     26,  27,   6,  15, -20,   0,  23,  -8,  38, -22,
1012
      5, -38, -15, -20,  39,   4, -18,   9, -13,  -1,
1013
    }, {
1014
     10,   3,  -4, -18, -15,  27, -24,  13, -24, -51,
1015
    -34,  47,  12,  28, -21, -19, -27,  16, -15,  30,
1016
     17,  12,  12,   0, -36,  10,   7,  27,  37, -16,
1017
    -15, -22,   3,  -4,  31,   1, -42,   7, -18,  -9,
1018
    }, {
1019
     74, -12, -30, -42, -30,  14, -16,  23,  29, -19,
1020
     20, -21,  -7,   1, -19, -17, -14, -10, -43, -27,
1021
      3,  48,  -8,  22, -16,  -7,   4, -42,   9, -31,
1022
      6, -20,  -6,  -4,   3, -43, -22, -20,  28,   5,
1023
    }, {
1024
      5,   7,  -7,  -4,  -9,   0, -21,  28,  -6, -48,
1025
      2, -14, -15,  20,  -5,   0, -27, -14, -32, -28,
1026
     -5,  32,  -2,   6, -32,   3, -12,  -5,   8, -25,
1027
    -14,  -4,  12,  11,  -4, -47, -45, -22,  22,  -2,
1028
    }, {
1029
     34,  -6, -18, -55, -15, -11, -21,  16,   8, -16,
1030
      6,  16,   5,  -4, -35, -24, -10, -12, -43,  -1,
1031
     43,  47,  14,   8, -43,  -5,  10, -34,  39, -18,
1032
     22, -16, -17, -42,  13, -19,   1,  -3,  14,  20,
1033
    }, {
1034
    -34,  14,   4, -17,   5, -24, -26,  20, -27, -45,
1035
    -12,  24,  -2,  13, -21,  -8, -22, -16, -32,  -2,
1036
     34,  31,  20,  -7, -58,   5,  -5,   2,  38, -12,
1037
      2,  -1,   1, -26,   5, -23, -21,  -6,   8,  11,
1038
    }, {
1039
    124, -13, -21, -23, -62,  23,   0,  43,  57,   8,
1040
    -13, -18,  14, -10,   6, -26,  -3,  49, -19,  19,
1041
    -31,  27,  -7,   0,  11, -20,  29,  -1,  12, -47,
1042
      4, -39,  11,  34,  28,  -9,  -5, -19, -13, -34,
1043
    }, {
1044
     55,   6,   1,  14, -41,  10,  -4,  48,  22, -20,
1045
    -31, -10,   5,   7,  20,  -9, -16,  45,  -8,  19,
1046
    -40,  12,  -1, -15,  -4, -10,  12,  34,  11, -41,
1047
    -16, -24,  30,  49,  20, -13, -28, -22, -18, -43,
1048
    }, {
1049
     84,  -6,  -9, -36, -47,  -1,  -4,  36,  36,  12,
1050
    -27,  20,  26, -17,  -9, -33,   1,  47, -19,  46,
1051
      9,  27,  15, -13, -15, -18,  35,   6,  42, -33,
1052
     20, -36,   1,  -4,  38,  14,  18,  -2, -27, -20,
1053
    }, {
1054
     15,  13,  13,   1, -26, -14,  -9,  41,   1, -16,
1055
    -46,  27,  18,   1,   4, -16, -11,  43,  -8,  45,
1056
      0,  11,  21, -29, -30,  -8,  19,  42,  41, -28,
1057
      0, -20,  20,  11,  30,  10,  -4,  -5, -32, -28,
1058
    }, {
1059
     79,  -2, -12, -22, -42, -28,  -1,  51,  54,  15,
1060
      8, -41,   0, -24,   6, -15,   1,  17, -36, -12,
1061
    -14,  47,   0,  -6, -11, -26,  16, -27,  13, -43,
1062
     22, -18,  10,  12,   2, -34,  15, -33,  13, -13,
1063
    }, {
1064
     10,  18,  10,  15, -21, -41,  -6,  56,  19, -13,
1065
     -9, -33,  -9,  -6,  20,   1, -11,  13, -24, -13,
1066
    -23,  32,   6, -22, -26, -15,   0,   8,  12, -37,
1067
      1,  -2,  28,  27,  -5, -37,  -7, -35,   8, -21,
1068
    }, {
1069
     39,   4,   0, -35, -27, -53,  -6,  44,  33,  18,
1070
     -5,  -2,  11, -31,  -9, -22,   6,  15, -36,  13,
1071
     25,  46,  23, -20, -37, -24,  23, -19,  43, -29,
1072
     38, -14,   0, -26,  12, -10,  38, -16,   0,   0,
1073
    }, {
1074
    -29,  25,  22,   2,  -6, -67, -11,  49,  -1, -10,
1075
    -24,   5,   3, -13,   4,  -5,  -6,  11, -25,  12,
1076
     16,  31,  28, -36, -53, -13,   6,  16,  42, -24,
1077
     17,   1,  18, -10,   4, -13,  15, -18,  -5,  -7,
1078
    }, {
1079
     29, -25, -22,  -2,   6,  67,  11, -49,   1,  10,
1080
     24,  -5,  -3,  13,  -4,   5,   6, -11,  25, -12,
1081
    -16, -31, -28,  36,  53,  13,  -6, -16, -42,  24,
1082
    -17,  -1, -18,  10,  -4,  13, -15,  18,   5,   7,
1083
    }, {
1084
    -39,  -4,   0,  35,  27,  53,   6, -44, -33, -18,
1085
      5,   2, -11,  31,   9,  22,  -6, -15,  36, -13,
1086
    -25, -46, -23,  20,  37,  24, -23,  19, -43,  29,
1087
    -38,  14,   0,  26, -12,  10, -38,  16,   0,   0,
1088
    }, {
1089
    -10, -18, -10, -15,  21,  41,   6, -56, -19,  13,
1090
      9,  33,   9,   6, -20,  -1,  11, -13,  24,  13,
1091
     23, -32,  -6,  22,  26,  15,   0,  -8, -12,  37,
1092
     -1,   2, -28, -27,   5,  37,   7,  35,  -8,  21,
1093
    }, {
1094
    -79,   2,  12,  22,  42,  28,   1, -51, -54, -15,
1095
     -8,  41,   0,  24,  -6,  15,  -1, -17,  36,  12,
1096
     14, -47,   0,   6,  11,  26, -16,  27, -13,  43,
1097
    -22,  18, -10, -12,  -2,  34, -15,  33, -13,  13,
1098
    }, {
1099
    -15, -13, -13,  -1,  26,  14,   9, -41,  -1,  16,
1100
     46, -27, -18,  -1,  -4,  16,  11, -43,   8, -45,
1101
      0, -11, -21,  29,  30,   8, -19, -42, -41,  28,
1102
      0,  20, -20, -11, -30, -10,   4,   5,  32,  28,
1103
    }, {
1104
    -84,   6,   9,  36,  47,   1,   4, -36, -36, -12,
1105
     27, -20, -26,  17,   9,  33,  -1, -47,  19, -46,
1106
     -9, -27, -15,  13,  15,  18, -35,  -6, -42,  33,
1107
    -20,  36,  -1,   4, -38, -14, -18,   2,  27,  20,
1108
    }, {
1109
    -55,  -6,  -1, -14,  41, -10,   4, -48, -22,  20,
1110
     31,  10,  -5,  -7, -20,   9,  16, -45,   8, -19,
1111
     40, -12,   1,  15,   4,  10, -12, -34, -11,  41,
1112
     16,  24, -30, -49, -20,  13,  28,  22,  18,  43,
1113
    }, {
1114
   -124,  13,  21,  23,  62, -23,   0, -43, -57,  -8,
1115
     13,  18, -14,  10,  -6,  26,   3, -49,  19, -19,
1116
     31, -27,   7,   0, -11,  20, -29,   1, -12,  47,
1117
     -4,  39, -11, -34, -28,   9,   5,  19,  13,  34,
1118
    }, {
1119
     34, -14,  -4,  17,  -5,  24,  26, -20,  27,  45,
1120
     12, -24,   2, -13,  21,   8,  22,  16,  32,   2,
1121
    -34, -31, -20,   7,  58,  -5,   5,  -2, -38,  12,
1122
     -2,   1,  -1,  26,  -5,  23,  21,   6,  -8, -11,
1123
    }, {
1124
    -34,   6,  18,  55,  15,  11,  21, -16,  -8,  16,
1125
     -6, -16,  -5,   4,  35,  24,  10,  12,  43,   1,
1126
    -43, -47, -14,  -8,  43,   5, -10,  34, -39,  18,
1127
    -22,  16,  17,  42, -13,  19,  -1,   3, -14, -20,
1128
    }, {
1129
     -5,  -7,   7,   4,   9,   0,  21, -28,   6,  48,
1130
     -2,  14,  15, -20,   5,   0,  27,  14,  32,  28,
1131
      5, -32,   2,  -6,  32,  -3,  12,   5,  -8,  25,
1132
     14,   4, -12, -11,   4,  47,  45,  22, -22,   2,
1133
    }, {
1134
    -74,  12,  30,  42,  30, -14,  16, -23, -29,  19,
1135
    -20,  21,   7,  -1,  19,  17,  14,  10,  43,  27,
1136
     -3, -48,   8, -22,  16,   7,  -4,  42,  -9,  31,
1137
     -6,  20,   6,   4,  -3,  43,  22,  20, -28,  -5,
1138
    }, {
1139
    -10,  -3,   4,  18,  15, -27,  24, -13,  24,  51,
1140
     34, -47, -12, -28,  21,  19,  27, -16,  15, -30,
1141
    -17, -12, -12,   0,  36, -10,  -7, -27, -37,  16,
1142
     15,  22,  -3,   4, -31,  -1,  42,  -7,  18,   9,
1143
    }, {
1144
    -79,  17,  27,  56,  36, -41,  19,  -8, -10,  22,
1145
     15, -39, -20,  -9,  35,  35,  15, -20,  26, -31,
1146
    -26, -27,  -6, -15,  20,   0, -23,   8, -38,  22,
1147
     -5,  38,  15,  20, -39,  -4,  18,  -9,  13,   1,
1148
    }, {
1149
    -50,   3,  16,   5,  30, -53,  19, -20,   3,  55,
1150
     19,  -8,   0, -34,   5,  11,  32, -18,  15,  -4,
1151
     22, -13,  10, -13,   9,  -8,   0, -19,  -7,  29,
1152
     31,  26, -13, -33, -21,  22,  65,   9,   4,  23,
1153
    }, {
1154
   -119,  24,  39,  44,  51, -66,  14, -15, -31,  26,
1155
      1,   0,  -7, -16,  19,  28,  19, -22,  26,  -4,
1156
     13, -28,  16, -29,  -5,   1, -16,  16,  -8,  35,
1157
     10,  42,   4, -17, -29,  19,  42,   7,   0,  15,
1158
    }, {
1159
     31, -28,   6, -16, -16,  50, -31, -14,   0,   6,
1160
     36,  17,   0,   0, -29, -14,  11,  18,  20, -25,
1161
     -6, -33, -19,  20,  43,  21,  21, -14, -55,   0,
1162
    -32, -40, -42,  39,   1,  -8, -14,   8,  -6,  -3,
1163
    }, {
1164
    -37,  -8,  29,  22,   4,  37, -36,  -9, -34, -22,
1165
     17,  24,  -8,  18, -15,   2,  -1,  14,  31, -25,
1166
    -15, -48, -13,   4,  28,  31,   5,  21, -57,   4,
1167
    -53, -24, -23,  55,  -6, -12, -37,   6, -11, -11,
1168
    }, {
1169
     -7, -22,  18, -29,  -1,  25, -36, -21, -20,   9,
1170
     22,  56,  11,  -6, -45, -21,  15,  16,  20,   1,
1171
     33, -34,   2,   6,  17,  23,  28,  -6, -25,  12,
1172
    -16, -37, -53,   1,  11,  15,   8,  25, -20,  11,
1173
    }, {
1174
    -76,  -1,  41,   9,  19,  12, -41, -17, -55, -18,
1175
      3,  63,   3,  12, -30,  -5,   3,  12,  31,   0,
1176
     24, -49,   8,  -9,   1,  33,  12,  29, -27,  18,
1177
    -37, -21, -34,  17,   3,  11, -14,  23, -25,   2,
1178
    }, {
1179
    -13, -17,  15, -15,   3,  -1, -33,  -7,  -1,  12,
1180
     58,  -5, -15, -13, -29,  -3,  16, -13,   4, -57,
1181
     10, -13, -11,  13,  21,  15,   9, -40, -55,   3,
1182
    -14, -19, -44,  17, -24, -32,   5,  -4,  21,  18,
1183
    }, {
1184
    -82,   3,  38,  23,  24, -15, -38,  -2, -37, -15,
1185
     39,   2, -23,   4, -15,  12,   3, -17,  15, -58,
1186
      1, -29,  -6,  -2,   5,  26,  -7,  -4, -56,   9,
1187
    -35,  -3, -25,  33, -32, -36, -17,  -7,  15,   9,
1188
    }, {
1189
    -52, -10,  27, -27,  18, -26, -38, -14, -23,  16,
1190
     44,  33,  -3, -20, -45, -10,  20, -15,   3, -31,
1191
     50, -14,  10,   0,  -5,  17,  15, -32, -24,  16,
1192
      1, -15, -55, -20, -14,  -8,  29,  12,   7,  32,
1193
    }, {
1194
   -121,   9,  50,  10,  40, -40, -43,  -9, -58, -12,
1195
     25,  41, -11,  -2, -31,   5,   8, -19,  15, -32,
1196
     41, -30,  16, -16, -20,  28,   0,   3, -26,  22,
1197
    -19,   0, -36,  -4, -22, -12,   6,   9,   1,  24,
1198
    }, {
1199
     36, -18,  24,   3, -28,   7, -16,  13,  26,  41,
1200
     24,  -1,   5, -26,  -3, -12,  27,  46,  27, -10,
1201
    -24, -34, -10,  -8,  49,   2,  34,   0, -51, -12,
1202
    -17, -38, -25,  56,   0,   0,  22,  -3, -20, -22,
1203
    }, {
1204
    -32,   2,  47,  42,  -7,  -5, -21,  18,  -9,  12,
1205
      5,   5,  -2,  -8,  10,   4,  14,  42,  38, -10,
1206
    -33, -49,  -5, -24,  33,  12,  17,  35, -52,  -6,
1207
    -38, -22,  -7,  72,  -7,  -3,   0,  -6, -25, -30,
1208
    }, {
1209
     -2, -11,  36,  -9, -13, -17, -21,   6,   5,  45,
1210
     10,  36,  18, -33, -19, -19,  31,  44,  27,  15,
1211
     16, -34,  11, -22,  22,   4,  40,   7, -21,   0,
1212
     -1, -35, -36,  18,  10,  24,  46,  12, -34,  -8,
1213
    }, {
1214
    -71,   9,  59,  29,   8, -30, -26,  11, -30,  16,
1215
     -8,  44,   9, -14,  -5,  -2,  19,  40,  38,  15,
1216
      7, -50,  17, -38,   7,  14,  24,  43, -22,   6,
1217
    -22, -19, -17,  34,   2,  20,  23,  10, -39, -16,
1218
    }, {
1219
     -8,  -6,  33,   4,  -7, -44, -18,  21,  23,  48,
1220
     46, -24,  -9, -40,  -3,  -1,  32,  13,  11, -43,
1221
     -7, -14,  -3, -15,  26,  -3,  21, -26, -50,  -8,
1222
      0, -16, -27,  34, -25, -23,  43, -17,   6,  -1,
1223
    }, {
1224
    -77,  13,  56,  43,  13, -57, -23,  26, -11,  19,
1225
     27, -16, -17, -22,  10,  15,  19,  10,  22, -43,
1226
    -16, -30,   2, -31,  11,   6,   5,   9, -52,  -2,
1227
    -20,   0,  -8,  50, -33, -27,  19, -19,   1,  -9,
1228
    }, {
1229
    -47,   0,  45,  -7,   7, -69, -23,  13,   2,  51,
1230
     32,  14,   3, -47, -19,  -8,  37,  11,  10, -16,
1231
     32, -15,  19, -29,   0,  -1,  28, -18, -20,   4,
1232
     16, -13, -38,  -3, -15,   0,  66,   0,  -7,  13,
1233
    }, {
1234
   -116,  20,  68,  30,  28, -83, -28,  18, -32,  22,
1235
     13,  21,  -5, -28,  -5,   7,  24,   8,  22, -17,
1236
     23, -30,  25, -45, -15,   9,  11,  18, -22,  10,
1237
     -4,   2, -19,  12, -23,  -3,  43,  -2, -12,   4,
1238
    }, {
1239
     72, -13, -29, -18,   4,  90,  37, -34,   4,  -1,
1240
     13,  -9,  -6,  11,   2,  24, -13,   3,  -7, -11,
1241
     -4,   4, -42,  25,  31,  -1,  -8, -29,  -6,  17,
1242
    -19,   2, -10,  -6,  38,  22, -42, -19,  -6, -11,
1243
    }, {
1244
      3,   7,  -6,  20,  25,  77,  32, -29, -31, -30,
1245
     -4,  -2, -14,  29,  16,  40, -26,   0,   3, -12,
1246
    -13, -10, -36,   9,  15,   8, -24,   6,  -7,  22,
1247
    -40,  17,   8,   9,  31,  18, -66, -22, -11, -19,
1248
    }, {
1249
     32,  -6, -17, -31,  19,  65,  33, -41, -16,   1,
1250
      0,  29,   6,   4, -13,  17,  -9,   1,  -8,  14,
1251
     35,   3, -19,  11,   4,   0,  -1, -21,  23,  30,
1252
     -3,   5, -20, -44,  48,  46, -19,  -3, -20,   3,
1253
    }, {
1254
    -36,  13,   5,   7,  40,  51,  28, -36, -52, -27,
1255
    -18,  36,  -2,  22,   0,  33, -21,  -2,   3,  13,
1256
     26, -11, -14,  -4, -10,  10, -18,  14,  22,  36,
1257
    -24,  21,  -1, -28,  40,  42, -42,  -5, -25,  -5,
1258
    }, {
1259
     27,  -1, -20, -17,  24,  38,  35, -26,   1,   4,
1260
     35, -32, -21,  -3,   2,  35,  -8, -29, -24, -44,
1261
     12,  24, -34,  18,   8,  -7, -21, -55,  -5,  21,
1262
     -2,  23, -11, -28,  13,  -1, -22, -33,  21,  10,
1263
    }, {
1264
    -41,  18,   2,  21,  45,  24,  30, -21, -33, -24,
1265
     17, -24, -29,  15,  16,  51, -21, -33, -13, -45,
1266
      3,   8, -28,   2,  -7,   2, -37, -19,  -7,  27,
1267
    -22,  39,   7, -12,   5,  -5, -45, -35,  15,   1,
1268
    }, {
1269
    -12,   4,  -8, -29,  39,  12,  30, -33, -19,   8,
1270
     21,   6,  -8,  -9, -13,  28,  -4, -31, -24, -18,
1271
     52,  23, -12,   4, -18,  -5, -14, -47,  24,  34,
1272
     14,  27, -22, -66,  22,  22,   1, -16,   6,  24,
1273
    }, {
1274
    -81,  25,  14,   8,  61,   0,  25, -28, -54, -20,
1275
      3,  14, -17,   8,   0,  44, -16, -35, -13, -18,
1276
     43,   7,  -6, -11, -33,   4, -30, -11,  22,  40,
1277
     -6,  43,  -3, -50,  14,  18, -22, -18,   1,  16,
1278
    }, {
1279
     77,  -2, -11,   1,  -7,  47,  52,  -5,  29,  33,
1280
      1, -28,   0, -15,  28,  26,   2,  30,   0,   2,
1281
    -22,   4, -33,  -3,  36, -21,   3, -15,  -2,   5,
1282
     -4,   4,   6,   9,  37,  31,  -5, -32, -20, -30,
1283
    }, {
1284
      8,  17,  10,  40,  13,  34,  47,   0,  -5,   4,
1285
    -16, -21,  -8,   2,  42,  43, -10,  26,  10,   2,
1286
    -31, -11, -27, -19,  21, -10, -12,  20,  -3,  11,
1287
    -25,  20,  25,  25,  29,  28, -28, -34, -25, -38,
1288
    }, {
1289
     37,   3,   0, -10,   7,  22,  48, -12,   8,  36,
1290
    -12,   9,  12, -22,  12,  19,   6,  28,   0,  29,
1291
     18,   3, -11, -17,  10, -18,  10,  -7,  27,  18,
1292
     11,   7,  -3, -28,  47,  55,  18, -15, -34, -16,
1293
    }, {
1294
    -31,  24,  23,  27,  29,   9,  43,  -8, -26,   7,
1295
    -30,  17,   4,  -3,  26,  35,  -5,  24,  10,  28,
1296
      9, -12,  -5, -33,  -5,  -8,  -5,  29,  26,  24,
1297
     -9,  23,  14, -12,  39,  52,  -5, -18, -39, -24,
1298
    }, {
1299
     32,   8,  -3,   2,  13,  -4,  50,   1,  27,  39,
1300
     23, -51, -15, -30,  27,  37,   7,  -1, -17, -29,
1301
     -5,  23, -25, -10,  14, -26,  -8, -41,  -1,   9,
1302
     13,  26,   5, -12,  12,   7,  14, -45,   6,  -9,
1303
    }, {
1304
    -36,  29,  19,  41,  34, -18,  45,   6,  -8,  10,
1305
      5, -43, -23, -11,  42,  53,  -5,  -5,  -6, -30,
1306
    -14,   8, -20, -26,  -1, -16, -25,  -4,  -3,  15,
1307
     -7,  41,  23,   3,   4,   3,  -8, -48,   1, -17,
1308
    }, {
1309
     -7,  15,   9,  -9,  28, -29,  45,  -5,   6,  43,
1310
      9, -12,  -2, -36,  12,  30,  11,  -3, -17,  -3,
1311
     34,  22,  -3, -24, -12, -24,  -2, -32,  28,  22,
1312
     29,  29,  -5, -50,  21,  31,  38, -29,  -7,   5,
1313
    }, {
1314
    -76,  35,  31,  28,  49, -43,  40,   0, -29,  14,
1315
     -8,  -5, -10, -18,  26,  46,   0,  -7,  -6,  -3,
1316
     25,   7,   2, -40, -28, -14, -18,   3,  27,  28,
1317
      8,  45,  13, -34,  13,  27,  15, -31, -12,  -3,
1318
    }, {
1319
     74, -17,   0, -31, -18,  73,  -5,   0,   3,  -5,
1320
     25,  12,  -3,  -1, -22,   3,  -9,  33, -12, -24,
1321
      6,   2, -33,   9,  21,   5,  20, -27, -19,  -7,
1322
    -34, -37, -34,  22,  44,   0, -41, -29, -17, -21,
1323
    }, {
1324
      5,   3,  21,   7,   2,  60, -10,   5, -32, -34,
1325
      7,  20, -11,  16,  -8,  20, -21,  29,  -1, -24,
1326
     -2, -13, -27,  -6,   5,  15,   3,   8, -21,  -1,
1327
    -55, -21, -15,  38,  37,  -3, -65, -32, -23, -30,
1328
    }, {
1329
     35, -10,  11, -44,  -3,  48, -10,  -6, -17,  -2,
1330
     11,  51,   8,  -8, -38,  -3,  -4,  31, -12,   2,
1331
     46,   1, -10,  -4,  -5,   7,  26, -19,  10,   5,
1332
    -18, -34, -45, -15,  54,  24, -18, -13, -31,  -7,
1333
    }, {
1334
    -33,  10,  34,  -5,  17,  35, -15,  -1, -53, -30,
1335
     -6,  59,   0,  10, -24,  13, -17,  27,  -1,   1,
1336
     37, -13,  -4, -20, -20,  18,  10,  16,   8,  11,
1337
    -39, -18, -26,   0,  46,  20, -41, -15, -37, -15,
1338
    }, {
1339
     29,  -5,   7, -30,   1,  21,  -7,   7,   0,   0,
1340
     47,  -9, -18, -15, -22,  14,  -4,   0, -28, -57,
1341
     23,  21, -25,   2,  -1,   0,   7, -53, -19,  -3,
1342
    -17, -15, -36,   0,  19, -24, -21, -43,   9,   0,
1343
    }, {
1344
    -39,  14,  30,   8,  22,   8, -12,  12, -34, -27,
1345
     29,  -2, -26,   2,  -8,  31, -16,  -3, -17, -57,
1346
     14,   6, -19, -13, -16,  10,  -8, -17, -20,   2,
1347
    -38,   0, -17,  16,  11, -27, -44, -45,   4,  -8,
1348
    }, {
1349
     -9,   1,  20, -43,  17,  -3, -12,   0, -20,   4,
1350
     33,  29,  -6, -22, -38,   7,   0,  -1, -29, -30,
1351
     63,  21,  -3, -11, -27,   1,  14, -45,  10,   9,
1352
     -1, -12, -47, -37,  28,   0,   2, -26,  -4,  13,
1353
    }, {
1354
    -78,  21,  43,  -4,  38, -17, -17,   5, -55, -24,
1355
     15,  36, -14,  -4, -24,  24, -12,  -5, -17, -31,
1356
     54,   5,   2, -27, -43,  12,  -2,  -9,   9,  15,
1357
    -22,   3, -28, -21,  20,  -3, -20, -28,  -9,   5,
1358
    }, {
1359
     80,  -6,  16, -11, -30,  30,   9,  28,  28,  29,
1360
     13,  -6,   2, -28,   3,   5,   7,  60,  -5,  -9,
1361
    -11,   1, -24, -19,  27, -13,  32, -13, -15, -19,
1362
    -19, -35, -17,  39,  43,   9,  -4, -42, -32, -41,
1363
    }, {
1364
     11,  14,  39,  27,  -9,  17,   4,  33,  -6,   0,
1365
     -4,   1,  -5, -10,  17,  22,  -5,  57,   5,  -9,
1366
    -20, -13, -18, -35,  11,  -3,  16,  22, -17, -13,
1367
    -40, -19,   1,  55,  35,   5, -27, -44, -37, -49,
1368
    }, {
1369
     40,   0,  28, -24, -14,   5,   4,  21,   7,  33,
1370
      0,  32,  15, -35, -12,  -1,  11,  58,  -5,  16,
1371
     28,   0,  -1, -33,   0, -11,  39,  -5,  14,  -6,
1372
     -3, -31, -28,   1,  53,  33,  19, -25, -46, -26,
1373
    }, {
1374
    -28,  20,  51,  14,   6,  -7,   0,  26, -27,   4,
1375
    -18,  40,   6, -16,   1,  15,   0,  55,   5,  16,
1376
     19, -14,   3, -49, -14,  -1,  22,  30,  12,   0,
1377
    -24, -15,  -9,  17,  45,  29,  -4, -28, -51, -35,
1378
    }, {
1379
     34,   4,  25, -10,  -9, -21,   7,  36,  26,  36,
1380
     35, -28, -12, -42,   3,  16,  12,  28, -21, -42,
1381
      5,  21, -16, -26,   4, -19,  19, -39, -15, -15,
1382
     -1, -13, -19,  17,  17, -14,  15, -55,  -4, -19,
1383
    }, {
1384
    -34,  25,  48,  28,  11, -34,   2,  41,  -9,   7,
1385
     17, -21, -20, -24,  17,  33,   0,  24, -10, -42,
1386
     -3,   5, -10, -42, -11,  -8,   3,  -3, -16,  -9,
1387
    -22,   2,   0,  33,  10, -18,  -7, -58, -10, -28,
1388
    }, {
1389
     -4,  11,  37, -23,   5, -46,   2,  29,   5,  39,
1390
     21,   9,   0, -49, -12,   9,  16,  26, -22, -15,
1391
     45,  20,   5, -40, -22, -17,  26, -31,  14,  -2,
1392
     14, -10, -30, -20,  27,   9,  39, -39, -18,  -5,
1393
    }, {
1394
    -73,  32,  60,  15,  26, -59,  -2,  33, -30,  10,
1395
      3,  17,  -8, -30,   1,  26,   4,  22, -10, -16,
1396
     36,   5,  11, -56, -37,  -6,  10,   5,  13,   3,
1397
     -6,   5, -11,  -4,  19,   5,  16, -41, -24, -13
1398
    }
1399
};
1400

    
1401
const uint16_t ff_cb1_base[128]={
1402
    19657, 18474, 18365, 17520, 21048, 18231, 18584, 16671,
1403
    20363, 19069, 19409, 18430, 21844, 18753, 19613, 17411,
1404
    20389, 21772, 20129, 21702, 20978, 20472, 19627, 19387,
1405
    21477, 23134, 21841, 23919, 22089, 21519, 21134, 20852,
1406
    19675, 17821, 19044, 17477, 19986, 16955, 18446, 16086,
1407
    21138, 18899, 20952, 18929, 21452, 17833, 20104, 17159,
1408
    19770, 20056, 20336, 20866, 19329, 18217, 18908, 18004,
1409
    21556, 21948, 23079, 23889, 20922, 19544, 20984, 19781,
1410
    19781, 20984, 19544, 20922, 23889, 23079, 21948, 21556,
1411
    18004, 18908, 18217, 19329, 20866, 20336, 20056, 19770,
1412
    17159, 20104, 17833, 21452, 18929, 20952, 18899, 21138,
1413
    16086, 18446, 16955, 19986, 17477, 19044, 17821, 19675,
1414
    20852, 21134, 21519, 22089, 23919, 21841, 23134, 21477,
1415
    19387, 19627, 20472, 20978, 21702, 20129, 21772, 20389,
1416
    17411, 19613, 18753, 21844, 18430, 19409, 19069, 20363,
1417
    16671, 18584, 18231, 21048, 17520, 18365, 18474, 19657,
1418
};
1419

    
1420
const uint16_t ff_cb2_base[128]={
1421
    12174, 13380, 13879, 13832, 13170, 13227, 13204, 12053,
1422
    12410, 13988, 14348, 14631, 13100, 13415, 13224, 12268,
1423
    11982, 13825, 13499, 14210, 13877, 14788, 13811, 13109,
1424
    11449, 13275, 12833, 13717, 12728, 13696, 12759, 12405,
1425
    10230, 12185, 11628, 13161, 11762, 13458, 12312, 12818,
1426
    10443, 12773, 12011, 14020, 11818, 13825, 12453, 13226,
1427
    10446, 13162, 11881, 14300, 12859, 16288, 13490, 15053,
1428
    10155, 12820, 11519, 13973, 12041, 15081, 12635, 14198,
1429
    14198, 12635, 15081, 12041, 13973, 11519, 12820, 10155,
1430
    15053, 13490, 16288, 12859, 14300, 11881, 13162, 10446,
1431
    13226, 12453, 13825, 11818, 14020, 12011, 12773, 10443,
1432
    12818, 12312, 13458, 11762, 13161, 11628, 12185, 10230,
1433
    12405, 12759, 13696, 12728, 13717, 12833, 13275, 11449,
1434
    13109, 13811, 14788, 13877, 14210, 13499, 13825, 11982,
1435
    12268, 13224, 13415, 13100, 14631, 14348, 13988, 12410,
1436
    12053, 13204, 13227, 13170, 13832, 13879, 13380, 12174,
1437
};
1438

    
1439
const int16_t ff_energy_tab[32]={
1440
        0,    16,    20,    25,    32,    41,    51,    65,
1441
       81,   103,   129,   163,   205,   259,   326,   410,
1442
      516,   650,   819,  1031,  1298,  1634,  2057,  2590,
1443
     3261,  4105,  5168,  6507,  8192, 10313, 12983, 16345
1444
};
1445

    
1446
static const int16_t lpc_refl_cb1[64]={
1447
    -4041, -4018, -3998, -3977, -3954, -3930, -3906, -3879,
1448
    -3852, -3825, -3795, -3764, -3731, -3699, -3666, -3631,
1449
    -3594, -3555, -3513, -3468, -3420, -3372, -3321, -3268,
1450
    -3212, -3153, -3090, -3021, -2944, -2863, -2772, -2676,
1451
    -2565, -2445, -2328, -2202, -2072, -1941, -1808, -1660,
1452
    -1508, -1348, -1185,  -994,  -798,  -600,  -374,  -110,
1453
      152,   447,   720,   982,  1229,  1456,  1682,  1916,
1454
     2130,  2353,  2595,  2853,  3118,  3363,  3588,  3814
1455
};
1456

    
1457
static const int16_t lpc_refl_cb2[32]={
1458
    -3091, -2386, -1871, -1425, -1021,  -649,  -316,   -20,
1459
      267,   544,   810,  1065,  1305,  1534,  1756,  1970,
1460
     2171,  2359,  2536,  2700,  2854,  2996,  3133,  3263,
1461
     3386,  3499,  3603,  3701,  3789,  3870,  3947,  4020
1462
};
1463

    
1464
static const int16_t lpc_refl_cb3[32]={
1465
    -3525, -3295, -3081, -2890, -2696, -2511, -2328, -2149,
1466
    -1979, -1817, -1658, -1498, -1341, -1188, -1032,  -876,
1467
     -721,  -561,  -394,  -228,   -54,   119,   296,   484,
1468
      683,   895,  1123,  1373,  1651,  1965,  2360,  2854
1469
};
1470

    
1471
static const int16_t lpc_refl_cb4[16]={
1472
    -1845, -1057,  -522,   -77,   301,   647,   975,  1285,
1473
     1582,  1873,  2163,  2452,  2735,  3017,  3299,  3569
1474
};
1475

    
1476
static const int16_t lpc_refl_cb5[16]={
1477
    -2691, -2187, -1788, -1435, -1118,  -837,  -571,  -316,
1478
      -59,   201,   470,   759,  1077,  1457,  1908,  2495
1479
};
1480

    
1481
static const int16_t lpc_refl_cb6[8]={
1482
    -1372,  -474,   133,   632,  1100,  1571,  2075,  2672
1483
};
1484

    
1485
static const int16_t lpc_refl_cb7[8]={
1486
    -2389, -1787, -1231,  -717,  -239,   234,   770,  1474
1487
};
1488

    
1489
static const int16_t lpc_refl_cb8[8]={
1490
    -1569,  -864,  -296,   200,   670,  1151,  1709,  2385
1491
};
1492

    
1493
static const int16_t lpc_refl_cb9[8]={
1494
    -2200, -1608, -1062,  -569,  -120,   338,   863,  1621
1495
};
1496

    
1497
static const int16_t lpc_refl_cb10[4]={
1498
     -617,   190,   802,  1483
1499
};
1500

    
1501
const int16_t * const ff_lpc_refl_cb[10]={
1502
    lpc_refl_cb1, lpc_refl_cb2, lpc_refl_cb3, lpc_refl_cb4, lpc_refl_cb5,
1503
    lpc_refl_cb6, lpc_refl_cb7, lpc_refl_cb8, lpc_refl_cb9, lpc_refl_cb10
1504
};
1505

    
1506
static void ff_add_wav(int16_t *dest, int n, int skip_first, int *m, const int16_t *s1,
1507
                       const int8_t *s2, const int8_t *s3)
1508
{
1509
    int i;
1510
    int v[3];
1511

    
1512
    v[0] = 0;
1513
    for (i=!skip_first; i<3; i++)
1514
        v[i] = (ff_gain_val_tab[n][i] * m[i]) >> ff_gain_exp_tab[n];
1515

    
1516
    if (v[0]) {
1517
        for (i=0; i < BLOCKSIZE; i++)
1518
            dest[i] = (s1[i]*v[0] + s2[i]*v[1] + s3[i]*v[2]) >> 12;
1519
    } else {
1520
        for (i=0; i < BLOCKSIZE; i++)
1521
            dest[i] = (             s2[i]*v[1] + s3[i]*v[2]) >> 12;
1522
    }
1523
}
1524

    
1525
/**
1526
 * Copy the last offset values of *source to *target. If those values are not
1527
 * enough to fill the target buffer, fill it with another copy of those values.
1528
 */
1529
void ff_copy_and_dup(int16_t *target, const int16_t *source, int offset)
1530
{
1531
    source += BUFFERSIZE - offset;
1532

    
1533
    memcpy(target, source, FFMIN(BLOCKSIZE, offset)*sizeof(*target));
1534
    if (offset < BLOCKSIZE)
1535
        memcpy(target + offset, source, (BLOCKSIZE - offset)*sizeof(*target));
1536
}
1537

    
1538
/**
1539
 * Evaluate the reflection coefficients from the filter coefficients.
1540
 *
1541
 * @return 1 if one of the reflection coefficients is greater than
1542
 *         4095, 0 if not.
1543
 */
1544
int ff_eval_refl(int *refl, const int16_t *coefs, AVCodecContext *avctx)
1545
{
1546
    int b, i, j;
1547
    int buffer1[10];
1548
    int buffer2[10];
1549
    int *bp1 = buffer1;
1550
    int *bp2 = buffer2;
1551

    
1552
    for (i=0; i < 10; i++)
1553
        buffer2[i] = coefs[i];
1554

    
1555
    refl[9] = bp2[9];
1556

    
1557
    if ((unsigned) bp2[9] + 0x1000 > 0x1fff) {
1558
        av_log(avctx, AV_LOG_ERROR, "Overflow. Broken sample?\n");
1559
        return 1;
1560
    }
1561

    
1562
    for (i=8; i >= 0; i--) {
1563
        b = 0x1000-((bp2[i+1] * bp2[i+1]) >> 12);
1564

    
1565
        if (!b)
1566
            b = -2;
1567

    
1568
        for (j=0; j <= i; j++)
1569
            bp1[j] = ((bp2[j] - ((refl[i+1] * bp2[i-j]) >> 12)) * (0x1000000 / b)) >> 12;
1570

    
1571
        if ((unsigned) bp1[i] + 0x1000 > 0x1fff)
1572
            return 1;
1573

    
1574
        refl[i] = bp1[i];
1575

    
1576
        FFSWAP(int *, bp1, bp2);
1577
    }
1578
    return 0;
1579
}
1580

    
1581
/**
1582
 * Evaluate the LPC filter coefficients from the reflection coefficients.
1583
 * Does the inverse of the ff_eval_refl() function.
1584
 */
1585
void ff_eval_coefs(int *coefs, const int *refl)
1586
{
1587
    int buffer[10];
1588
    int *b1 = buffer;
1589
    int *b2 = coefs;
1590
    int i, j;
1591

    
1592
    for (i=0; i < 10; i++) {
1593
        b1[i] = refl[i] << 4;
1594

    
1595
        for (j=0; j < i; j++)
1596
            b1[j] = ((refl[i] * b2[i-j-1]) >> 12) + b2[j];
1597

    
1598
        FFSWAP(int *, b1, b2);
1599
    }
1600

    
1601
    for (i=0; i < 10; i++)
1602
        coefs[i] >>= 4;
1603
}
1604

    
1605
void ff_int_to_int16(int16_t *out, const int *inp)
1606
{
1607
    int i;
1608

    
1609
    for (i=0; i < 10; i++)
1610
        *out++ = *inp++;
1611
}
1612

    
1613
/**
1614
 * Evaluate sqrt(x << 24). x must fit in 20 bits. This value is evaluated in an
1615
 * odd way to make the output identical to the binary decoder.
1616
 */
1617
int ff_t_sqrt(unsigned int x)
1618
{
1619
    int s = 2;
1620
    while (x > 0xfff) {
1621
        s++;
1622
        x >>= 2;
1623
    }
1624

    
1625
    return ff_sqrt(x << 20) << s;
1626
}
1627

    
1628
unsigned int ff_rms(const int *data)
1629
{
1630
    int i;
1631
    unsigned int res = 0x10000;
1632
    int b = 10;
1633

    
1634
    for (i=0; i < 10; i++) {
1635
        res = (((0x1000000 - data[i]*data[i]) >> 12) * res) >> 12;
1636

    
1637
        if (res == 0)
1638
            return 0;
1639

    
1640
        while (res <= 0x3fff) {
1641
            b++;
1642
            res <<= 2;
1643
        }
1644
    }
1645

    
1646
    return ff_t_sqrt(res) >> b;
1647
}
1648

    
1649
int ff_interp(RA144Context *ractx, int16_t *out, int a, int copyold, int energy)
1650
{
1651
    int work[10];
1652
    int b = NBLOCKS - a;
1653
    int i;
1654

    
1655
    // Interpolate block coefficients from the this frame's forth block and
1656
    // last frame's forth block.
1657
    for (i=0; i<10; i++)
1658
        out[i] = (a * ractx->lpc_coef[0][i] + b * ractx->lpc_coef[1][i])>> 2;
1659

    
1660
    if (ff_eval_refl(work, out, ractx->avctx)) {
1661
        // The interpolated coefficients are unstable, copy either new or old
1662
        // coefficients.
1663
        ff_int_to_int16(out, ractx->lpc_coef[copyold]);
1664
        return ff_rescale_rms(ractx->lpc_refl_rms[copyold], energy);
1665
    } else {
1666
        return ff_rescale_rms(ff_rms(work), energy);
1667
    }
1668
}
1669

    
1670
unsigned int ff_rescale_rms(unsigned int rms, unsigned int energy)
1671
{
1672
    return (rms * energy) >> 10;
1673
}
1674

    
1675
/** inverse root mean square */
1676
int ff_irms(const int16_t *data)
1677
{
1678
    unsigned int i, sum = 0;
1679

    
1680
    for (i=0; i < BLOCKSIZE; i++)
1681
        sum += data[i] * data[i];
1682

    
1683
    if (sum == 0)
1684
        return 0; /* OOPS - division by zero */
1685

    
1686
    return 0x20000000 / (ff_t_sqrt(sum) >> 8);
1687
}
1688

    
1689
void ff_subblock_synthesis(RA144Context *ractx, const uint16_t *lpc_coefs,
1690
                           int cba_idx, int cb1_idx, int cb2_idx,
1691
                           int gval, int gain)
1692
{
1693
    uint16_t buffer_a[40];
1694
    uint16_t *block;
1695
    int m[3];
1696

    
1697
    if (cba_idx) {
1698
        cba_idx += BLOCKSIZE/2 - 1;
1699
        ff_copy_and_dup(buffer_a, ractx->adapt_cb, cba_idx);
1700
        m[0] = (ff_irms(buffer_a) * gval) >> 12;
1701
    } else {
1702
        m[0] = 0;
1703
    }
1704
    m[1] = (ff_cb1_base[cb1_idx] * gval) >> 8;
1705
    m[2] = (ff_cb2_base[cb2_idx] * gval) >> 8;
1706
    memmove(ractx->adapt_cb, ractx->adapt_cb + BLOCKSIZE,
1707
            (BUFFERSIZE - BLOCKSIZE) * sizeof(*ractx->adapt_cb));
1708

    
1709
    block = ractx->adapt_cb + BUFFERSIZE - BLOCKSIZE;
1710

    
1711
    ff_add_wav(block, gain, cba_idx, m, cba_idx? buffer_a: NULL,
1712
               ff_cb1_vects[cb1_idx], ff_cb2_vects[cb2_idx]);
1713

    
1714
    memcpy(ractx->curr_sblock, ractx->curr_sblock + 40,
1715
           10*sizeof(*ractx->curr_sblock));
1716

    
1717
    if (ff_celp_lp_synthesis_filter(ractx->curr_sblock + 10, lpc_coefs,
1718
                                    block, BLOCKSIZE, 10, 1, 0xfff))
1719
        memset(ractx->curr_sblock, 0, 50*sizeof(*ractx->curr_sblock));
1720
}