GCC Code Coverage Report
Directory: ../../../ffmpeg/ Exec Total Coverage
File: src/libavcodec/ra144.c Lines: 95 100 95.0 %
Date: 2020-10-23 17:01:47 Branches: 48 52 92.3 %

Line Branch Exec Source
1
/*
2
 * Real Audio 1.0 (14.4K)
3
 * Copyright (c) 2003 The FFmpeg project
4
 *
5
 * This file is part of FFmpeg.
6
 *
7
 * FFmpeg 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
 * FFmpeg 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 FFmpeg; 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 "mathops.h"
26
#include "ra144.h"
27
28
const int16_t ff_gain_val_tab[256][3] = {
29
    { 541, 956,  768}, { 877, 581,  568}, { 675,1574,  635}, {1248,1464,  668},
30
    {1246, 839, 1394}, {2560,1386,  991}, { 925, 687,  608}, {2208, 797, 1144},
31
    { 535, 832,  799}, { 762, 605, 1154}, { 832,1122, 1003}, {1180, 687, 1176},
32
    {1292, 901,  732}, {1656, 689,  896}, {1750,1248,  848}, {2284, 942, 1022},
33
    { 824,1472,  643}, { 517, 765,  512}, { 562,1816, 1522}, { 694,1826, 2700},
34
    { 704, 524,  672}, {1442, 757, 2232}, { 884, 551, 1266}, {2232,1007, 1692},
35
    { 932, 746,  777}, {1132, 822,  926}, {1226, 771,  611}, {2948,1342, 1008},
36
    {1302, 594, 1158}, {1602, 636, 1128}, {3408, 910, 1438}, {1996, 614,  575},
37
    { 665, 935,  628}, { 631,1192,  829}, { 644, 926, 1052}, { 879, 988, 1226},
38
    { 941,2768, 2772}, { 565,1344, 2304}, { 547, 628,  740}, { 639, 532, 1074},
39
    { 955,1208,  598}, {1124,1160,  900}, {1206, 899, 1242}, { 746, 533,  624},
40
    {1458,1028,  735}, {1706,1102,  692}, {1898,1018, 1004}, {2176, 988,  735},
41
    {1578, 782, 1642}, { 897, 516,  754}, {2068, 702, 1656}, {2344, 818, 1526},
42
    { 907, 652,  592}, {1056, 652,  642}, {2124,1416,  780}, {2664,1250,  727},
43
    {1894, 727, 1108}, {2196, 657,  981}, {4840, 920, 1704}, {4992,1238,  983},
44
    {2420, 909, 1094}, {2760, 935, 1032}, {2800, 612,  853}, {3068, 832,  574},
45
    { 523,1796,  923}, { 722,1916, 1382}, {1226,1542,  928}, { 758, 757,  584},
46
    { 512,1134,  577}, { 615,1276,  698}, { 574,2568, 2356}, { 993,2728, 3512},
47
    { 539, 890,  913}, { 694, 928, 1088}, { 805, 600, 1360}, {2160, 951, 3128},
48
    { 816, 950,  590}, { 955, 847,  811}, {1094, 883,  556}, {1304, 888,  604},
49
    { 863,1170,  855}, {1023, 997, 1032}, { 932,1228, 1280}, { 627, 564,  573},
50
    { 876, 900, 1448}, {1030, 857, 1792}, {1294, 953, 1758}, {1612, 854, 1714},
51
    {1090,1166,  631}, {1314,1202,  751}, {1480, 905,  795}, {1682,1016,  568},
52
    {1494,1178,  983}, { 878, 613,  526}, {1728,1446,  779}, {2136,1348,  774},
53
    { 950, 649,  939}, {1180, 703,  899}, {1236, 527, 1158}, {1450, 647,  972},
54
    {1282, 647,  707}, {1460, 663,  644}, {1614, 572,  578}, {3516,1222,  821},
55
    {2668, 729, 1682}, {3128, 585, 1502}, {3208, 733,  976}, {6800, 871, 1416},
56
    {3480, 743, 1408}, {3764, 899, 1170}, {3772, 632,  875}, {4092, 732,  638},
57
    {3112, 753, 2620}, {3372, 945, 1890}, {3768, 969, 2288}, {2016, 559,  854},
58
    {1736, 729,  787}, {1940, 686,  547}, {2140, 635,  674}, {4480,1272,  828},
59
    {3976, 592, 1666}, {4384, 621, 1388}, {4400, 801,  955}, {4656, 522,  646},
60
    {4848, 625, 1636}, {4984, 591,  874}, {5352, 535, 1001}, {11216,938, 1184},
61
    { 925,3280, 1476}, { 735,1580, 1088}, {1150,1576,  674}, { 655, 783,  528},
62
    { 527,2052, 1354}, { 782,1704, 1880}, { 578, 910, 1026}, { 692, 882, 1468},
63
    { 586, 683,  715}, { 739, 609,  717}, { 778, 773,  697}, { 922, 785,  813},
64
    { 766, 651,  984}, { 978, 596, 1030}, {1070, 757, 1080}, {1324, 687, 1178},
65
    {1108,2144,  979}, { 723, 982,  690}, { 936, 956,  527}, {1180,1002,  547},
66
    { 517,1306,  825}, { 832,1184,  974}, {1024, 957,  903}, {1262,1090,  906},
67
    {1028, 720,  649}, {1192, 679,  694}, {2468,1480,  979}, {2844,1370,  877},
68
    {1310, 835,  848}, {1508, 839,  698}, {1742,1030,  769}, {1910, 852,  573},
69
    {1280, 859, 1174}, {1584, 863, 1108}, {1686, 708, 1364}, {1942, 768, 1104},
70
    { 891, 536,  690}, {1016, 560,  663}, {2172, 870, 1348}, {2404, 999, 1170},
71
    {1890, 966,  889}, {2116, 912,  777}, {2296,1020,  714}, {4872,1844,  932},
72
    {2392, 778,  929}, {2604, 772,  744}, {2764, 957,  722}, {5832,1532,  984},
73
    {2188, 519, 1264}, {2332, 532,  922}, {5064, 995, 2412}, {2708, 571,  874},
74
    {2408, 545,  666}, {5016,1084,  875}, {5376, 983, 1196}, {5536, 979,  730},
75
    {5344, 634, 1744}, {5688, 706, 1348}, {5912, 977, 1190}, {6072, 905,  763},
76
    {6048, 582, 1526}, {11968,1013,1816}, {12864,937, 1900}, {12560,1086, 998},
77
    {1998, 684, 1884}, {2504, 633, 1992}, {1252, 567,  835}, {1478, 571,  973},
78
    {2620, 769, 1414}, {2808, 952, 1142}, {2908, 712, 1028}, {2976, 686,  741},
79
    {1462, 552,  714}, {3296, 991, 1452}, {1590, 615,  544}, {3480,1150,  824},
80
    {3212, 832,  923}, {3276, 839,  531}, {3548, 786,  852}, {3732, 764,  570},
81
    {5728, 906, 2616}, {6272, 804, 2252}, {3096, 535,  876}, {3228, 598,  649},
82
    {6536, 759, 1436}, {6648, 993,  846}, {6864, 567, 1210},{14016,1012, 1302},
83
    {3408, 548, 1098}, {7160,1008, 1742}, {7136,1000, 1182}, {7480,1032,  836},
84
    {7448, 612, 1552}, {7744, 614,  816}, {8384, 777, 1438}, {8784, 694,  786},
85
    { 882,1508, 1068}, { 597, 837,  766}, {1270, 954, 1408}, { 803, 550,  798},
86
    {1398,1308,  798}, {1848,1534,  738}, { 970, 675,  608}, {1264, 706,  684},
87
    {1716, 767, 1126}, {2108, 765, 1404}, {2236, 924, 1003}, {2472,1048,  611},
88
    { 999, 942,  963}, {1094, 857,  935}, {2936, 926, 1138}, {1934, 746,  551},
89
    {3336, 633, 1762}, {3764, 701, 1454}, {1890, 564,  636}, {4096,1126,  793},
90
    {3936, 556, 1140}, {3936, 540,  740}, {4216, 764,  874}, {8480,1328, 1014},
91
    {2184, 515, 1042}, {4432, 934, 1344}, {4784, 945, 1112}, {5016,1062,  733},
92
    {9216,1020, 2028}, {9968, 924, 1188}, {5424, 909, 1206}, {6512, 744, 1086}
93
};
94
95
const uint8_t ff_gain_exp_tab[256] = {
96
   15, 15, 15, 15, 15, 16, 14, 15, 14, 14, 14, 14, 14, 14, 14, 14,
97
   14, 13, 14, 14, 13, 14, 13, 14, 13, 13, 13, 14, 13, 13, 14, 13,
98
   13, 13, 13, 13, 14, 13, 12, 12, 13, 13, 13, 12, 13, 13, 13, 13,
99
   13, 12, 13, 13, 12, 12, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13,
100
   13, 13, 13, 12, 12, 12, 13, 13, 12, 12, 12, 13, 12, 12, 12, 12,
101
   12, 12, 12, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12,
102
   12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 13, 13, 13, 13,
103
   13, 13, 13, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14,
104
   13, 12, 12, 11, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
105
   12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 11, 11, 11, 11,
106
   12, 12, 12, 12, 11, 11, 12, 12, 12, 12, 12, 13, 12, 12, 12, 13,
107
   12, 12, 13, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14,
108
   12, 12, 11, 11, 12, 12, 12, 12, 11, 12, 11, 12, 12, 12, 12, 12,
109
   13, 13, 12, 12, 13, 13, 13, 14, 12, 13, 13, 13, 13, 13, 13, 13,
110
   11, 10, 11, 10, 11, 11, 10, 10, 11, 11, 11, 11, 10,  9, 11, 10,
111
   12, 12, 11, 12, 12, 12, 12, 13, 11, 12, 12, 12, 13, 13, 12, 12
112
};
113
114
const int8_t ff_cb1_vects[128][40]={
115
    {
116
     38,  -4,  15,  -4,  14, -13,  12, -11,  -2,  -6,
117
     -6, -11, -45, -16, -11, -13,  -7,   6, -12,   4,
118
    -20,   3, -16,  12,  -1,  12,  46,  24,   0,  33,
119
     -3,   9, -12, -12,  -8,  -7,  17,  -6,   0,  -2,
120
    }, {
121
     60, -16,   3, -22,  10, -32,   0, -28, -17, -18,
122
     -3, -25, -37, -23, -10,   3,   2,   3,   0,   3,
123
    -14,   0, -14,  -1,   0,   2,  32,   9,  -1,  25,
124
      7,  13,  -5,  13,   8,   1,   2,   8, -10,   6,
125
    }, {
126
     27, -12,  28,  -2,   6,  -7,  15,   9, -11,   1,
127
    -13, -11, -40,   4, -29, -14, -19,  -5, -23,  -8,
128
    -30, -13, -17,   0, -14,  12,  34,  20,  -2,  25,
129
      2, -16,  -4, -12,  15,  16,  29,   7,  24,  10,
130
    }, {
131
     49, -24,  16, -20,   2, -26,   2,  -7, -25, -10,
132
    -11, -25, -32,  -3, -27,   2,  -8,  -8, -11,  -9,
133
    -24, -17, -16, -14, -13,   2,  20,   5,  -4,  17,
134
     14, -12,   3,  13,  33,  25,  14,  23,  15,  19,
135
    }, {
136
     46,  -6,  21,   8,  -2, -16,  -5,  -8, -11,   4,
137
      8,  15, -24,   4,  -2, -26,  -3, -16, -16, -14,
138
     -9,  -2,  -1,   4,  19,   7,  36,  17,   9,  13,
139
      0,  31,  -5, -12,   7,  -8,  11, -15, -13,  -4,
140
    }, {
141
     68, -18,   9,  -9,  -6, -35, -18, -25, -26,  -7,
142
     10,   1, -16,  -3,  -1,  -9,   6, -19,  -4, -15,
143
     -4,  -6,   0,  -8,  20,  -2,  23,   2,   7,   5,
144
     12,  35,   1,  13,  24,   0,  -3,   0, -22,   4,
145
    }, {
146
     35, -14,  34,  10, -10, -10,  -1,  12, -20,  12,
147
      0,  15, -18,  24, -20, -27, -14, -28, -27, -27,
148
    -20, -19,  -2,  -8,   5,   7,  25,  13,   5,   5,
149
      6,   5,   2, -12,  31,  15,  23,  -1,  12,   8,
150
    }, {
151
     57, -26,  22,  -7, -14, -28, -14,  -3, -35,   0,
152
      3,   1, -11,  16, -18, -10,  -4, -31, -15, -28,
153
    -14, -23,  -1, -21,   7,  -2,  11,  -1,   3,  -1,
154
     18,   9,  10,  13,  49,  24,   8,  14,   2,  16,
155
    }, {
156
     25,  15,  22,  11,  18,   4,  15, -22,   8,  -2,
157
    -17,  -9, -48, -20, -30, -17, -16,  11,  -1,  16,
158
      2,  10,  -5,  26,  -2,  -4,  22,   0,   2,  10,
159
     -6,  13, -14,  10, -23,   0,  10,  -2,   1,   0,
160
    }, {
161
     47,   3,  11,  -6,  15, -13,   2, -38,  -6, -13,
162
    -15, -22, -40, -28, -28,   0,  -5,   8,  10,  15,
163
      7,   7,  -4,  13,  -1, -14,   9, -14,   0,   2,
164
      4,  18,  -7,  36,  -6,   8,  -3,  13,  -7,   8,
165
    }, {
166
     14,   7,  36,  13,  10,  10,  18,   0,   0,   5,
167
    -25,  -8, -43,   0, -48, -18, -27,   0, -12,   3,
168
     -7,  -6,  -7,  13, -15,  -5,  11,  -3,   0,   2,
169
      0, -12,  -6,  10,   0,  23,  22,  11,  26,  12,
170
    }, {
171
     36,  -5,  24,  -4,   7,  -7,   6, -17, -14,  -5,
172
    -22, -22, -35,  -8, -46,  -1, -17,  -3,   0,   2,
173
     -2, -10,  -5,   0, -14, -15,  -2, -18,  -2,  -4,
174
     11,  -7,   1,  36,  18,  32,   7,  27,  17,  20,
175
    }, {
176
     33,  13,  29,  24,   1,   1,  -2, -18,   0,   9,
177
     -3,  17, -27,   0, -21, -30, -12, -11,  -5,  -2,
178
     12,   4,   9,  19,  18,  -9,  13,  -6,  11,  -8,
179
     -2,  35,  -8,  10,  -7,  -1,   4, -11, -10,  -2,
180
    }, {
181
     55,   1,  17,   6,  -1, -16, -15, -35, -15,  -2,
182
      0,   4, -19,  -8, -20, -13,  -1, -14,   7,  -3,
183
     18,   0,  10,   5,  19, -19,   0, -21,   8, -16,
184
      9,  39,   0,  36,  10,   7,  -9,   4, -20,   5,
185
    }, {
186
     22,   5,  42,  26,  -6,   8,   1,   2,  -9,  17,
187
    -10,  18, -21,  19, -39, -31, -23, -23, -16, -15,
188
      2, -12,   7,   6,   5,  -9,   1, -10,   7, -16,
189
      4,   9,   0,  10,  17,  22,  16,   2,  14,   9,
190
    }, {
191
     44,  -6,  30,   8,  -9, -10, -11, -14, -23,   5,
192
     -8,   4, -14,  12, -37, -14, -12, -26,  -4, -16,
193
      8, -16,   9,  -7,   6, -19, -12, -25,   5, -24,
194
     15,  13,   8,  36,  34,  31,   1,  18,   4,  18,
195
    }, {
196
     -3,  -5,  -9,  -7,  15,  -1,   5,  13,   2,  12,
197
      5,   2, -21, -23,  -2, -16,   0,   5,  -6,  13,
198
    -23,   3, -32,  10, -15,   8,  44,  28,   9,  37,
199
     -2,  13,  -9, -15, -12, -27,  -7, -12,   0, -11,
200
    }, {
201
     18, -17, -21, -25,  11, -19,  -6,  -3, -11,   0,
202
      7, -11, -13, -31,  -1,   0,   9,   1,   5,  12,
203
    -18,   0, -31,  -2, -13,  -1,  30,  14,   7,  29,
204
      9,  18,  -1,  10,   4, -18, -22,   3, -10,  -2,
205
    }, {
206
    -13, -13,   3,  -5,   7,   4,   9,  34,  -5,  20,
207
     -2,   3, -16,  -3, -20, -17, -11,  -7, -17,   0,
208
    -34, -13, -33,  -2, -28,   8,  32,  24,   5,  29,
209
      3, -12,   0, -15,  11,  -3,   3,   2,  24,   1,
210
    }, {
211
      8, -25,  -8, -23,   3, -13,  -3,  17, -20,   8,
212
      0, -10,  -8, -11, -18,   0,  -1, -10,  -5,   0,
213
    -28, -17, -32, -15, -26,  -1,  19,   9,   3,  21,
214
     15,  -7,   6,   9,  29,   5, -10,  17,  15,   9,
215
    }, {
216
      4,  -6,  -3,   5,  -1,  -4, -11,  16,  -6,  23,
217
     19,  29,   0,  -3,   6, -30,   3, -17, -10,  -5,
218
    -13,  -2, -17,   3,   5,   3,  35,  21,  17,  17,
219
      2,  35,  -2, -15,   3, -28, -13, -21, -13, -13,
220
    }, {
221
     26, -19, -15, -12,  -5, -22, -24,   0, -21,  12,
222
     21,  15,   8, -11,   7, -12,  14, -20,   2,  -6,
223
     -7,  -6, -16,  -9,   6,  -5,  21,   7,  15,  10,
224
     13,  39,   5,  10,  20, -19, -28,  -5, -22,  -5,
225
    }, {
226
     -5, -15,   9,   7,  -9,   2,  -8,  37, -14,  31,
227
     11,  29,   5,  16, -11, -30,  -7, -29, -21, -18,
228
    -23, -19, -18,  -9,  -7,   3,  23,  17,  14,   9,
229
      8,   9,   6, -15,  27,  -4,  -2,  -6,  12,  -1,
230
    }, {
231
     16, -27,  -2, -10, -13, -16, -20,  20, -29,  20,
232
     14,  16,  13,   8,  -9, -13,   2, -33,  -9, -19,
233
    -17, -23, -17, -22,  -6,  -6,   9,   2,  12,   2,
234
     20,  13,  13,  10,  45,   4, -16,   8,   2,   7,
235
    }, {
236
    -16,  14,  -2,   8,  20,  17,   9,   2,  14,  16,
237
     -6,   5, -24, -28, -21, -20,  -8,   9,   4,  25,
238
     -1,  11, -22,  24, -15,  -8,  21,   5,  11,  14,
239
     -5,  18, -11,   7, -27, -20, -14,  -7,   1,  -9,
240
    }, {
241
      6,   2, -14,  -9,  16,  -1,  -3, -14,   0,   5,
242
     -3,  -8, -16, -36, -19,  -3,   1,   6,  17,  24,
243
      4,   7, -21,  11, -14, -18,   7,  -9,   9,   7,
244
      6,  22,  -3,  33, -10, -11, -28,   7,  -7,   0,
245
    }, {
246
    -26,   6,  11,  10,  12,  23,  12,  23,   5,  24,
247
    -13,   5, -19,  -8, -38, -21, -20,  -2,  -6,  12,
248
    -11,  -5, -23,  11, -29,  -9,   9,   0,   7,   6,
249
      1,  -7,  -2,   7,  -3,   3,  -2,   6,  27,   3,
250
    }, {
251
     -4,  -6,   0,  -7,   8,   4,   0,   6,  -9,  13,
252
    -11,  -7, -11, -15, -37,  -4,  -9,  -5,   5,  11,
253
     -5,  -9, -22,  -1, -27, -18,  -4, -14,   5,   0,
254
     12,  -3,   4,  32,  14,  12, -17,  22,  17,  11,
255
    }, {
256
     -8,  12,   3,  21,   3,  14,  -8,   5,   4,  28,
257
      7,  32,  -2,  -8, -12, -34,  -4, -12,   1,   6,
258
      9,   4,  -7,  17,   4, -13,  11,  -1,  19,  -4,
259
      0,  39,  -4,   7, -11, -21, -20, -16, -10, -11,
260
    }, {
261
     13,   0,  -8,   3,   0,  -4, -21, -11,  -9,  16,
262
     10,  18,   5, -16, -10, -16,   5, -15,  13,   5,
263
     15,   1,  -6,   4,   6, -23,  -2, -16,  17, -12,
264
     10,  44,   3,  33,   6, -12, -34,  -1, -20,  -3,
265
    }, {
266
    -18,   4,  17,  23,  -4,  20,  -4,  26,  -3,  36,
267
      0,  32,   2,  12, -29, -34, -16, -24, -10,  -6,
268
      0, -12,  -8,   4,  -8, -13,   0,  -6,  16, -12,
269
      5,  13,   3,   7,  13,   3,  -8,  -2,  14,   0,
270
    }, {
271
      3,  -7,   5,   5,  -8,   2, -17,   9, -18,  24,
272
      2,  19,  10,   4, -28, -17,  -5, -28,   2,  -7,
273
      4, -15,  -7,  -8,  -6, -23, -13, -21,  14, -20,
274
     17,  18,  11,  33,  30,  11, -23,  13,   5,   9,
275
    }, {
276
     60,  10,   7,  -1,   9,  -8,   6, -13,   2, -15,
277
     -1, -10, -13, -11,  15,   0,   6,   9,  -1,   0,
278
    -13,   1, -11,  -3, -13,  21,  13,  26,  -7,  31,
279
    -10,  -7, -16, -33, -31, -10,  22,  -8,   1,  -2,
280
    }, {
281
     82,  -1,  -4, -19,   6, -27,  -6, -29, -12, -26,
282
      1, -24,  -5, -18,  17,  17,  17,   6,  10,   0,
283
     -7,  -2,  -9, -16, -12,  11,   0,  11,  -9,  23,
284
      0,  -3,  -8,  -8, -13,  -1,   8,   7,  -7,   6,
285
    }, {
286
     49,   2,  21,   0,   1,  -2,   9,   8,  -6,  -6,
287
     -8, -10,  -8,   9,  -2,   0,  -4,  -2, -13, -12,
288
    -23, -15, -12, -16, -26,  21,   2,  21, -11,  23,
289
     -4, -33,  -7, -33,  -6,  13,  34,   5,  27,  10,
290
    }, {
291
     71, -10,   9, -17,  -1, -20,  -3,  -8, -21, -18,
292
     -6, -24,   0,   1,   0,  16,   6,  -5,   0, -13,
293
    -17, -19, -11, -29, -25,  11, -11,   6, -13,  15,
294
      7, -29,   0,  -8,  11,  22,  20,  21,  17,  18,
295
    }, {
296
     67,   8,  14,  11,  -7, -11, -11,  -9,  -7,  -3,
297
     13,  16,   8,   9,  24, -12,  10, -13,  -5, -17,
298
     -2,  -4,   3, -10,   6,  17,   4,  19,   0,  11,
299
     -6,  13,  -9, -33, -14, -10,  16, -17, -10,  -4,
300
    }, {
301
     90,  -3,   2,  -6, -10, -29, -24, -26, -21, -15,
302
     15,   2,  16,   1,  25,   4,  21, -16,   6, -18,
303
      3,  -8,   5, -24,   8,   7,  -9,   4,  -1,   3,
304
      5,  18,  -1,  -7,   2,  -1,   2,  -1, -19,   3,
305
    }, {
306
     57,   0,  27,  13, -14,  -5,  -7,  11, -15,   4,
307
      5,  16,  13,  29,   6, -13,   0, -25, -16, -31,
308
    -12, -22,   2, -23,  -6,  16,  -7,  14,  -2,   3,
309
      0, -12,   0, -33,   9,  13,  28,  -3,  14,   7,
310
    }, {
311
     79, -11,  15,  -4, -18, -23, -20,  -5, -30,  -7,
312
      7,   2,  21,  21,   8,   3,  10, -28,  -4, -31,
313
     -6, -25,   3, -37,  -4,   7, -20,   0,  -4,  -4,
314
     11,  -7,   6,  -8,  27,  22,  14,  12,   5,  16,
315
    }, {
316
     47,  30,  15,  14,  14,   9,   9, -23,  13, -10,
317
    -12,  -7, -16, -15,  -3,  -3,  -1,  14,   9,  12,
318
      9,   8,   0,  10, -14,   4,  -9,   2,  -5,   8,
319
    -13,  -3, -18, -10, -45,  -3,  16,  -4,   4,   0,
320
    }, {
321
     69,  17,   3,  -3,  10,  -8,  -3, -40,  -1, -21,
322
    -10, -21,  -8, -23,  -1,  13,   8,  11,  21,  11,
323
     15,   4,   0,  -2, -13,  -5, -23, -12,  -7,   0,
324
     -1,   0, -10,  14, -28,   5,   1,  11,  -5,   7,
325
    }, {
326
     36,  21,  28,  16,   6,  16,  12,  -2,   4,  -2,
327
    -20,  -7, -11,   4, -20,  -4, -12,   2,  -1,   0,
328
      0,  -8,  -2,  -2, -27,   4, -21,  -2,  -9,   0,
329
     -6, -29,  -9, -10, -21,  21,  28,  10,  29,  11,
330
    }, {
331
     58,   9,  16,  -1,   2,  -2,   0, -19, -10, -13,
332
    -17, -21,  -3,  -3, -19,  12,  -2,   0,  10,  -1,
333
      5, -12,   0, -15, -26,  -5, -34, -16, -11,  -7,
334
      4, -25,  -2,  14,  -3,  29,  13,  25,  20,  20,
335
    }, {
336
     55,  28,  21,  27,  -2,   7,  -8, -20,   4,   1,
337
      1,  18,   5,   4,   5, -16,   2,  -8,   5,  -5,
338
     19,   2,  14,   3,   6,   0, -18,  -4,   2, -11,
339
     -8,  18, -11, -10, -29,  -3,  10, -13,  -8,  -3,
340
    }, {
341
     77,  16,   9,   9,  -6, -11, -21, -37, -10, -10,
342
      4,   5,  13,  -3,   7,   0,  13, -11,  17,  -6,
343
     25,  -1,  15,  -9,   7,  -9, -32, -19,   0, -18,
344
      2,  22,  -3,  15, -12,   5,  -4,   2, -17,   5,
345
    }, {
346
     44,  20,  34,  29, -10,  13,  -4,   0,  -4,   9,
347
     -5,  19,  10,  24, -11, -17,  -8, -20,  -5, -19,
348
      9, -14,  12,  -9,  -6,   0, -30,  -9,   0, -19,
349
     -2,  -7,  -2, -10,  -5,  20,  21,   1,  17,   9,
350
    }, {
351
     66,   8,  23,  11, -14,  -5, -17, -16, -19,  -2,
352
     -3,   5,  18,  17, -10,   0,   1, -23,   6, -20,
353
     15, -18,  14, -22,  -5, -10, -44, -23,  -2, -26,
354
      9,  -3,   4,  14,  12,  29,   7,  16,   7,  18,
355
    }, {
356
     18,   9, -17,  -4,  11,   3,   0,  11,   7,   4,
357
     10,   3,  10, -18,  24,  -3,  14,   7,   4,  10,
358
    -16,   1, -27,  -4, -27,  17,  12,  30,   0,  35,
359
     -9,  -3, -12, -36, -35, -30,  -2, -13,   2, -11,
360
    }, {
361
     40,  -2, -29, -22,   7, -14, -12,  -5,  -7,  -7,
362
     12,  -9,  18, -26,  26,  14,  24,   4,  16,   9,
363
    -10,  -2, -26, -18, -26,   7,  -1,  15,  -1,  27,
364
      2,   0,  -4, -11, -17, -21, -16,   1,  -7,  -3,
365
    }, {
366
      8,   1,  -3,  -2,   3,  10,   3,  32,  -1,  12,
367
      2,   4,  15,   1,   7,  -3,   2,  -4,  -6,  -3,
368
    -26, -15, -29, -17, -40,  17,   0,  26,  -2,  27,
369
     -2, -29,  -4, -36, -10,  -6,   9,   0,  27,   0,
370
    }, {
371
     30, -11, -15, -20,   0,  -8,  -9,  15, -15,   0,
372
      5,  -9,  23,  -6,   8,  13,  13,  -7,   5,  -3,
373
    -20, -19, -27, -31, -39,   7, -13,  11,  -4,  19,
374
      8, -25,   3, -11,   7,   2,  -4,  16,  18,   9,
375
    }, {
376
     26,   7, -11,   8,  -5,   1, -17,  14,  -1,  15,
377
     24,  30,  32,   1,  33, -16,  18, -14,   0,  -8,
378
     -6,  -4, -12, -12,  -6,  13,   2,  23,   8,  15,
379
     -4,  17,  -5, -36, -18, -30,  -8, -22, -10, -14,
380
    }, {
381
     48,  -4, -23,  -9,  -9, -17, -30,  -2, -16,   3,
382
     26,  16,  40,  -6,  35,   1,  28, -17,  12,  -9,
383
      0,  -8, -11, -25,  -5,   3, -10,   8,   6,   7,
384
      6,  22,   1, -11,  -1, -21, -22,  -7, -19,  -5,
385
    }, {
386
     15,   0,   2,  10, -13,   7, -14,  35, -10,  23,
387
     16,  31,  37,  21,  16, -17,   6, -26, -10, -21,
388
    -16, -21, -13, -25, -19,  13,  -8,  19,   5,   7,
389
      1,  -8,   2, -36,   5,  -6,   3,  -8,  15,  -1,
390
    }, {
391
     37, -12,  -9,  -7, -17, -11, -26,  18, -25,  12,
392
     19,  17,  45,  14,  17,   0,  17, -30,   1, -22,
393
    -10, -25, -12, -38, -18,   3, -22,   4,   3,   0,
394
     13,  -3,  10, -11,  23,   2, -10,   7,   5,   7,
395
    }, {
396
      5,  29,  -9,  11,  15,  22,   3,   0,  18,   8,
397
     -1,   6,   7, -23,   6,  -6,   5,  12,  15,  21,
398
      5,   8, -17,   9, -28,   0, -11,   6,   2,  12,
399
    -11,   0, -14, -13, -49, -22,  -8,  -9,   4,  -9,
400
    }, {
401
     27,  16, -21,  -6,  12,   3,  -9, -16,   3,  -2,
402
      1,  -7,  15, -31,   7,  10,  16,   9,  27,  21,
403
     11,   5, -16,  -3, -26,  -9, -24,  -7,   0,   4,
404
      0,   4,  -6,  11, -32, -14, -23,   6,  -5,  -1,
405
    }, {
406
     -4,  20,   3,  13,   8,  28,   6,  21,  10,  16,
407
     -8,   7,  12,  -3, -11,  -7,  -5,   0,   4,   8,
408
     -4,  -8, -18,  -3, -41,   0, -22,   2,   0,   4,
409
     -5, -25,  -6, -14, -25,   1,   2,   4,  29,   2,
410
    }, {
411
     17,   8,  -8,  -4,   4,  10,  -6,   5,  -4,   5,
412
     -6,  -6,  20, -10,  -9,   9,   4,  -2,  16,   7,
413
      1, -12, -17, -16, -39,  -9, -36, -12,  -2,  -3,
414
      6, -21,   1,  11,  -7,  10, -11,  20,  20,  11,
415
    }, {
416
     13,  27,  -3,  24,  -1,  19, -14,   3,   9,  20,
417
     12,  33,  29,  -3,  15, -20,   9,  -9,  11,   3,
418
     16,   2,  -2,   2,  -7,  -3, -20,   0,  10,  -7,
419
     -7,  22,  -7, -13, -33, -23, -14, -18,  -7, -12,
420
    }, {
421
     35,  15, -15,   6,  -4,   1, -27, -12,  -5,   8,
422
     15,  19,  37, -11,  16,  -2,  20, -12,  23,   2,
423
     22,  -1,  -1, -11,  -5, -13, -34, -14,   8, -14,
424
      4,  26,   0,  11, -16, -14, -29,  -2, -17,  -3,
425
    }, {
426
      3,  19,   9,  26,  -8,  26, -10,  24,   0,  28,
427
      5,  33,  34,  17,  -2, -20,  -1, -22,   0, -10,
428
      6, -14,  -3, -10, -20,  -4, -32,  -4,   7, -15,
429
      0,  -3,   0, -13,  -9,   0,  -3,  -4,  17,   0,
430
    }, {
431
     25,   7,  -2,   8, -12,   7, -23,   8, -13,  16,
432
      7,  20,  42,   9,   0,  -3,   9, -25,  12, -10,
433
     12, -18,  -2, -24, -19, -13, -46, -19,   5, -22,
434
     10,   0,   8,  11,   8,   9, -17,  11,   7,   8,
435
    }, {
436
    -25,  -7,   2,  -8,  12,  -7,  23,  -8,  13, -16,
437
     -7, -20, -42,  -9,   0,   3,  -9,  25, -12,  10,
438
    -12,  18,   2,  24,  19,  13,  46,  19,  -5,  22,
439
    -10,   0,  -8, -11,  -8,  -9,  17, -11,  -7,  -8,
440
    }, {
441
     -3, -19,  -9, -26,   8, -26,  10, -24,   0, -28,
442
     -5, -33, -34, -17,   2,  20,   1,  22,   0,  10,
443
     -6,  14,   3,  10,  20,   4,  32,   4,  -7,  15,
444
      0,   3,   0,  13,   9,   0,   3,   4, -17,   0,
445
    }, {
446
    -35, -15,  15,  -6,   4,  -1,  27,  12,   5,  -8,
447
    -15, -19, -37,  11, -16,   2, -20,  12, -23,  -2,
448
    -22,   1,   1,  11,   5,  13,  34,  14,  -8,  14,
449
     -4, -26,   0, -11,  16,  14,  29,   2,  17,   3,
450
    }, {
451
    -13, -27,   3, -24,   1, -19,  14,  -3,  -9, -20,
452
    -12, -33, -29,   3, -15,  20,  -9,   9, -11,  -3,
453
    -16,  -2,   2,  -2,   7,   3,  20,   0, -10,   7,
454
      7, -22,   7,  13,  33,  23,  14,  18,   7,  12,
455
    }, {
456
    -17,  -8,   8,   4,  -4, -10,   6,  -5,   4,  -5,
457
      6,   6, -20,  10,   9,  -9,  -4,   2, -16,  -7,
458
     -1,  12,  17,  16,  39,   9,  36,  12,   2,   3,
459
     -6,  21,  -1, -11,   7, -10,  11, -20, -20, -11,
460
    }, {
461
      4, -20,  -3, -13,  -8, -28,  -6, -21, -10, -16,
462
      8,  -7, -12,   3,  11,   7,   5,   0,  -4,  -8,
463
      4,   8,  18,   3,  41,   0,  22,  -2,   0,  -4,
464
      5,  25,   6,  14,  25,  -1,  -2,  -4, -29,  -2,
465
    }, {
466
    -27, -16,  21,   6, -12,  -3,   9,  16,  -3,   2,
467
     -1,   7, -15,  31,  -7, -10, -16,  -9, -27, -21,
468
    -11,  -5,  16,   3,  26,   9,  24,   7,   0,  -4,
469
      0,  -4,   6, -11,  32,  14,  23,  -6,   5,   1,
470
    }, {
471
     -5, -29,   9, -11, -15, -22,  -3,   0, -18,  -8,
472
      1,  -6,  -7,  23,  -6,   6,  -5, -12, -15, -21,
473
     -5,  -8,  17,  -9,  28,   0,  11,  -6,  -2, -12,
474
     11,   0,  14,  13,  49,  22,   8,   9,  -4,   9,
475
    }, {
476
    -37,  12,   9,   7,  17,  11,  26, -18,  25, -12,
477
    -19, -17, -45, -14, -17,   0, -17,  30,  -1,  22,
478
     10,  25,  12,  38,  18,  -3,  22,  -4,  -3,   0,
479
    -13,   3, -10,  11, -23,  -2,  10,  -7,  -5,  -7,
480
    }, {
481
    -15,   0,  -2, -10,  13,  -7,  14, -35,  10, -23,
482
    -16, -31, -37, -21, -16,  17,  -6,  26,  10,  21,
483
     16,  21,  13,  25,  19, -13,   8, -19,  -5,  -7,
484
     -1,   8,  -2,  36,  -5,   6,  -3,   8, -15,   1,
485
    }, {
486
    -48,   4,  23,   9,   9,  17,  30,   2,  16,  -3,
487
    -26, -16, -40,   6, -35,  -1, -28,  17, -12,   9,
488
      0,   8,  11,  25,   5,  -3,  10,  -8,  -6,  -7,
489
     -6, -22,  -1,  11,   1,  21,  22,   7,  19,   5,
490
    }, {
491
    -26,  -7,  11,  -8,   5,  -1,  17, -14,   1, -15,
492
    -24, -30, -32,  -1, -33,  16, -18,  14,   0,   8,
493
      6,   4,  12,  12,   6, -13,  -2, -23,  -8, -15,
494
      4, -17,   5,  36,  18,  30,   8,  22,  10,  14,
495
    }, {
496
    -30,  11,  15,  20,   0,   8,   9, -15,  15,   0,
497
     -5,   9, -23,   6,  -8, -13, -13,   7,  -5,   3,
498
     20,  19,  27,  31,  39,  -7,  13, -11,   4, -19,
499
     -8,  25,  -3,  11,  -7,  -2,   4, -16, -18,  -9,
500
    }, {
501
     -8,  -1,   3,   2,  -3, -10,  -3, -32,   1, -12,
502
     -2,  -4, -15,  -1,  -7,   3,  -2,   4,   6,   3,
503
     26,  15,  29,  17,  40, -17,   0, -26,   2, -27,
504
      2,  29,   4,  36,  10,   6,  -9,   0, -27,   0,
505
    }, {
506
    -40,   2,  29,  22,  -7,  14,  12,   5,   7,   7,
507
    -12,   9, -18,  26, -26, -14, -24,  -4, -16,  -9,
508
     10,   2,  26,  18,  26,  -7,   1, -15,   1, -27,
509
     -2,   0,   4,  11,  17,  21,  16,  -1,   7,   3,
510
    }, {
511
    -18,  -9,  17,   4, -11,  -3,   0, -11,  -7,  -4,
512
    -10,  -3, -10,  18, -24,   3, -14,  -7,  -4, -10,
513
     16,  -1,  27,   4,  27, -17, -12, -30,   0, -35,
514
      9,   3,  12,  36,  35,  30,   2,  13,  -2,  11,
515
    }, {
516
    -66,  -8, -23, -11,  14,   5,  17,  16,  19,   2,
517
      3,  -5, -18, -17,  10,   0,  -1,  23,  -6,  20,
518
    -15,  18, -14,  22,   5,  10,  44,  23,   2,  26,
519
     -9,   3,  -4, -14, -12, -29,  -7, -16,  -7, -18,
520
    }, {
521
    -44, -20, -34, -29,  10, -13,   4,   0,   4,  -9,
522
      5, -19, -10, -24,  11,  17,   8,  20,   5,  19,
523
     -9,  14, -12,   9,   6,   0,  30,   9,   0,  19,
524
      2,   7,   2,  10,   5, -20, -21,  -1, -17,  -9,
525
    }, {
526
    -77, -16,  -9,  -9,   6,  11,  21,  37,  10,  10,
527
     -4,  -5, -13,   3,  -7,   0, -13,  11, -17,   6,
528
    -25,   1, -15,   9,  -7,   9,  32,  19,   0,  18,
529
     -2, -22,   3, -15,  12,  -5,   4,  -2,  17,  -5,
530
    }, {
531
    -55, -28, -21, -27,   2,  -7,   8,  20,  -4,  -1,
532
     -1, -18,  -5,  -4,  -5,  16,  -2,   8,  -5,   5,
533
    -19,  -2, -14,  -3,  -6,   0,  18,   4,  -2,  11,
534
      8, -18,  11,  10,  29,   3, -10,  13,   8,   3,
535
    }, {
536
    -58,  -9, -16,   1,  -2,   2,   0,  19,  10,  13,
537
     17,  21,   3,   3,  19, -12,   2,   0, -10,   1,
538
     -5,  12,   0,  15,  26,   5,  34,  16,  11,   7,
539
     -4,  25,   2, -14,   3, -29, -13, -25, -20, -20,
540
    }, {
541
    -36, -21, -28, -16,  -6, -16, -12,   2,  -4,   2,
542
     20,   7,  11,  -4,  20,   4,  12,  -2,   1,   0,
543
      0,   8,   2,   2,  27,  -4,  21,   2,   9,   0,
544
      6,  29,   9,  10,  21, -21, -28, -10, -29, -11,
545
    }, {
546
    -69, -17,  -3,   3, -10,   8,   3,  40,   1,  21,
547
     10,  21,   8,  23,   1, -13,  -8, -11, -21, -11,
548
    -15,  -4,   0,   2,  13,   5,  23,  12,   7,   0,
549
      1,   0,  10, -14,  28,  -5,  -1, -11,   5,  -7,
550
    }, {
551
    -47, -30, -15, -14, -14,  -9,  -9,  23, -13,  10,
552
     12,   7,  16,  15,   3,   3,   1, -14,  -9, -12,
553
     -9,  -8,   0, -10,  14,  -4,   9,  -2,   5,  -8,
554
     13,   3,  18,  10,  45,   3, -16,   4,  -4,   0,
555
    }, {
556
    -79,  11, -15,   4,  18,  23,  20,   5,  30,   7,
557
     -7,  -2, -21, -21,  -8,  -3, -10,  28,   4,  31,
558
      6,  25,  -3,  37,   4,  -7,  20,   0,   4,   4,
559
    -11,   7,  -6,   8, -27, -22, -14, -12,  -5, -16,
560
    }, {
561
    -57,   0, -27, -13,  14,   5,   7, -11,  15,  -4,
562
     -5, -16, -13, -29,  -6,  13,   0,  25,  16,  31,
563
     12,  22,  -2,  23,   6, -16,   7, -14,   2,  -3,
564
      0,  12,   0,  33,  -9, -13, -28,   3, -14,  -7,
565
    }, {
566
    -90,   3,  -2,   6,  10,  29,  24,  26,  21,  15,
567
    -15,  -2, -16,  -1, -25,  -4, -21,  16,  -6,  18,
568
     -3,   8,  -5,  24,  -8,  -7,   9,  -4,   1,  -3,
569
     -5, -18,   1,   7,  -2,   1,  -2,   1,  19,  -3,
570
    }, {
571
    -67,  -8, -14, -11,   7,  11,  11,   9,   7,   3,
572
    -13, -16,  -8,  -9, -24,  12, -10,  13,   5,  17,
573
      2,   4,  -3,  10,  -6, -17,  -4, -19,   0, -11,
574
      6, -13,   9,  33,  14,  10, -16,  17,  10,   4,
575
    }, {
576
    -71,  10,  -9,  17,   1,  20,   3,   8,  21,  18,
577
      6,  24,   0,  -1,   0, -16,  -6,   5,   0,  13,
578
     17,  19,  11,  29,  25, -11,  11,  -6,  13, -15,
579
     -7,  29,   0,   8, -11, -22, -20, -21, -17, -18,
580
    }, {
581
    -49,  -2, -21,   0,  -1,   2,  -9,  -8,   6,   6,
582
      8,  10,   8,  -9,   2,   0,   4,   2,  13,  12,
583
     23,  15,  12,  16,  26, -21,  -2, -21,  11, -23,
584
      4,  33,   7,  33,   6, -13, -34,  -5, -27, -10,
585
    }, {
586
    -82,   1,   4,  19,  -6,  27,   6,  29,  12,  26,
587
     -1,  24,   5,  18, -17, -17, -17,  -6, -10,   0,
588
      7,   2,   9,  16,  12, -11,   0, -11,   9, -23,
589
      0,   3,   8,   8,  13,   1,  -8,  -7,   7,  -6,
590
    }, {
591
    -60, -10,  -7,   1,  -9,   8,  -6,  13,  -2,  15,
592
      1,  10,  13,  11, -15,   0,  -6,  -9,   1,   0,
593
     13,  -1,  11,   3,  13, -21, -13, -26,   7, -31,
594
     10,   7,  16,  33,  31,  10, -22,   8,  -1,   2,
595
    }, {
596
     -3,   7,  -5,  -5,   8,  -2,  17,  -9,  18, -24,
597
     -2, -19, -10,  -4,  28,  17,   5,  28,  -2,   7,
598
     -4,  15,   7,   8,   6,  23,  13,  21, -14,  20,
599
    -17, -18, -11, -33, -30, -11,  23, -13,  -5,  -9,
600
    }, {
601
     18,  -4, -17, -23,   4, -20,   4, -26,   3, -36,
602
      0, -32,  -2, -12,  29,  34,  16,  24,  10,   6,
603
      0,  12,   8,  -4,   8,  13,   0,   6, -16,  12,
604
     -5, -13,  -3,  -7, -13,  -3,   8,   2, -14,   0,
605
    }, {
606
    -13,   0,   8,  -3,   0,   4,  21,  11,   9, -16,
607
    -10, -18,  -5,  16,  10,  16,  -5,  15, -13,  -5,
608
    -15,  -1,   6,  -4,  -6,  23,   2,  16, -17,  12,
609
    -10, -44,  -3, -33,  -6,  12,  34,   1,  20,   3,
610
    }, {
611
      8, -12,  -3, -21,  -3, -14,   8,  -5,  -4, -28,
612
     -7, -32,   2,   8,  12,  34,   4,  12,  -1,  -6,
613
     -9,  -4,   7, -17,  -4,  13, -11,   1, -19,   4,
614
      0, -39,   4,  -7,  11,  21,  20,  16,  10,  11,
615
    }, {
616
      4,   6,   0,   7,  -8,  -4,   0,  -6,   9, -13,
617
     11,   7,  11,  15,  37,   4,   9,   5,  -5, -11,
618
      5,   9,  22,   1,  27,  18,   4,  14,  -5,   0,
619
    -12,   3,  -4, -32, -14, -12,  17, -22, -17, -11,
620
    }, {
621
     26,  -6, -11, -10, -12, -23, -12, -23,  -5, -24,
622
     13,  -5,  19,   8,  38,  21,  20,   2,   6, -12,
623
     11,   5,  23, -11,  29,   9,  -9,   0,  -7,  -6,
624
     -1,   7,   2,  -7,   3,  -3,   2,  -6, -27,  -3,
625
    }, {
626
     -6,  -2,  14,   9, -16,   1,   3,  14,   0,  -5,
627
      3,   8,  16,  36,  19,   3,  -1,  -6, -17, -24,
628
     -4,  -7,  21, -11,  14,  18,  -7,   9,  -9,  -7,
629
     -6, -22,   3, -33,  10,  11,  28,  -7,   7,   0,
630
    }, {
631
     16, -14,   2,  -8, -20, -17,  -9,  -2, -14, -16,
632
      6,  -5,  24,  28,  21,  20,   8,  -9,  -4, -25,
633
      1, -11,  22, -24,  15,   8, -21,  -5, -11, -14,
634
      5, -18,  11,  -7,  27,  20,  14,   7,  -1,   9,
635
    }, {
636
    -16,  27,   2,  10,  13,  16,  20, -20,  29, -20,
637
    -14, -16, -13,  -8,   9,  13,  -2,  33,   9,  19,
638
     17,  23,  17,  22,   6,   6,  -9,  -2, -12,  -2,
639
    -20, -13, -13, -10, -45,  -4,  16,  -8,  -2,  -7,
640
    }, {
641
      5,  15,  -9,  -7,   9,  -2,   8, -37,  14, -31,
642
    -11, -29,  -5, -16,  11,  30,   7,  29,  21,  18,
643
     23,  19,  18,   9,   7,  -3, -23, -17, -14,  -9,
644
     -8,  -9,  -6,  15, -27,   4,   2,   6, -12,   1,
645
    }, {
646
    -26,  19,  15,  12,   5,  22,  24,   0,  21, -12,
647
    -21, -15,  -8,  11,  -7,  12, -14,  20,  -2,   6,
648
      7,   6,  16,   9,  -6,   5, -21,  -7, -15, -10,
649
    -13, -39,  -5, -10, -20,  19,  28,   5,  22,   5,
650
    }, {
651
     -4,   6,   3,  -5,   1,   4,  11, -16,   6, -23,
652
    -19, -29,   0,   3,  -6,  30,  -3,  17,  10,   5,
653
     13,   2,  17,  -3,  -5,  -3, -35, -21, -17, -17,
654
     -2, -35,   2,  15,  -3,  28,  13,  21,  13,  13,
655
    }, {
656
     -8,  25,   8,  23,  -3,  13,   3, -17,  20,  -8,
657
      0,  10,   8,  11,  18,   0,   1,  10,   5,   0,
658
     28,  17,  32,  15,  26,   1, -19,  -9,  -3, -21,
659
    -15,   7,  -6,  -9, -29,  -5,  10, -17, -15,  -9,
660
    }, {
661
     13,  13,  -3,   5,  -7,  -4,  -9, -34,   5, -20,
662
      2,  -3,  16,   3,  20,  17,  11,   7,  17,   0,
663
     34,  13,  33,   2,  28,  -8, -32, -24,  -5, -29,
664
     -3,  12,   0,  15, -11,   3,  -3,  -2, -24,  -1,
665
    }, {
666
    -18,  17,  21,  25, -11,  19,   6,   3,  11,   0,
667
     -7,  11,  13,  31,   1,   0,  -9,  -1,  -5, -12,
668
     18,   0,  31,   2,  13,   1, -30, -14,  -7, -29,
669
     -9, -18,   1, -10,  -4,  18,  22,  -3,  10,   2,
670
    }, {
671
      3,   5,   9,   7, -15,   1,  -5, -13,  -2, -12,
672
     -5,  -2,  21,  23,   2,  16,   0,  -5,   6, -13,
673
     23,  -3,  32, -10,  15,  -8, -44, -28,  -9, -37,
674
      2, -13,   9,  15,  12,  27,   7,  12,   0,  11,
675
    }, {
676
    -44,   6, -30,  -8,   9,  10,  11,  14,  23,  -5,
677
      8,  -4,  14, -12,  37,  14,  12,  26,   4,  16,
678
     -8,  16,  -9,   7,  -6,  19,  12,  25,  -5,  24,
679
    -15, -13,  -8, -36, -34, -31,  -1, -18,  -4, -18,
680
    }, {
681
    -22,  -5, -42, -26,   6,  -8,  -1,  -2,   9, -17,
682
     10, -18,  21, -19,  39,  31,  23,  23,  16,  15,
683
     -2,  12,  -7,  -6,  -5,   9,  -1,  10,  -7,  16,
684
     -4,  -9,   0, -10, -17, -22, -16,  -2, -14,  -9,
685
    }, {
686
    -55,  -1, -17,  -6,   1,  16,  15,  35,  15,   2,
687
      0,  -4,  19,   8,  20,  13,   1,  14,  -7,   3,
688
    -18,   0, -10,  -5, -19,  19,   0,  21,  -8,  16,
689
     -9, -39,   0, -36, -10,  -7,   9,  -4,  20,  -5,
690
    }, {
691
    -33, -13, -29, -24,  -1,  -1,   2,  18,   0,  -9,
692
      3, -17,  27,   0,  21,  30,  12,  11,   5,   2,
693
    -12,  -4,  -9, -19, -18,   9, -13,   6, -11,   8,
694
      2, -35,   8, -10,   7,   1,  -4,  11,  10,   2,
695
    }, {
696
    -36,   5, -24,   4,  -7,   7,  -6,  17,  14,   5,
697
     22,  22,  35,   8,  46,   1,  17,   3,   0,  -2,
698
      2,  10,   5,   0,  14,  15,   2,  18,   2,   4,
699
    -11,   7,  -1, -36, -18, -32,  -7, -27, -17, -20,
700
    }, {
701
    -14,  -7, -36, -13, -10, -10, -18,   0,   0,  -5,
702
     25,   8,  43,   0,  48,  18,  27,   0,  12,  -3,
703
      7,   6,   7, -13,  15,   5, -11,   3,   0,  -2,
704
      0,  12,   6, -10,   0, -23, -22, -11, -26, -12,
705
    }, {
706
    -47,  -3, -11,   6, -15,  13,  -2,  38,   6,  13,
707
     15,  22,  40,  28,  28,   0,   5,  -8, -10, -15,
708
     -7,  -7,   4, -13,   1,  14,  -9,  14,   0,  -2,
709
     -4, -18,   7, -36,   6,  -8,   3, -13,   7,  -8,
710
    }, {
711
    -25, -15, -22, -11, -18,  -4, -15,  22,  -8,   2,
712
     17,   9,  48,  20,  30,  17,  16, -11,   1, -16,
713
     -2, -10,   5, -26,   2,   4, -22,   0,  -2, -10,
714
      6, -13,  14, -10,  23,   0, -10,   2,  -1,   0,
715
    }, {
716
    -57,  26, -22,   7,  14,  28,  14,   3,  35,   0,
717
     -3,  -1,  11, -16,  18,  10,   4,  31,  15,  28,
718
     14,  23,   1,  21,  -7,   2, -11,   1,  -3,   1,
719
    -18,  -9, -10, -13, -49, -24,  -8, -14,  -2, -16,
720
    }, {
721
    -35,  14, -34, -10,  10,  10,   1, -12,  20, -12,
722
      0, -15,  18, -24,  20,  27,  14,  28,  27,  27,
723
     20,  19,   2,   8,  -5,  -7, -25, -13,  -5,  -5,
724
     -6,  -5,  -2,  12, -31, -15, -23,   1, -12,  -8,
725
    }, {
726
    -68,  18,  -9,   9,   6,  35,  18,  25,  26,   7,
727
    -10,  -1,  16,   3,   1,   9,  -6,  19,   4,  15,
728
      4,   6,   0,   8, -20,   2, -23,  -2,  -7,  -5,
729
    -12, -35,  -1, -13, -24,   0,   3,   0,  22,  -4,
730
    }, {
731
    -46,   6, -21,  -8,   2,  16,   5,   8,  11,  -4,
732
     -8, -15,  24,  -4,   2,  26,   3,  16,  16,  14,
733
      9,   2,   1,  -4, -19,  -7, -36, -17,  -9, -13,
734
      0, -31,   5,  12,  -7,   8, -11,  15,  13,   4,
735
    }, {
736
    -49,  24, -16,  20,  -2,  26,  -2,   7,  25,  10,
737
     11,  25,  32,   3,  27,  -2,   8,   8,  11,   9,
738
     24,  17,  16,  14,  13,  -2, -20,  -5,   4, -17,
739
    -14,  12,  -3, -13, -33, -25, -14, -23, -15, -19,
740
    }, {
741
    -27,  12, -28,   2,  -6,   7, -15,  -9,  11,  -1,
742
     13,  11,  40,  -4,  29,  14,  19,   5,  23,   8,
743
     30,  13,  17,   0,  14, -12, -34, -20,   2, -25,
744
     -2,  16,   4,  12, -15, -16, -29,  -7, -24, -10,
745
    }, {
746
    -60,  16,  -3,  22, -10,  32,   0,  28,  17,  18,
747
      3,  25,  37,  23,  10,  -3,  -2,  -3,   0,  -3,
748
     14,   0,  14,   1,   0,  -2, -32,  -9,   1, -25,
749
     -7, -13,   5, -13,  -8,  -1,  -2,  -8,  10,  -6,
750
    }, {
751
    -38,   4, -15,   4, -14,  13, -12,  11,   2,   6,
752
      6,  11,  45,  16,  11,  13,   7,  -6,  12,  -4,
753
     20,  -3,  16, -12,   1, -12, -46, -24,   0, -33,
754
      3,  -9,  12,  12,   8,   7, -17,   6,   0,   2
755
    }
756
};
757
758
const int8_t ff_cb2_vects[128][40]={
759
    {
760
     73, -32, -60, -15, -26,  59,   2, -33,  30, -10,
761
     -3, -17,   8,  30,  -1, -26,  -4, -22,  10,  16,
762
    -36,  -5, -11,  56,  37,   6, -10,  -5, -13,  -3,
763
      6,  -5,  11,   4, -19,  -5, -16,  41,  24,  13,
764
    }, {
765
      4, -11, -37,  23,  -5,  46,  -2, -29,  -5, -39,
766
    -21,  -9,   0,  49,  12,  -9, -16, -26,  22,  15,
767
    -45, -20,  -5,  40,  22,  17, -26,  31, -14,   2,
768
    -14,  10,  30,  20, -27,  -9, -39,  39,  18,   5,
769
    }, {
770
     34, -25, -48, -28, -11,  34,  -2, -41,   9,  -7,
771
    -17,  21,  20,  24, -17, -33,   0, -24,  10,  42,
772
      3,  -5,  10,  42,  11,   8,  -3,   3,  16,   9,
773
     22,  -2,   0, -33, -10,  18,   7,  58,  10,  28,
774
    }, {
775
    -34,  -4, -25,  10,   9,  21,  -7, -36, -26, -36,
776
    -35,  28,  12,  42,  -3, -16, -12, -28,  21,  42,
777
     -5, -21,  16,  26,  -4,  19, -19,  39,  15,  15,
778
      1,  13,  19, -17, -17,  14, -15,  55,   4,  19,
779
    }, {
780
     28, -20, -51, -14,  -6,   7,   0, -26,  27,  -4,
781
     18, -40,  -6,  16,  -1, -15,   0, -55,  -5, -16,
782
    -19,  14,  -3,  49,  14,   1, -22, -30, -12,   0,
783
     24,  15,   9, -17, -45, -29,   4,  28,  51,  35,
784
    }, {
785
    -40,   0, -28,  24,  14,  -5,  -4, -21,  -7, -33,
786
      0, -32, -15,  35,  12,   1, -11, -58,   5, -16,
787
    -28,   0,   1,  33,   0,  11, -39,   5, -14,   6,
788
      3,  31,  28,  -1, -53, -33, -19,  25,  46,  26,
789
    }, {
790
    -11, -14, -39, -27,   9, -17,  -4, -33,   6,   0,
791
      4,  -1,   5,  10, -17, -22,   5, -57,  -5,   9,
792
     20,  13,  18,  35, -11,   3, -16, -22,  17,  13,
793
     40,  19,  -1, -55, -35,  -5,  27,  44,  37,  49,
794
    }, {
795
    -80,   6, -16,  11,  30, -30,  -9, -28, -28, -29,
796
    -13,   6,  -2,  28,  -3,  -5,  -7, -60,   5,   9,
797
     11,  -1,  24,  19, -27,  13, -32,  13,  15,  19,
798
     19,  35,  17, -39, -43,  -9,   4,  42,  32,  41,
799
    }, {
800
     78, -21, -43,   4, -38,  17,  17,  -5,  55,  24,
801
    -15, -36,  14,   4,  24, -24,  12,   5,  17,  31,
802
    -54,  -5,  -2,  27,  43, -12,   2,   9,  -9, -15,
803
     22,  -3,  28,  21, -20,   3,  20,  28,   9,  -5,
804
    }, {
805
      9,  -1, -20,  43, -17,   3,  12,   0,  20,  -4,
806
    -33, -29,   6,  22,  38,  -7,   0,   1,  29,  30,
807
    -63, -21,   3,  11,  27,  -1, -14,  45, -10,  -9,
808
      1,  12,  47,  37, -28,   0,  -2,  26,   4, -13,
809
    }, {
810
     39, -14, -30,  -8, -22,  -8,  12, -12,  34,  27,
811
    -29,   2,  26,  -2,   8, -31,  16,   3,  17,  57,
812
    -14,  -6,  19,  13,  16, -10,   8,  17,  20,  -2,
813
     38,   0,  17, -16, -11,  27,  44,  45,  -4,   8,
814
    }, {
815
    -29,   5,  -7,  30,  -1, -21,   7,  -7,   0,   0,
816
    -47,   9,  18,  15,  22, -14,   4,   0,  28,  57,
817
    -23, -21,  25,  -2,   1,   0,  -7,  53,  19,   3,
818
     17,  15,  36,   0, -19,  24,  21,  43,  -9,   0,
819
    }, {
820
     33, -10, -34,   5, -17, -35,  15,   1,  53,  30,
821
      6, -59,   0, -10,  24, -13,  17, -27,   1,  -1,
822
    -37,  13,   4,  20,  20, -18, -10, -16,  -8, -11,
823
     39,  18,  26,   0, -46, -20,  41,  15,  37,  15,
824
    }, {
825
    -35,  10, -11,  44,   3, -48,  10,   6,  17,   2,
826
    -11, -51,  -8,   8,  38,   3,   4, -31,  12,  -2,
827
    -46,  -1,  10,   4,   5,  -7, -26,  19, -10,  -5,
828
     18,  34,  45,  15, -54, -24,  18,  13,  31,   7,
829
    }, {
830
     -5,  -3, -21,  -7,  -2, -60,  10,  -5,  32,  34,
831
     -7, -20,  11, -16,   8, -20,  21, -29,   1,  24,
832
      2,  13,  27,   6,  -5, -15,  -3,  -8,  21,   1,
833
     55,  21,  15, -38, -37,   3,  65,  32,  23,  30,
834
    }, {
835
    -74,  17,   0,  31,  18, -73,   5,   0,  -3,   5,
836
    -25, -12,   3,   1,  22,  -3,   9, -33,  12,  24,
837
     -6,  -2,  33,  -9, -21,  -5, -20,  27,  19,   7,
838
     34,  37,  34, -22, -44,   0,  41,  29,  17,  21,
839
    }, {
840
     76, -35, -31, -28, -49,  43, -40,   0,  29, -14,
841
      8,   5,  10,  18, -26, -46,   0,   7,   6,   3,
842
    -25,  -7,  -2,  40,  28,  14,  18,  -3, -27, -28,
843
     -8, -45, -13,  34, -13, -27, -15,  31,  12,   3,
844
    }, {
845
      7, -15,  -9,   9, -28,  29, -45,   5,  -6, -43,
846
     -9,  12,   2,  36, -12, -30, -11,   3,  17,   3,
847
    -34, -22,   3,  24,  12,  24,   2,  32, -28, -22,
848
    -29, -29,   5,  50, -21, -31, -38,  29,   7,  -5,
849
    }, {
850
     36, -29, -19, -41, -34,  18, -45,  -6,   8, -10,
851
     -5,  43,  23,  11, -42, -53,   5,   5,   6,  30,
852
     14,  -8,  20,  26,   1,  16,  25,   4,   3, -15,
853
      7, -41, -23,  -3,  -4,  -3,   8,  48,  -1,  17,
854
    }, {
855
    -32,  -8,   3,  -2, -13,   4, -50,  -1, -27, -39,
856
    -23,  51,  15,  30, -27, -37,  -7,   1,  17,  29,
857
      5, -23,  25,  10, -14,  26,   8,  41,   1,  -9,
858
    -13, -26,  -5,  12, -12,  -7, -14,  45,  -6,   9,
859
    }, {
860
     31, -24, -23, -27, -29,  -9, -43,   8,  26,  -7,
861
     30, -17,  -4,   3, -26, -35,   5, -24, -10, -28,
862
     -9,  12,   5,  33,   5,   8,   5, -29, -26, -24,
863
      9, -23, -14,  12, -39, -52,   5,  18,  39,  24,
864
    }, {
865
    -37,  -3,   0,  10,  -7, -22, -48,  12,  -8, -36,
866
     12,  -9, -12,  22, -12, -19,  -6, -28,   0, -29,
867
    -18,  -3,  11,  17, -10,  18, -10,   7, -27, -18,
868
    -11,  -7,   3,  28, -47, -55, -18,  15,  34,  16,
869
    }, {
870
     -8, -17, -10, -40, -13, -34, -47,   0,   5,  -4,
871
     16,  21,   8,  -2, -42, -43,  10, -26, -10,  -2,
872
     31,  11,  27,  19, -21,  10,  12, -20,   3, -11,
873
     25, -20, -25, -25, -29, -28,  28,  34,  25,  38,
874
    }, {
875
    -77,   2,  11,  -1,   7, -47, -52,   5, -29, -33,
876
     -1,  28,   0,  15, -28, -26,  -2, -30,   0,  -2,
877
     22,  -4,  33,   3, -36,  21,  -3,  15,   2,  -5,
878
      4,  -4,  -6,  -9, -37, -31,   5,  32,  20,  30,
879
    }, {
880
     81, -25, -14,  -8, -61,   0, -25,  28,  54,  20,
881
     -3, -14,  17,  -8,   0, -44,  16,  35,  13,  18,
882
    -43,  -7,   6,  11,  33,  -4,  30,  11, -22, -40,
883
      6, -43,   3,  50, -14, -18,  22,  18,  -1, -16,
884
    }, {
885
     12,  -4,   8,  29, -39, -12, -30,  33,  19,  -8,
886
    -21,  -6,   8,   9,  13, -28,   4,  31,  24,  18,
887
    -52, -23,  12,  -4,  18,   5,  14,  47, -24, -34,
888
    -14, -27,  22,  66, -22, -22,  -1,  16,  -6, -24,
889
    }, {
890
     41, -18,  -2, -21, -45, -24, -30,  21,  33,  24,
891
    -17,  24,  29, -15, -16, -51,  21,  33,  13,  45,
892
     -3,  -8,  28,  -2,   7,  -2,  37,  19,   7, -27,
893
     22, -39,  -7,  12,  -5,   5,  45,  35, -15,  -1,
894
    }, {
895
    -27,   1,  20,  17, -24, -38, -35,  26,  -1,  -4,
896
    -35,  32,  21,   3,  -2, -35,   8,  29,  24,  44,
897
    -12, -24,  34, -18,  -8,   7,  21,  55,   5, -21,
898
      2, -23,  11,  28, -13,   1,  22,  33, -21, -10,
899
    }, {
900
     36, -13,  -5,  -7, -40, -51, -28,  36,  52,  27,
901
     18, -36,   2, -22,   0, -33,  21,   2,  -3, -13,
902
    -26,  11,  14,   4,  10, -10,  18, -14, -22, -36,
903
     24, -21,   1,  28, -40, -42,  42,   5,  25,   5,
904
    }, {
905
    -32,   6,  17,  31, -19, -65, -33,  41,  16,  -1,
906
      0, -29,  -6,  -4,  13, -17,   9,  -1,   8, -14,
907
    -35,  -3,  19, -11,  -4,   0,   1,  21, -23, -30,
908
      3,  -5,  20,  44, -48, -46,  19,   3,  20,  -3,
909
    }, {
910
     -3,  -7,   6, -20, -25, -77, -32,  29,  31,  30,
911
      4,   2,  14, -29, -16, -40,  26,   0,  -3,  12,
912
     13,  10,  36,  -9, -15,  -8,  24,  -6,   7, -22,
913
     40, -17,  -8,  -9, -31, -18,  66,  22,  11,  19,
914
    }, {
915
    -72,  13,  29,  18,  -4, -90, -37,  34,  -4,   1,
916
    -13,   9,   6, -11,  -2, -24,  13,  -3,   7,  11,
917
      4,  -4,  42, -25, -31,   1,   8,  29,   6, -17,
918
     19,  -2,  10,   6, -38, -22,  42,  19,   6,  11,
919
    }, {
920
    116, -20, -68, -30, -28,  83,  28, -18,  32, -22,
921
    -13, -21,   5,  28,   5,  -7, -24,  -8, -22,  17,
922
    -23,  30, -25,  45,  15,  -9, -11, -18,  22, -10,
923
      4,  -2,  19, -12,  23,   3, -43,   2,  12,  -4,
924
    }, {
925
     47,   0, -45,   7,  -7,  69,  23, -13,  -2, -51,
926
    -32, -14,  -3,  47,  19,   8, -37, -11, -10,  16,
927
    -32,  15, -19,  29,   0,   1, -28,  18,  20,  -4,
928
    -16,  13,  38,   3,  15,   0, -66,   0,   7, -13,
929
    }, {
930
     77, -13, -56, -43, -13,  57,  23, -26,  11, -19,
931
    -27,  16,  17,  22, -10, -15, -19, -10, -22,  43,
932
     16,  30,  -2,  31, -11,  -6,  -5,  -9,  52,   2,
933
     20,   0,   8, -50,  33,  27, -19,  19,  -1,   9,
934
    }, {
935
      8,   6, -33,  -4,   7,  44,  18, -21, -23, -48,
936
    -46,  24,   9,  40,   3,   1, -32, -13, -11,  43,
937
      7,  14,   3,  15, -26,   3, -21,  26,  50,   8,
938
      0,  16,  27, -34,  25,  23, -43,  17,  -6,   1,
939
    }, {
940
     71,  -9, -59, -29,  -8,  30,  26, -11,  30, -16,
941
      8, -44,  -9,  14,   5,   2, -19, -40, -38, -15,
942
     -7,  50, -17,  38,  -7, -14, -24, -43,  22,  -6,
943
     22,  19,  17, -34,  -2, -20, -23, -10,  39,  16,
944
    }, {
945
      2,  11, -36,   9,  13,  17,  21,  -6,  -5, -45,
946
    -10, -36, -18,  33,  19,  19, -31, -44, -27, -15,
947
    -16,  34, -11,  22, -22,  -4, -40,  -7,  21,   0,
948
      1,  35,  36, -18, -10, -24, -46, -12,  34,   8,
949
    }, {
950
     32,  -2, -47, -42,   7,   5,  21, -18,   9, -12,
951
     -5,  -5,   2,   8, -10,  -4, -14, -42, -38,  10,
952
     33,  49,   5,  24, -33, -12, -17, -35,  52,   6,
953
     38,  22,   7, -72,   7,   3,   0,   6,  25,  30,
954
    }, {
955
    -36,  18, -24,  -3,  28,  -7,  16, -13, -26, -41,
956
    -24,   1,  -5,  26,   3,  12, -27, -46, -27,  10,
957
     24,  34,  10,   8, -49,  -2, -34,   0,  51,  12,
958
     17,  38,  25, -56,   0,   0, -22,   3,  20,  22,
959
    }, {
960
    121,  -9, -50, -10, -40,  40,  43,   9,  58,  12,
961
    -25, -41,  11,   2,  31,  -5,  -8,  19, -15,  32,
962
    -41,  30, -16,  16,  20, -28,   0,  -3,  26, -22,
963
     19,   0,  36,   4,  22,  12,  -6,  -9,  -1, -24,
964
    }, {
965
     52,  10, -27,  27, -18,  26,  38,  14,  23, -16,
966
    -44, -33,   3,  20,  45,  10, -20,  15,  -3,  31,
967
    -50,  14, -10,   0,   5, -17, -15,  32,  24, -16,
968
     -1,  15,  55,  20,  14,   8, -29, -12,  -7, -32,
969
    }, {
970
     82,  -3, -38, -23, -24,  15,  38,   2,  37,  15,
971
    -39,  -2,  23,  -4,  15, -12,  -3,  17, -15,  58,
972
     -1,  29,   6,   2,  -5, -26,   7,   4,  56,  -9,
973
     35,   3,  25, -33,  32,  36,  17,   7, -15,  -9,
974
    }, {
975
     13,  17, -15,  15,  -3,   1,  33,   7,   1, -12,
976
    -58,   5,  15,  13,  29,   3, -16,  13,  -4,  57,
977
    -10,  13,  11, -13, -21, -15,  -9,  40,  55,  -3,
978
     14,  19,  44, -17,  24,  32,  -5,   4, -21, -18,
979
    }, {
980
     76,   1, -41,  -9, -19, -12,  41,  17,  55,  18,
981
     -3, -63,  -3, -12,  30,   5,  -3, -12, -31,   0,
982
    -24,  49,  -8,   9,  -1, -33, -12, -29,  27, -18,
983
     37,  21,  34, -17,  -3, -11,  14, -23,  25,  -2,
984
    }, {
985
      7,  22, -18,  29,   1, -25,  36,  21,  20,  -9,
986
    -22, -56, -11,   6,  45,  21, -15, -16, -20,  -1,
987
    -33,  34,  -2,  -6, -17, -23, -28,   6,  25, -12,
988
     16,  37,  53,  -1, -11, -15,  -8, -25,  20, -11,
989
    }, {
990
     37,   8, -29, -22,  -4, -37,  36,   9,  34,  22,
991
    -17, -24,   8, -18,  15,  -2,   1, -14, -31,  25,
992
     15,  48,  13,  -4, -28, -31,  -5, -21,  57,  -4,
993
     53,  24,  23, -55,   6,  12,  37,  -6,  11,  11,
994
    }, {
995
    -31,  28,  -6,  16,  16, -50,  31,  14,   0,  -6,
996
    -36, -17,   0,   0,  29,  14, -11, -18, -20,  25,
997
      6,  33,  19, -20, -43, -21, -21,  14,  55,   0,
998
     32,  40,  42, -39,  -1,   8,  14,  -8,   6,   3,
999
    }, {
1000
    119, -24, -39, -44, -51,  66, -14,  15,  31, -26,
1001
     -1,   0,   7,  16, -19, -28, -19,  22, -26,   4,
1002
    -13,  28, -16,  29,   5,  -1,  16, -16,   8, -35,
1003
    -10, -42,  -4,  17,  29, -19, -42,  -7,   0, -15,
1004
    }, {
1005
     50,  -3, -16,  -5, -30,  53, -19,  20,  -3, -55,
1006
    -19,   8,   0,  34,  -5, -11, -32,  18, -15,   4,
1007
    -22,  13, -10,  13,  -9,   8,   0,  19,   7, -29,
1008
    -31, -26,  13,  33,  21, -22, -65,  -9,  -4, -23,
1009
    }, {
1010
     79, -17, -27, -56, -36,  41, -19,   8,  10, -22,
1011
    -15,  39,  20,   9, -35, -35, -15,  20, -26,  31,
1012
     26,  27,   6,  15, -20,   0,  23,  -8,  38, -22,
1013
      5, -38, -15, -20,  39,   4, -18,   9, -13,  -1,
1014
    }, {
1015
     10,   3,  -4, -18, -15,  27, -24,  13, -24, -51,
1016
    -34,  47,  12,  28, -21, -19, -27,  16, -15,  30,
1017
     17,  12,  12,   0, -36,  10,   7,  27,  37, -16,
1018
    -15, -22,   3,  -4,  31,   1, -42,   7, -18,  -9,
1019
    }, {
1020
     74, -12, -30, -42, -30,  14, -16,  23,  29, -19,
1021
     20, -21,  -7,   1, -19, -17, -14, -10, -43, -27,
1022
      3,  48,  -8,  22, -16,  -7,   4, -42,   9, -31,
1023
      6, -20,  -6,  -4,   3, -43, -22, -20,  28,   5,
1024
    }, {
1025
      5,   7,  -7,  -4,  -9,   0, -21,  28,  -6, -48,
1026
      2, -14, -15,  20,  -5,   0, -27, -14, -32, -28,
1027
     -5,  32,  -2,   6, -32,   3, -12,  -5,   8, -25,
1028
    -14,  -4,  12,  11,  -4, -47, -45, -22,  22,  -2,
1029
    }, {
1030
     34,  -6, -18, -55, -15, -11, -21,  16,   8, -16,
1031
      6,  16,   5,  -4, -35, -24, -10, -12, -43,  -1,
1032
     43,  47,  14,   8, -43,  -5,  10, -34,  39, -18,
1033
     22, -16, -17, -42,  13, -19,   1,  -3,  14,  20,
1034
    }, {
1035
    -34,  14,   4, -17,   5, -24, -26,  20, -27, -45,
1036
    -12,  24,  -2,  13, -21,  -8, -22, -16, -32,  -2,
1037
     34,  31,  20,  -7, -58,   5,  -5,   2,  38, -12,
1038
      2,  -1,   1, -26,   5, -23, -21,  -6,   8,  11,
1039
    }, {
1040
    124, -13, -21, -23, -62,  23,   0,  43,  57,   8,
1041
    -13, -18,  14, -10,   6, -26,  -3,  49, -19,  19,
1042
    -31,  27,  -7,   0,  11, -20,  29,  -1,  12, -47,
1043
      4, -39,  11,  34,  28,  -9,  -5, -19, -13, -34,
1044
    }, {
1045
     55,   6,   1,  14, -41,  10,  -4,  48,  22, -20,
1046
    -31, -10,   5,   7,  20,  -9, -16,  45,  -8,  19,
1047
    -40,  12,  -1, -15,  -4, -10,  12,  34,  11, -41,
1048
    -16, -24,  30,  49,  20, -13, -28, -22, -18, -43,
1049
    }, {
1050
     84,  -6,  -9, -36, -47,  -1,  -4,  36,  36,  12,
1051
    -27,  20,  26, -17,  -9, -33,   1,  47, -19,  46,
1052
      9,  27,  15, -13, -15, -18,  35,   6,  42, -33,
1053
     20, -36,   1,  -4,  38,  14,  18,  -2, -27, -20,
1054
    }, {
1055
     15,  13,  13,   1, -26, -14,  -9,  41,   1, -16,
1056
    -46,  27,  18,   1,   4, -16, -11,  43,  -8,  45,
1057
      0,  11,  21, -29, -30,  -8,  19,  42,  41, -28,
1058
      0, -20,  20,  11,  30,  10,  -4,  -5, -32, -28,
1059
    }, {
1060
     79,  -2, -12, -22, -42, -28,  -1,  51,  54,  15,
1061
      8, -41,   0, -24,   6, -15,   1,  17, -36, -12,
1062
    -14,  47,   0,  -6, -11, -26,  16, -27,  13, -43,
1063
     22, -18,  10,  12,   2, -34,  15, -33,  13, -13,
1064
    }, {
1065
     10,  18,  10,  15, -21, -41,  -6,  56,  19, -13,
1066
     -9, -33,  -9,  -6,  20,   1, -11,  13, -24, -13,
1067
    -23,  32,   6, -22, -26, -15,   0,   8,  12, -37,
1068
      1,  -2,  28,  27,  -5, -37,  -7, -35,   8, -21,
1069
    }, {
1070
     39,   4,   0, -35, -27, -53,  -6,  44,  33,  18,
1071
     -5,  -2,  11, -31,  -9, -22,   6,  15, -36,  13,
1072
     25,  46,  23, -20, -37, -24,  23, -19,  43, -29,
1073
     38, -14,   0, -26,  12, -10,  38, -16,   0,   0,
1074
    }, {
1075
    -29,  25,  22,   2,  -6, -67, -11,  49,  -1, -10,
1076
    -24,   5,   3, -13,   4,  -5,  -6,  11, -25,  12,
1077
     16,  31,  28, -36, -53, -13,   6,  16,  42, -24,
1078
     17,   1,  18, -10,   4, -13,  15, -18,  -5,  -7,
1079
    }, {
1080
     29, -25, -22,  -2,   6,  67,  11, -49,   1,  10,
1081
     24,  -5,  -3,  13,  -4,   5,   6, -11,  25, -12,
1082
    -16, -31, -28,  36,  53,  13,  -6, -16, -42,  24,
1083
    -17,  -1, -18,  10,  -4,  13, -15,  18,   5,   7,
1084
    }, {
1085
    -39,  -4,   0,  35,  27,  53,   6, -44, -33, -18,
1086
      5,   2, -11,  31,   9,  22,  -6, -15,  36, -13,
1087
    -25, -46, -23,  20,  37,  24, -23,  19, -43,  29,
1088
    -38,  14,   0,  26, -12,  10, -38,  16,   0,   0,
1089
    }, {
1090
    -10, -18, -10, -15,  21,  41,   6, -56, -19,  13,
1091
      9,  33,   9,   6, -20,  -1,  11, -13,  24,  13,
1092
     23, -32,  -6,  22,  26,  15,   0,  -8, -12,  37,
1093
     -1,   2, -28, -27,   5,  37,   7,  35,  -8,  21,
1094
    }, {
1095
    -79,   2,  12,  22,  42,  28,   1, -51, -54, -15,
1096
     -8,  41,   0,  24,  -6,  15,  -1, -17,  36,  12,
1097
     14, -47,   0,   6,  11,  26, -16,  27, -13,  43,
1098
    -22,  18, -10, -12,  -2,  34, -15,  33, -13,  13,
1099
    }, {
1100
    -15, -13, -13,  -1,  26,  14,   9, -41,  -1,  16,
1101
     46, -27, -18,  -1,  -4,  16,  11, -43,   8, -45,
1102
      0, -11, -21,  29,  30,   8, -19, -42, -41,  28,
1103
      0,  20, -20, -11, -30, -10,   4,   5,  32,  28,
1104
    }, {
1105
    -84,   6,   9,  36,  47,   1,   4, -36, -36, -12,
1106
     27, -20, -26,  17,   9,  33,  -1, -47,  19, -46,
1107
     -9, -27, -15,  13,  15,  18, -35,  -6, -42,  33,
1108
    -20,  36,  -1,   4, -38, -14, -18,   2,  27,  20,
1109
    }, {
1110
    -55,  -6,  -1, -14,  41, -10,   4, -48, -22,  20,
1111
     31,  10,  -5,  -7, -20,   9,  16, -45,   8, -19,
1112
     40, -12,   1,  15,   4,  10, -12, -34, -11,  41,
1113
     16,  24, -30, -49, -20,  13,  28,  22,  18,  43,
1114
    }, {
1115
   -124,  13,  21,  23,  62, -23,   0, -43, -57,  -8,
1116
     13,  18, -14,  10,  -6,  26,   3, -49,  19, -19,
1117
     31, -27,   7,   0, -11,  20, -29,   1, -12,  47,
1118
     -4,  39, -11, -34, -28,   9,   5,  19,  13,  34,
1119
    }, {
1120
     34, -14,  -4,  17,  -5,  24,  26, -20,  27,  45,
1121
     12, -24,   2, -13,  21,   8,  22,  16,  32,   2,
1122
    -34, -31, -20,   7,  58,  -5,   5,  -2, -38,  12,
1123
     -2,   1,  -1,  26,  -5,  23,  21,   6,  -8, -11,
1124
    }, {
1125
    -34,   6,  18,  55,  15,  11,  21, -16,  -8,  16,
1126
     -6, -16,  -5,   4,  35,  24,  10,  12,  43,   1,
1127
    -43, -47, -14,  -8,  43,   5, -10,  34, -39,  18,
1128
    -22,  16,  17,  42, -13,  19,  -1,   3, -14, -20,
1129
    }, {
1130
     -5,  -7,   7,   4,   9,   0,  21, -28,   6,  48,
1131
     -2,  14,  15, -20,   5,   0,  27,  14,  32,  28,
1132
      5, -32,   2,  -6,  32,  -3,  12,   5,  -8,  25,
1133
     14,   4, -12, -11,   4,  47,  45,  22, -22,   2,
1134
    }, {
1135
    -74,  12,  30,  42,  30, -14,  16, -23, -29,  19,
1136
    -20,  21,   7,  -1,  19,  17,  14,  10,  43,  27,
1137
     -3, -48,   8, -22,  16,   7,  -4,  42,  -9,  31,
1138
     -6,  20,   6,   4,  -3,  43,  22,  20, -28,  -5,
1139
    }, {
1140
    -10,  -3,   4,  18,  15, -27,  24, -13,  24,  51,
1141
     34, -47, -12, -28,  21,  19,  27, -16,  15, -30,
1142
    -17, -12, -12,   0,  36, -10,  -7, -27, -37,  16,
1143
     15,  22,  -3,   4, -31,  -1,  42,  -7,  18,   9,
1144
    }, {
1145
    -79,  17,  27,  56,  36, -41,  19,  -8, -10,  22,
1146
     15, -39, -20,  -9,  35,  35,  15, -20,  26, -31,
1147
    -26, -27,  -6, -15,  20,   0, -23,   8, -38,  22,
1148
     -5,  38,  15,  20, -39,  -4,  18,  -9,  13,   1,
1149
    }, {
1150
    -50,   3,  16,   5,  30, -53,  19, -20,   3,  55,
1151
     19,  -8,   0, -34,   5,  11,  32, -18,  15,  -4,
1152
     22, -13,  10, -13,   9,  -8,   0, -19,  -7,  29,
1153
     31,  26, -13, -33, -21,  22,  65,   9,   4,  23,
1154
    }, {
1155
   -119,  24,  39,  44,  51, -66,  14, -15, -31,  26,
1156
      1,   0,  -7, -16,  19,  28,  19, -22,  26,  -4,
1157
     13, -28,  16, -29,  -5,   1, -16,  16,  -8,  35,
1158
     10,  42,   4, -17, -29,  19,  42,   7,   0,  15,
1159
    }, {
1160
     31, -28,   6, -16, -16,  50, -31, -14,   0,   6,
1161
     36,  17,   0,   0, -29, -14,  11,  18,  20, -25,
1162
     -6, -33, -19,  20,  43,  21,  21, -14, -55,   0,
1163
    -32, -40, -42,  39,   1,  -8, -14,   8,  -6,  -3,
1164
    }, {
1165
    -37,  -8,  29,  22,   4,  37, -36,  -9, -34, -22,
1166
     17,  24,  -8,  18, -15,   2,  -1,  14,  31, -25,
1167
    -15, -48, -13,   4,  28,  31,   5,  21, -57,   4,
1168
    -53, -24, -23,  55,  -6, -12, -37,   6, -11, -11,
1169
    }, {
1170
     -7, -22,  18, -29,  -1,  25, -36, -21, -20,   9,
1171
     22,  56,  11,  -6, -45, -21,  15,  16,  20,   1,
1172
     33, -34,   2,   6,  17,  23,  28,  -6, -25,  12,
1173
    -16, -37, -53,   1,  11,  15,   8,  25, -20,  11,
1174
    }, {
1175
    -76,  -1,  41,   9,  19,  12, -41, -17, -55, -18,
1176
      3,  63,   3,  12, -30,  -5,   3,  12,  31,   0,
1177
     24, -49,   8,  -9,   1,  33,  12,  29, -27,  18,
1178
    -37, -21, -34,  17,   3,  11, -14,  23, -25,   2,
1179
    }, {
1180
    -13, -17,  15, -15,   3,  -1, -33,  -7,  -1,  12,
1181
     58,  -5, -15, -13, -29,  -3,  16, -13,   4, -57,
1182
     10, -13, -11,  13,  21,  15,   9, -40, -55,   3,
1183
    -14, -19, -44,  17, -24, -32,   5,  -4,  21,  18,
1184
    }, {
1185
    -82,   3,  38,  23,  24, -15, -38,  -2, -37, -15,
1186
     39,   2, -23,   4, -15,  12,   3, -17,  15, -58,
1187
      1, -29,  -6,  -2,   5,  26,  -7,  -4, -56,   9,
1188
    -35,  -3, -25,  33, -32, -36, -17,  -7,  15,   9,
1189
    }, {
1190
    -52, -10,  27, -27,  18, -26, -38, -14, -23,  16,
1191
     44,  33,  -3, -20, -45, -10,  20, -15,   3, -31,
1192
     50, -14,  10,   0,  -5,  17,  15, -32, -24,  16,
1193
      1, -15, -55, -20, -14,  -8,  29,  12,   7,  32,
1194
    }, {
1195
   -121,   9,  50,  10,  40, -40, -43,  -9, -58, -12,
1196
     25,  41, -11,  -2, -31,   5,   8, -19,  15, -32,
1197
     41, -30,  16, -16, -20,  28,   0,   3, -26,  22,
1198
    -19,   0, -36,  -4, -22, -12,   6,   9,   1,  24,
1199
    }, {
1200
     36, -18,  24,   3, -28,   7, -16,  13,  26,  41,
1201
     24,  -1,   5, -26,  -3, -12,  27,  46,  27, -10,
1202
    -24, -34, -10,  -8,  49,   2,  34,   0, -51, -12,
1203
    -17, -38, -25,  56,   0,   0,  22,  -3, -20, -22,
1204
    }, {
1205
    -32,   2,  47,  42,  -7,  -5, -21,  18,  -9,  12,
1206
      5,   5,  -2,  -8,  10,   4,  14,  42,  38, -10,
1207
    -33, -49,  -5, -24,  33,  12,  17,  35, -52,  -6,
1208
    -38, -22,  -7,  72,  -7,  -3,   0,  -6, -25, -30,
1209
    }, {
1210
     -2, -11,  36,  -9, -13, -17, -21,   6,   5,  45,
1211
     10,  36,  18, -33, -19, -19,  31,  44,  27,  15,
1212
     16, -34,  11, -22,  22,   4,  40,   7, -21,   0,
1213
     -1, -35, -36,  18,  10,  24,  46,  12, -34,  -8,
1214
    }, {
1215
    -71,   9,  59,  29,   8, -30, -26,  11, -30,  16,
1216
     -8,  44,   9, -14,  -5,  -2,  19,  40,  38,  15,
1217
      7, -50,  17, -38,   7,  14,  24,  43, -22,   6,
1218
    -22, -19, -17,  34,   2,  20,  23,  10, -39, -16,
1219
    }, {
1220
     -8,  -6,  33,   4,  -7, -44, -18,  21,  23,  48,
1221
     46, -24,  -9, -40,  -3,  -1,  32,  13,  11, -43,
1222
     -7, -14,  -3, -15,  26,  -3,  21, -26, -50,  -8,
1223
      0, -16, -27,  34, -25, -23,  43, -17,   6,  -1,
1224
    }, {
1225
    -77,  13,  56,  43,  13, -57, -23,  26, -11,  19,
1226
     27, -16, -17, -22,  10,  15,  19,  10,  22, -43,
1227
    -16, -30,   2, -31,  11,   6,   5,   9, -52,  -2,
1228
    -20,   0,  -8,  50, -33, -27,  19, -19,   1,  -9,
1229
    }, {
1230
    -47,   0,  45,  -7,   7, -69, -23,  13,   2,  51,
1231
     32,  14,   3, -47, -19,  -8,  37,  11,  10, -16,
1232
     32, -15,  19, -29,   0,  -1,  28, -18, -20,   4,
1233
     16, -13, -38,  -3, -15,   0,  66,   0,  -7,  13,
1234
    }, {
1235
   -116,  20,  68,  30,  28, -83, -28,  18, -32,  22,
1236
     13,  21,  -5, -28,  -5,   7,  24,   8,  22, -17,
1237
     23, -30,  25, -45, -15,   9,  11,  18, -22,  10,
1238
     -4,   2, -19,  12, -23,  -3,  43,  -2, -12,   4,
1239
    }, {
1240
     72, -13, -29, -18,   4,  90,  37, -34,   4,  -1,
1241
     13,  -9,  -6,  11,   2,  24, -13,   3,  -7, -11,
1242
     -4,   4, -42,  25,  31,  -1,  -8, -29,  -6,  17,
1243
    -19,   2, -10,  -6,  38,  22, -42, -19,  -6, -11,
1244
    }, {
1245
      3,   7,  -6,  20,  25,  77,  32, -29, -31, -30,
1246
     -4,  -2, -14,  29,  16,  40, -26,   0,   3, -12,
1247
    -13, -10, -36,   9,  15,   8, -24,   6,  -7,  22,
1248
    -40,  17,   8,   9,  31,  18, -66, -22, -11, -19,
1249
    }, {
1250
     32,  -6, -17, -31,  19,  65,  33, -41, -16,   1,
1251
      0,  29,   6,   4, -13,  17,  -9,   1,  -8,  14,
1252
     35,   3, -19,  11,   4,   0,  -1, -21,  23,  30,
1253
     -3,   5, -20, -44,  48,  46, -19,  -3, -20,   3,
1254
    }, {
1255
    -36,  13,   5,   7,  40,  51,  28, -36, -52, -27,
1256
    -18,  36,  -2,  22,   0,  33, -21,  -2,   3,  13,
1257
     26, -11, -14,  -4, -10,  10, -18,  14,  22,  36,
1258
    -24,  21,  -1, -28,  40,  42, -42,  -5, -25,  -5,
1259
    }, {
1260
     27,  -1, -20, -17,  24,  38,  35, -26,   1,   4,
1261
     35, -32, -21,  -3,   2,  35,  -8, -29, -24, -44,
1262
     12,  24, -34,  18,   8,  -7, -21, -55,  -5,  21,
1263
     -2,  23, -11, -28,  13,  -1, -22, -33,  21,  10,
1264
    }, {
1265
    -41,  18,   2,  21,  45,  24,  30, -21, -33, -24,
1266
     17, -24, -29,  15,  16,  51, -21, -33, -13, -45,
1267
      3,   8, -28,   2,  -7,   2, -37, -19,  -7,  27,
1268
    -22,  39,   7, -12,   5,  -5, -45, -35,  15,   1,
1269
    }, {
1270
    -12,   4,  -8, -29,  39,  12,  30, -33, -19,   8,
1271
     21,   6,  -8,  -9, -13,  28,  -4, -31, -24, -18,
1272
     52,  23, -12,   4, -18,  -5, -14, -47,  24,  34,
1273
     14,  27, -22, -66,  22,  22,   1, -16,   6,  24,
1274
    }, {
1275
    -81,  25,  14,   8,  61,   0,  25, -28, -54, -20,
1276
      3,  14, -17,   8,   0,  44, -16, -35, -13, -18,
1277
     43,   7,  -6, -11, -33,   4, -30, -11,  22,  40,
1278
     -6,  43,  -3, -50,  14,  18, -22, -18,   1,  16,
1279
    }, {
1280
     77,  -2, -11,   1,  -7,  47,  52,  -5,  29,  33,
1281
      1, -28,   0, -15,  28,  26,   2,  30,   0,   2,
1282
    -22,   4, -33,  -3,  36, -21,   3, -15,  -2,   5,
1283
     -4,   4,   6,   9,  37,  31,  -5, -32, -20, -30,
1284
    }, {
1285
      8,  17,  10,  40,  13,  34,  47,   0,  -5,   4,
1286
    -16, -21,  -8,   2,  42,  43, -10,  26,  10,   2,
1287
    -31, -11, -27, -19,  21, -10, -12,  20,  -3,  11,
1288
    -25,  20,  25,  25,  29,  28, -28, -34, -25, -38,
1289
    }, {
1290
     37,   3,   0, -10,   7,  22,  48, -12,   8,  36,
1291
    -12,   9,  12, -22,  12,  19,   6,  28,   0,  29,
1292
     18,   3, -11, -17,  10, -18,  10,  -7,  27,  18,
1293
     11,   7,  -3, -28,  47,  55,  18, -15, -34, -16,
1294
    }, {
1295
    -31,  24,  23,  27,  29,   9,  43,  -8, -26,   7,
1296
    -30,  17,   4,  -3,  26,  35,  -5,  24,  10,  28,
1297
      9, -12,  -5, -33,  -5,  -8,  -5,  29,  26,  24,
1298
     -9,  23,  14, -12,  39,  52,  -5, -18, -39, -24,
1299
    }, {
1300
     32,   8,  -3,   2,  13,  -4,  50,   1,  27,  39,
1301
     23, -51, -15, -30,  27,  37,   7,  -1, -17, -29,
1302
     -5,  23, -25, -10,  14, -26,  -8, -41,  -1,   9,
1303
     13,  26,   5, -12,  12,   7,  14, -45,   6,  -9,
1304
    }, {
1305
    -36,  29,  19,  41,  34, -18,  45,   6,  -8,  10,
1306
      5, -43, -23, -11,  42,  53,  -5,  -5,  -6, -30,
1307
    -14,   8, -20, -26,  -1, -16, -25,  -4,  -3,  15,
1308
     -7,  41,  23,   3,   4,   3,  -8, -48,   1, -17,
1309
    }, {
1310
     -7,  15,   9,  -9,  28, -29,  45,  -5,   6,  43,
1311
      9, -12,  -2, -36,  12,  30,  11,  -3, -17,  -3,
1312
     34,  22,  -3, -24, -12, -24,  -2, -32,  28,  22,
1313
     29,  29,  -5, -50,  21,  31,  38, -29,  -7,   5,
1314
    }, {
1315
    -76,  35,  31,  28,  49, -43,  40,   0, -29,  14,
1316
     -8,  -5, -10, -18,  26,  46,   0,  -7,  -6,  -3,
1317
     25,   7,   2, -40, -28, -14, -18,   3,  27,  28,
1318
      8,  45,  13, -34,  13,  27,  15, -31, -12,  -3,
1319
    }, {
1320
     74, -17,   0, -31, -18,  73,  -5,   0,   3,  -5,
1321
     25,  12,  -3,  -1, -22,   3,  -9,  33, -12, -24,
1322
      6,   2, -33,   9,  21,   5,  20, -27, -19,  -7,
1323
    -34, -37, -34,  22,  44,   0, -41, -29, -17, -21,
1324
    }, {
1325
      5,   3,  21,   7,   2,  60, -10,   5, -32, -34,
1326
      7,  20, -11,  16,  -8,  20, -21,  29,  -1, -24,
1327
     -2, -13, -27,  -6,   5,  15,   3,   8, -21,  -1,
1328
    -55, -21, -15,  38,  37,  -3, -65, -32, -23, -30,
1329
    }, {
1330
     35, -10,  11, -44,  -3,  48, -10,  -6, -17,  -2,
1331
     11,  51,   8,  -8, -38,  -3,  -4,  31, -12,   2,
1332
     46,   1, -10,  -4,  -5,   7,  26, -19,  10,   5,
1333
    -18, -34, -45, -15,  54,  24, -18, -13, -31,  -7,
1334
    }, {
1335
    -33,  10,  34,  -5,  17,  35, -15,  -1, -53, -30,
1336
     -6,  59,   0,  10, -24,  13, -17,  27,  -1,   1,
1337
     37, -13,  -4, -20, -20,  18,  10,  16,   8,  11,
1338
    -39, -18, -26,   0,  46,  20, -41, -15, -37, -15,
1339
    }, {
1340
     29,  -5,   7, -30,   1,  21,  -7,   7,   0,   0,
1341
     47,  -9, -18, -15, -22,  14,  -4,   0, -28, -57,
1342
     23,  21, -25,   2,  -1,   0,   7, -53, -19,  -3,
1343
    -17, -15, -36,   0,  19, -24, -21, -43,   9,   0,
1344
    }, {
1345
    -39,  14,  30,   8,  22,   8, -12,  12, -34, -27,
1346
     29,  -2, -26,   2,  -8,  31, -16,  -3, -17, -57,
1347
     14,   6, -19, -13, -16,  10,  -8, -17, -20,   2,
1348
    -38,   0, -17,  16,  11, -27, -44, -45,   4,  -8,
1349
    }, {
1350
     -9,   1,  20, -43,  17,  -3, -12,   0, -20,   4,
1351
     33,  29,  -6, -22, -38,   7,   0,  -1, -29, -30,
1352
     63,  21,  -3, -11, -27,   1,  14, -45,  10,   9,
1353
     -1, -12, -47, -37,  28,   0,   2, -26,  -4,  13,
1354
    }, {
1355
    -78,  21,  43,  -4,  38, -17, -17,   5, -55, -24,
1356
     15,  36, -14,  -4, -24,  24, -12,  -5, -17, -31,
1357
     54,   5,   2, -27, -43,  12,  -2,  -9,   9,  15,
1358
    -22,   3, -28, -21,  20,  -3, -20, -28,  -9,   5,
1359
    }, {
1360
     80,  -6,  16, -11, -30,  30,   9,  28,  28,  29,
1361
     13,  -6,   2, -28,   3,   5,   7,  60,  -5,  -9,
1362
    -11,   1, -24, -19,  27, -13,  32, -13, -15, -19,
1363
    -19, -35, -17,  39,  43,   9,  -4, -42, -32, -41,
1364
    }, {
1365
     11,  14,  39,  27,  -9,  17,   4,  33,  -6,   0,
1366
     -4,   1,  -5, -10,  17,  22,  -5,  57,   5,  -9,
1367
    -20, -13, -18, -35,  11,  -3,  16,  22, -17, -13,
1368
    -40, -19,   1,  55,  35,   5, -27, -44, -37, -49,
1369
    }, {
1370
     40,   0,  28, -24, -14,   5,   4,  21,   7,  33,
1371
      0,  32,  15, -35, -12,  -1,  11,  58,  -5,  16,
1372
     28,   0,  -1, -33,   0, -11,  39,  -5,  14,  -6,
1373
     -3, -31, -28,   1,  53,  33,  19, -25, -46, -26,
1374
    }, {
1375
    -28,  20,  51,  14,   6,  -7,   0,  26, -27,   4,
1376
    -18,  40,   6, -16,   1,  15,   0,  55,   5,  16,
1377
     19, -14,   3, -49, -14,  -1,  22,  30,  12,   0,
1378
    -24, -15,  -9,  17,  45,  29,  -4, -28, -51, -35,
1379
    }, {
1380
     34,   4,  25, -10,  -9, -21,   7,  36,  26,  36,
1381
     35, -28, -12, -42,   3,  16,  12,  28, -21, -42,
1382
      5,  21, -16, -26,   4, -19,  19, -39, -15, -15,
1383
     -1, -13, -19,  17,  17, -14,  15, -55,  -4, -19,
1384
    }, {
1385
    -34,  25,  48,  28,  11, -34,   2,  41,  -9,   7,
1386
     17, -21, -20, -24,  17,  33,   0,  24, -10, -42,
1387
     -3,   5, -10, -42, -11,  -8,   3,  -3, -16,  -9,
1388
    -22,   2,   0,  33,  10, -18,  -7, -58, -10, -28,
1389
    }, {
1390
     -4,  11,  37, -23,   5, -46,   2,  29,   5,  39,
1391
     21,   9,   0, -49, -12,   9,  16,  26, -22, -15,
1392
     45,  20,   5, -40, -22, -17,  26, -31,  14,  -2,
1393
     14, -10, -30, -20,  27,   9,  39, -39, -18,  -5,
1394
    }, {
1395
    -73,  32,  60,  15,  26, -59,  -2,  33, -30,  10,
1396
      3,  17,  -8, -30,   1,  26,   4,  22, -10, -16,
1397
     36,   5,  11, -56, -37,  -6,  10,   5,  13,   3,
1398
     -6,   5, -11,  -4,  19,   5,  16, -41, -24, -13
1399
    }
1400
};
1401
1402
const uint16_t ff_cb1_base[128]={
1403
    19657, 18474, 18365, 17520, 21048, 18231, 18584, 16671,
1404
    20363, 19069, 19409, 18430, 21844, 18753, 19613, 17411,
1405
    20389, 21772, 20129, 21702, 20978, 20472, 19627, 19387,
1406
    21477, 23134, 21841, 23919, 22089, 21519, 21134, 20852,
1407
    19675, 17821, 19044, 17477, 19986, 16955, 18446, 16086,
1408
    21138, 18899, 20952, 18929, 21452, 17833, 20104, 17159,
1409
    19770, 20056, 20336, 20866, 19329, 18217, 18908, 18004,
1410
    21556, 21948, 23079, 23889, 20922, 19544, 20984, 19781,
1411
    19781, 20984, 19544, 20922, 23889, 23079, 21948, 21556,
1412
    18004, 18908, 18217, 19329, 20866, 20336, 20056, 19770,
1413
    17159, 20104, 17833, 21452, 18929, 20952, 18899, 21138,
1414
    16086, 18446, 16955, 19986, 17477, 19044, 17821, 19675,
1415
    20852, 21134, 21519, 22089, 23919, 21841, 23134, 21477,
1416
    19387, 19627, 20472, 20978, 21702, 20129, 21772, 20389,
1417
    17411, 19613, 18753, 21844, 18430, 19409, 19069, 20363,
1418
    16671, 18584, 18231, 21048, 17520, 18365, 18474, 19657,
1419
};
1420
1421
const uint16_t ff_cb2_base[128]={
1422
    12174, 13380, 13879, 13832, 13170, 13227, 13204, 12053,
1423
    12410, 13988, 14348, 14631, 13100, 13415, 13224, 12268,
1424
    11982, 13825, 13499, 14210, 13877, 14788, 13811, 13109,
1425
    11449, 13275, 12833, 13717, 12728, 13696, 12759, 12405,
1426
    10230, 12185, 11628, 13161, 11762, 13458, 12312, 12818,
1427
    10443, 12773, 12011, 14020, 11818, 13825, 12453, 13226,
1428
    10446, 13162, 11881, 14300, 12859, 16288, 13490, 15053,
1429
    10155, 12820, 11519, 13973, 12041, 15081, 12635, 14198,
1430
    14198, 12635, 15081, 12041, 13973, 11519, 12820, 10155,
1431
    15053, 13490, 16288, 12859, 14300, 11881, 13162, 10446,
1432
    13226, 12453, 13825, 11818, 14020, 12011, 12773, 10443,
1433
    12818, 12312, 13458, 11762, 13161, 11628, 12185, 10230,
1434
    12405, 12759, 13696, 12728, 13717, 12833, 13275, 11449,
1435
    13109, 13811, 14788, 13877, 14210, 13499, 13825, 11982,
1436
    12268, 13224, 13415, 13100, 14631, 14348, 13988, 12410,
1437
    12053, 13204, 13227, 13170, 13832, 13879, 13380, 12174,
1438
};
1439
1440
const int16_t ff_energy_tab[32]={
1441
        0,    16,    20,    25,    32,    41,    51,    65,
1442
       81,   103,   129,   163,   205,   259,   326,   410,
1443
      516,   650,   819,  1031,  1298,  1634,  2057,  2590,
1444
     3261,  4105,  5168,  6507,  8192, 10313, 12983, 16345
1445
};
1446
1447
static const int16_t lpc_refl_cb1[64]={
1448
    -4041, -4018, -3998, -3977, -3954, -3930, -3906, -3879,
1449
    -3852, -3825, -3795, -3764, -3731, -3699, -3666, -3631,
1450
    -3594, -3555, -3513, -3468, -3420, -3372, -3321, -3268,
1451
    -3212, -3153, -3090, -3021, -2944, -2863, -2772, -2676,
1452
    -2565, -2445, -2328, -2202, -2072, -1941, -1808, -1660,
1453
    -1508, -1348, -1185,  -994,  -798,  -600,  -374,  -110,
1454
      152,   447,   720,   982,  1229,  1456,  1682,  1916,
1455
     2130,  2353,  2595,  2853,  3118,  3363,  3588,  3814
1456
};
1457
1458
static const int16_t lpc_refl_cb2[32]={
1459
    -3091, -2386, -1871, -1425, -1021,  -649,  -316,   -20,
1460
      267,   544,   810,  1065,  1305,  1534,  1756,  1970,
1461
     2171,  2359,  2536,  2700,  2854,  2996,  3133,  3263,
1462
     3386,  3499,  3603,  3701,  3789,  3870,  3947,  4020
1463
};
1464
1465
static const int16_t lpc_refl_cb3[32]={
1466
    -3525, -3295, -3081, -2890, -2696, -2511, -2328, -2149,
1467
    -1979, -1817, -1658, -1498, -1341, -1188, -1032,  -876,
1468
     -721,  -561,  -394,  -228,   -54,   119,   296,   484,
1469
      683,   895,  1123,  1373,  1651,  1965,  2360,  2854
1470
};
1471
1472
static const int16_t lpc_refl_cb4[16]={
1473
    -1845, -1057,  -522,   -77,   301,   647,   975,  1285,
1474
     1582,  1873,  2163,  2452,  2735,  3017,  3299,  3569
1475
};
1476
1477
static const int16_t lpc_refl_cb5[16]={
1478
    -2691, -2187, -1788, -1435, -1118,  -837,  -571,  -316,
1479
      -59,   201,   470,   759,  1077,  1457,  1908,  2495
1480
};
1481
1482
static const int16_t lpc_refl_cb6[8]={
1483
    -1372,  -474,   133,   632,  1100,  1571,  2075,  2672
1484
};
1485
1486
static const int16_t lpc_refl_cb7[8]={
1487
    -2389, -1787, -1231,  -717,  -239,   234,   770,  1474
1488
};
1489
1490
static const int16_t lpc_refl_cb8[8]={
1491
    -1569,  -864,  -296,   200,   670,  1151,  1709,  2385
1492
};
1493
1494
static const int16_t lpc_refl_cb9[8]={
1495
    -2200, -1608, -1062,  -569,  -120,   338,   863,  1621
1496
};
1497
1498
static const int16_t lpc_refl_cb10[4]={
1499
     -617,   190,   802,  1483
1500
};
1501
1502
const int16_t * const ff_lpc_refl_cb[10]={
1503
    lpc_refl_cb1, lpc_refl_cb2, lpc_refl_cb3, lpc_refl_cb4, lpc_refl_cb5,
1504
    lpc_refl_cb6, lpc_refl_cb7, lpc_refl_cb8, lpc_refl_cb9, lpc_refl_cb10
1505
};
1506
1507
24376
static void add_wav(int16_t *dest, int n, int skip_first, int *m,
1508
                    const int16_t *s1, const int8_t *s2, const int8_t *s3)
1509
{
1510
    int i;
1511
    int v[3];
1512
1513
24376
    v[0] = 0;
1514
96970
    for (i=!skip_first; i<3; i++)
1515
72594
        v[i] = (ff_gain_val_tab[n][i] * (unsigned)m[i]) >> ff_gain_exp_tab[n];
1516
1517
24376
    if (v[0]) {
1518
964525
        for (i=0; i < BLOCKSIZE; i++)
1519
941000
            dest[i] = (int)((s1[i]*(unsigned)v[0]) + s2[i]*v[1] + s3[i]*v[2]) >> 12;
1520
    } else {
1521
34891
        for (i=0; i < BLOCKSIZE; i++)
1522
34040
            dest[i] = (             s2[i]*v[1] + s3[i]*v[2]) >> 12;
1523
    }
1524
24376
}
1525
1526
/**
1527
 * Copy the last offset values of *source to *target. If those values are not
1528
 * enough to fill the target buffer, fill it with another copy of those values.
1529
 */
1530
25039
void ff_copy_and_dup(int16_t *target, const int16_t *source, int offset)
1531
{
1532
25039
    source += BUFFERSIZE - offset;
1533
1534
25039
    memcpy(target, source, FFMIN(BLOCKSIZE, offset)*sizeof(*target));
1535
25039
    if (offset < BLOCKSIZE)
1536
2697
        memcpy(target + offset, source, (BLOCKSIZE - offset)*sizeof(*target));
1537
25039
}
1538
1539
/**
1540
 * Evaluate the reflection coefficients from the filter coefficients.
1541
 *
1542
 * @return 1 if one of the reflection coefficients is greater than
1543
 *         4095, 0 if not.
1544
 */
1545
18656
int ff_eval_refl(int *refl, const int16_t *coefs, AVCodecContext *avctx)
1546
{
1547
    int b, i, j;
1548
    int buffer1[LPC_ORDER];
1549
    int buffer2[LPC_ORDER];
1550
18656
    int *bp1 = buffer1;
1551
18656
    int *bp2 = buffer2;
1552
1553
205216
    for (i=0; i < LPC_ORDER; i++)
1554
186560
        buffer2[i] = coefs[i];
1555
1556
18656
    refl[LPC_ORDER-1] = bp2[LPC_ORDER-1];
1557
1558
18656
    if ((unsigned) bp2[LPC_ORDER-1] + 0x1000 > 0x1fff) {
1559
        av_log(avctx, AV_LOG_ERROR, "Overflow. Broken sample?\n");
1560
        return 1;
1561
    }
1562
1563
186179
    for (i = LPC_ORDER-2; i >= 0; i--) {
1564
167701
        b = 0x1000-((bp2[i+1] * bp2[i+1]) >> 12);
1565
1566
167701
        if (!b)
1567
            b = -2;
1568
1569
167701
        b = 0x1000000 / b;
1570
1006983
        for (j=0; j <= i; j++) {
1571
#if CONFIG_FTRAPV
1572
            int a = bp2[j] - ((int)(refl[i+1] * (unsigned)bp2[i-j]) >> 12);
1573
            if((int)(a*(unsigned)b) != a*(int64_t)b)
1574
                return 1;
1575
#endif
1576
839282
            bp1[j] = (int)((bp2[j] - ((int)(refl[i+1] * (unsigned)bp2[i-j]) >> 12)) * (unsigned)b) >> 12;
1577
        }
1578
1579
167701
        if ((unsigned) bp1[i] + 0x1000 > 0x1fff)
1580
178
            return 1;
1581
1582
167523
        refl[i] = bp1[i];
1583
1584
167523
        FFSWAP(int *, bp1, bp2);
1585
    }
1586
18478
    return 0;
1587
}
1588
1589
/**
1590
 * Evaluate the LPC filter coefficients from the reflection coefficients.
1591
 * Does the inverse of the ff_eval_refl() function.
1592
 */
1593
6094
void ff_eval_coefs(int *coefs, const int *refl)
1594
{
1595
    int buffer[LPC_ORDER];
1596
6094
    int *b1 = buffer;
1597
6094
    int *b2 = coefs;
1598
    int i, j;
1599
1600
67034
    for (i=0; i < LPC_ORDER; i++) {
1601
60940
        b1[i] = refl[i] * 16;
1602
1603
335170
        for (j=0; j < i; j++)
1604
274230
            b1[j] = ((int)(refl[i] * (unsigned)b2[i-j-1]) >> 12) + b2[j];
1605
1606
60940
        FFSWAP(int *, b1, b2);
1607
    }
1608
1609
67034
    for (i=0; i < LPC_ORDER; i++)
1610
60940
        coefs[i] >>= 4;
1611
6094
}
1612
1613
6272
void ff_int_to_int16(int16_t *out, const int *inp)
1614
{
1615
    int i;
1616
1617
68992
    for (i = 0; i < LPC_ORDER; i++)
1618
62720
        *out++ = *inp++;
1619
6272
}
1620
1621
/**
1622
 * Evaluate sqrt(x << 24). x must fit in 20 bits. This value is evaluated in an
1623
 * odd way to make the output identical to the binary decoder.
1624
 */
1625
55701
int ff_t_sqrt(unsigned int x)
1626
{
1627
55701
    int s = 2;
1628
185333
    while (x > 0xfff) {
1629
129632
        s++;
1630
129632
        x >>= 2;
1631
    }
1632
1633
55701
    return ff_sqrt(x << 20) << s;
1634
}
1635
1636
24271
unsigned int ff_rms(const int *data)
1637
{
1638
    int i;
1639
24271
    unsigned int res = 0x10000;
1640
24271
    int b = LPC_ORDER;
1641
1642
266981
    for (i = 0; i < LPC_ORDER; i++) {
1643
242710
        res = (((0x1000000 - data[i]*data[i]) >> 12) * res) >> 12;
1644
1645
242710
        if (res == 0)
1646
            return 0;
1647
1648
282097
        while (res <= 0x3fff) {
1649
39387
            b++;
1650
39387
            res <<= 2;
1651
        }
1652
    }
1653
1654
24271
    return ff_t_sqrt(res) >> b;
1655
}
1656
1657
18282
int ff_interp(RA144Context *ractx, int16_t *out, int a, int copyold, int energy)
1658
{
1659
    int work[LPC_ORDER];
1660
18282
    int b = NBLOCKS - a;
1661
    int i;
1662
1663
    // Interpolate block coefficients from the this frame's forth block and
1664
    // last frame's forth block.
1665
201102
    for (i = 0; i < LPC_ORDER; i++)
1666
182820
        out[i] = (a * ractx->lpc_coef[0][i] + b * ractx->lpc_coef[1][i])>> 2;
1667
1668
18282
    if (ff_eval_refl(work, out, ractx->avctx)) {
1669
        // The interpolated coefficients are unstable, copy either new or old
1670
        // coefficients.
1671
105
        ff_int_to_int16(out, ractx->lpc_coef[copyold]);
1672
105
        return ff_rescale_rms(ractx->lpc_refl_rms[copyold], energy);
1673
    } else {
1674
18177
        return ff_rescale_rms(ff_rms(work), energy);
1675
    }
1676
}
1677
1678
24376
unsigned int ff_rescale_rms(unsigned int rms, unsigned int energy)
1679
{
1680
24376
    return (rms * energy) >> 10;
1681
}
1682
1683
/** inverse root mean square */
1684
25039
int ff_irms(AudioDSPContext *adsp, const int16_t *data)
1685
{
1686
25039
    unsigned int sum = adsp->scalarproduct_int16(data, data, BLOCKSIZE);
1687
1688
25039
    if (sum == 0)
1689
4
        return 0; /* OOPS - division by zero */
1690
1691
25035
    return 0x20000000 / (ff_t_sqrt(sum) >> 8);
1692
}
1693
1694
24376
void ff_subblock_synthesis(RA144Context *ractx, const int16_t *lpc_coefs,
1695
                           int cba_idx, int cb1_idx, int cb2_idx,
1696
                           int gval, int gain)
1697
{
1698
    int16_t *block;
1699
    int m[3];
1700
1701
24376
    if (cba_idx) {
1702
23842
        cba_idx += BLOCKSIZE/2 - 1;
1703
23842
        ff_copy_and_dup(ractx->buffer_a, ractx->adapt_cb, cba_idx);
1704
23842
        m[0] = (ff_irms(&ractx->adsp, ractx->buffer_a) * (unsigned)gval) >> 12;
1705
    } else {
1706
534
        m[0] = 0;
1707
    }
1708
24376
    m[1] = (ff_cb1_base[cb1_idx] * gval) >> 8;
1709
24376
    m[2] = (ff_cb2_base[cb2_idx] * gval) >> 8;
1710
24376
    memmove(ractx->adapt_cb, ractx->adapt_cb + BLOCKSIZE,
1711
            (BUFFERSIZE - BLOCKSIZE) * sizeof(*ractx->adapt_cb));
1712
1713
24376
    block = ractx->adapt_cb + BUFFERSIZE - BLOCKSIZE;
1714
1715
24376
    add_wav(block, gain, cba_idx, m, cba_idx? ractx->buffer_a: NULL,
1716
24376
            ff_cb1_vects[cb1_idx], ff_cb2_vects[cb2_idx]);
1717
1718
24376
    memcpy(ractx->curr_sblock, ractx->curr_sblock + BLOCKSIZE,
1719
           LPC_ORDER*sizeof(*ractx->curr_sblock));
1720
1721
24376
    if (ff_celp_lp_synthesis_filter(ractx->curr_sblock + LPC_ORDER, lpc_coefs,
1722
                                    block, BLOCKSIZE, LPC_ORDER, 1, 0, 0xfff))
1723
        memset(ractx->curr_sblock, 0, (LPC_ORDER+BLOCKSIZE)*sizeof(*ractx->curr_sblock));
1724
24376
}