op25/op25/gr-op25_repeater/lib/p25p2_vf.cc

882 lines
48 KiB
C++

// P25 TDMA Decoder (C) Copyright 2013, 2014, 2016 Max H. Parke KA1RBI
//
// This file is part of OP25
//
// OP25 is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3, or (at your option)
// any later version.
//
// OP25 is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
// License for more details.
//
// You should have received a copy of the GNU General Public License
// along with OP25; see the file COPYING. If not, write to the Free
// Software Foundation, Inc., 51 Franklin Street, Boston, MA
// 02110-1301, USA.
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include "op25_golay.h"
#include "p25p2_vf.h"
#include "rs.h"
static void load_i(const uint8_t src[], int& dest, int count) {
dest = 0;
for (int i=0; i<count; i++)
dest = (dest << 1) + src[count-1-i];
}
static void dump_i(uint8_t dest[], int src, int count) {
for (int i=0; i<count; i++) {
dest[i] = src & 1;
src = src >> 1;
}
}
static inline void store_reg(int reg, uint8_t val[], int len) {
for (int i=0; i<len; i++){
val[i] = (reg >> (len-1-i)) & 1;
}
}
static inline int load_reg(const uint8_t val[], int len) {
int acc = 0;
for (int i=0; i<len; i++){
acc = (acc << 1) + (val[i] & 1);
}
return acc;
}
static const uint32_t pr_n[4096] = { \
4377671, 1693438, 3163945, 7023824, 6340423, 3761422, 7558385, 15388512, \
8494239, 14558670, 14137157, 9226424, 9263403, 16192087, 12361860, 10859305, \
15624954, 16243111, 12370460, 4657881, 5187874, 1374775, 6112236, 5652757, \
2726546, 2140651, 8089725, 3924900, 2152795, 7014490, 5387173, 10069108, \
12643787, 13328146, 9536597, 16291820, 14888507, 11173058, 11659209, 16537117, \
10948070, 9289331, 13956616, 5727629, 941654, 4558251, 8263096, 3630661, \
3014022, 6614075, 4136800, 3441076, 5087247, 424910, 1796273, 13734696, \
13239295, 10688598, 16313217, 16380664, 10641511, 11082678, 15833689, 10117448, \
8614582, 13166703, 9673180, 1704593, 6394178, 7203327, 3570220, 8201489, \
6587610, 3088143, 1994164, 5633761, 960266, 400534, 14487109, 11851576, \
11494571, 14974786, 16629405, 11961516, 16668531, 12706978, 9108749, 9645780, \
14161123, 8488250, 2252524, 8022341, 3252498, 2798315, 6490484, 7887541, \
1172430, 4878683, 4205216, 1678205, 1491038, 7295619, 10812176, 12560620, \
16135095, 15482898, 11393225, 14084892, 14495783, 8692218, 13606425, 14044288, \
12338519, 10991150, 7220641, 3219280, 3720846, 6542783, 4746848, 1097697, \
6008094, 4867655, 88048, 8047657, 7585514, 2631127, 10523660, 16502777, \
11557986, 8987686, 13022173, 14628928, 9718195, 13554622, 15171661, 12336016, \
16099851, 15126910, 2966453, 3430916, 6203867, 500226, 815412, 4573693, \
6216202, 3211667, 6828228, 6466109, 3889586, 11550787, 15439708, 8567981, \
9514594, 14219259, 8569993, 9002836, 15732711, 16497706, 10676081, 15292100, \
16174367, 4165610, 341217, 5006652, 1572495, 1854546, 4527521, 3049129, \
4177238, 7695495, 7262744, 2593145, 8129190, 13974295, 9363656, 8778385, \
14240566, 9607407, 11240216, 14709505, 12282079, 11717500, 15274149, 14746066, \
9616203, 5892276, 4223349, 721514, 1218715, 7940420, 2324205, 3077562, \
7702115, 8134357, 494860, 5174955, 5597170, 10452009, 13012636, 12916551, \
12346402, 12054457, 15531332, 10814615, 11474826, 14060649, 14253493, 8546062, \
13349979, 5279120, 1640997, 6549758, 6874055, 3242512, 3803609, 7049838, \
16951, 1800648, 5499481, 4764599, 8458598, 14568057, 16120200, 11296855, \
15152126, 16746925, 11835440, 9391043, 13037582, 10330421, 9711584, 13048891, \
5097359, 3438276, 8350777, 6733738, 2721367, 7492868, 5983881, 130674, \
538019, 5449372, 1613133, 118210, 15365691, 15967597, 11582676, 15208211, \
14898634, 10011773, 9546532, 13514971, 8889178, 10277797, 14043380, 11500399, \
2400914, 8204305, 7752557, 3005118, 4509987, 6169304, 2076829, 305446, \
5200627, 409896, 4043013, 7383766, 11155759, 10601656, 16304064, 13851919, \
9055902, 12695393, 14304496, 9592463, 9031502, 15250641, 11740968, 12123775, \
6413510, 2770689, 1447128, 6139362, 4636215, 1000668, 5559625, 6131250, \
2506159, 2892668, 7725713, 12474754, 10963583, 12882852, 14655793, 9861722, \
13421454, 12703797, 10093292, 15937979, 15251474, 10742725, 12210300, 7372971, \
629698, 141405, 5861772, 5292659, 727138, 4857740, 7382613, 3929538, \
6713275, 7200360, 3442117, 10425886, 12873547, 9240048, 9946661, 14550414, \
12950739, 11447840, 16217532, 16540799, 12427010, 15142033, 13374568, 1173431, \
1768502, 4414281, 525208, 1282087, 8086526, 6322937, 2746624, 7508950, \
7930479, 55600, 781041, 13853006, 9441695, 9145060, 12982633, 12411034, \
11858503, 15706452, 15014057, 12321634, 14143702, 13532813, 8744728, 1873123, \
5736230, 876317, 2419904, 8386323, 4073130, 2432365, 6983444, 5465227, \
1668474, 4239028, 13343909, 9438554, 10049219, 14871860, 11222141, 11609834, \
16422163, 10736328, 8940541, 14284854, 13804259, 9245529, 4540420, 6216695, \
3629946, 2896009, 6794196, 4098119, 3494330, 5071665, 4634820, 1911199, \
5509646, 6275297, 8837435, 15034894, 16495061, 11712000, 11095723, 14704118, \
10216965, 9484184, 13184107, 12836454, 10143677, 13718600, 6963155, 2338211, \
7877740, 7423989, 2874370, 961883, 5586940, 2008101, 513522, 5000907, \
5590036, 4109301, 14983786, 15563163, 11979397, 16765532, 12853695, 9386530, \
9874257, 14438796, 8999447, 8554994, 16365737, 15737628, 2879943, 6473738, \
7871289, 1253605, 4895062, 4320143, 1591520, 1300337, 4753070, 2112607, \
3895104, 7796385, 15025534, 11411175, 14134288, 14464329, 8681199, 9422134, \
13934057, 10292952, 10892563, 15721638, 11853693, 4066560, 7837331, 5023582, \
354477, 5405616, 5882699, 4255, 658196, 7600737, 3727546, 2315023, \
6981844, 11639261, 9974314, 12738803, 13367620, 9472525, 14356978, 12747107, \
11401917, 12347724, 16142915, 11371450, 10751341, 6258420, 1501063, 914506, \
4591345, 6168356, 1428543, 7108554, 6775809, 3972285, 3514350, 6947859, \
193936, 9563725, 14302270, 12780963, 8951384, 15814041, 16416646, 10610295, \
15303144, 15866384, 12274647, 8450510, 13328953, 1194976, 1935455, 4559390, \
6701537, 4057200, 7650223, 7274694, 2494549, 8244136, 5732474, 926055, \
373388, 13404185, 9919458, 12341943, 15066412, 15415241, 11669010, 16375087, \
15255292, 8615681, 14200194, 13745754, 722213, 148660, 7994971, 3288522, \
2831509, 6326124, 7986427, 3361810, 5011269, 4564188, 1982243, 1531890, \
12894424, 11531021, 12004086, 16562539, 10863416, 11424405, 16075078, 14465723, \
8888744, 13574501, 13949598, 10471691, 2240624, 6890148, 3193135, 3360982, \
6904577, 2146360, 1815279, 5389062, 4844697, 186312, 5982071, 7421094, \
11054921, 10729040, 16270726, 11919231, 11439352, 13051265, 10303058, 10415567, \
13065524, 13370993, 11908554, 16690207, 6782628, 2999801, 2545210, 8331142, \
1321045, 914088, 4383667, 1661042, 1084301, 6992668, 6496355, 3177386, \
16500797, 14811588, 11080595, 9480234, 14350820, 8481365, 8966154, 13861851, \
16398948, 10840485, 15655646, 7787075, 4001168, 6594157, 4712302, 1864849, \
1404489, 5152222, 394423, 4011808, 7798233, 7334918, 2365367, 16581880, \
15899945, 8941458, 12678223, 14337852, 9674417, 8916067, 15460254, 11727493, \
12085616, 14752443, 15368750, 3215701, 5794496, 4454699, 688630, 5509829, \
6099228, 2549963, 2980707, 7610684, 4165837, 3050322, 6576259, 14672748, \
9892725, 14485634, 12847899, 9426636, 11822245, 16547646, 10989259, 11179281, \
15795764, 12213487, 8645938, 4732545, 5248476, 1281343, 4775586, 6382961, \
3863564, 3387287, 6823282, 2246377, 3921849, 5270598, 864223, 8819512, \
14532705, 13917142, 11495951, 15186112, 16524145, 12521518, 10930655, 15587904, \
9711753, 10461631, 4561510, 805269, 1528072, 8053315, 6371766, 2763309, \
7590872, 7979395, 2116134, 737277, 5940256, 1119763, 9064415, 12835884, \
16361397, 11547882, 15445083, 14733204, 12407909, 16123386, 13614755, 8760404, \
10376669, 14140970, 843123, 2437069, 7747100, 8254931, 3491554, 7232313, \
6793612, 1880647, 5710618, 4905129, 117364, 1642887, 15868042, 11119440, \
10549413, 16465982, 15913803, 11118720, 13318461, 13787886, 10080439, 12602112, \
13310665, 11579766, 3793831, 6782712, 3067224, 3511943, 8267646, 4668777, \
847536, 5625175, 6227150, 822973, 2473312, 8283355, 12023582, 11324421, \
15015152, 12529450, 9499799, 13232084, 12738313, 10198202, 13666151, 15413772, \
10709401, 3734338, 7438515, 2232620, 2730565, 5306834, 1794314, 131837, \
4757988, 5703691, 4092634, 6676837, 7141940, 11996139, 12324938, 15000213, \
9403372, 9861247, 13992882, 10393408, 8850525, 15531942, 16049203, 12531192, \
14684045, 6921238, 3302891, 1795640, 4257045, 691654, 1252891, 5784992, \
2225776, 2780703, 7937422, 7374417, 2807784, 14908591, 14216790, 9941953, \
9306136, 12917615, 10275302, 11956249, 15672264, 14981362, 12556583, 16139244, \
13463633, 321794, 5651199, 6094956, 316321, 1034906, 7502159, 3777204, \
2261553, 6953450, 7425686, 1636101, 4400380, 13123131, 9538818, 14343381, \
12732172, 10565043, 12238066, 15929165, 11031710, 10601795, 14614392, 13905084, \
898887, 4638418, 6249609, 1331040, 7317239, 6698254, 2886233, 3529440, \
8306991, 865022, 272833, 6273297, 14041774, 8999271, 12834992, 16427913, \
11612506, 11059367, 14932772, 12077177, 9515906, 13345559, 8583420, 10046377, \
5292563, 4427982, 2633565, 7421488, 8375779, 2512478, 2950277, 5684692, \
2076283, 292266, 5100885, 1560140, 10231195, 15017075, 15661028, 12045597, \
16014914, 15697891, 8893500, 9990061, 13725650, 9098243, 8455080, 14170741, \
3385382, 2880411, 6307913, 8100260, 3312319, 4796522, 4223377, 1829380, \
1694063, 4194802, 1028609, 3598812, 16612063, 15090470, 11506169, 16061001, \
14428950, 8911063, 13428328, 12916657, 10390598, 9944927, 15557784, 10908769, \
3641334, 7900303, 6362388, 714481, 5504043, 5861182, 136901, 4949256, \
5275579, 3763942, 2290997, 15308424, 11603779, 12197174, 12837549, 12611960, \
10168515, 14064267, 13468028, 8745189, 16706322, 16115915, 11276484, 2556725, \
8313066, 1403739, 948756, 4628677, 6132602, 1329827, 5208533, 7140188, \
3220111, 8001842, 6458985, 11130268, 9594135, 14401250, 8433081, 8983588, \
13780695, 14216474, 10583080, 15345653, 15963182, 12111503, 11231184, 4613217, \
1882046, 1388399, 5119168, 382873, 1893998, 7814647, 8301312, 2396232, \
7160279, 7756326, 1944057, 8663496, 13566467, 9880030, 9492589, 13330992, \
10629523, 12165710, 15752085, 15419552, 10539642, 14197663, 13842436, 695161, \
115626, 5919799, 1257428, 2669581, 6300986, 4151267, 3984508, 6675869, \
5121730, 1516914, 14474669, 12996196, 9393491, 9741962, 16629373, 10907108, \
11392651, 16041818, 16649409, 8863284, 13149999, 14405826, 1198864, 4823437, \
4237566, 3814179, 3235976, 6871389, 2317062, 3801267, 5353848, 4909705, \
153622, 5882735, 13669048, 9120048, 14957255, 16114398, 12501281, 10951408, \
15567743, 9745422, 10446545, 13917544, 13470911, 8787958, 6235461, 7732376, \
3080034, 6767719, 8164764, 3247881, 687314, 4810671, 1168940, 1739985, \
4398850, 4761245, 11789804, 16414243, 14749338, 11114824, 11665941, 14250406, \
8448107, 9165456, 14025093, 10326142, 9436155, 15100192, 8220765, 3441614, \
7313459, 6581233, 1962984, 1564695, 5118918, 330361, 1998904, 5731303, \
2910302, 10599817, 16484016, 15733879, 10579342, 13303321, 13854145, 9967022, \
8625727, 13356484, 9467409, 12183306, 14859751, 2821684, 3151753, 8119514, \
4683527, 798636, 5606521, 6199107, 869526, 292973, 8367072, 3616947, \
3932490, 15194845, 15657012, 9789795, 14463738, 13076741, 9264084, 13648507, \
14414123, 10627764, 11090765, 16417178, 11784883, 2653028, 4204701, 6009350, \
1048915, 4807864, 4378413, 3929302, 7349387, 6995737, 2346228, 3949863, \
7697946, 9350337, 8732484, 13913791, 14603758, 8898385, 15482496, 16199023, \
12498550, 15030177, 15486297, 11976398, 10331431, 4468856, 772841, 1235222, \
5849223, 6304744, 2271281, 7948450, 7361375, 2867228, 6470561, 5843579, \
9580686, 9094037, 12671568, 9963947, 11776822, 15512133, 15026584, 12507675, \
16155110, 15545845, 9317900, 8912339, 6079571, 1398444, 951805, 6597698, \
4030347, 3556476, 7329381, 6557618, 3882059, 5416900, 4782005, 85038, \
10133499, 13735425, 10495244, 11239423, 15910946, 12112305, 10683084, 15382791, \
13756850, 9990761, 12796188, 13404311, 1317442, 4153784, 6746785, 3001174, \
3545311, 7832072, 2929649, 289006, 6257439, 5673936, 884801, 4594494, \
16772327, 11861328, 11093912, 14881999, 12094838, 11632301, 13268232, 12838227, \
10002086, 14355773, 12818152, 11069059, 7437598, 7999213, 2201392, 2655266, \
7565007, 1834772, 304289, 5183354, 5638443, 1955972, 6579037, 15692010, \
10848691, 16030548, 16732365, 10904338, 9304674, 14035197, 10425116, 8749763, \
13433306, 15952425, 12104436, 6390103, 6947338, 3365273, 7989348, 4354751, \
206234, 1612864, 5361589, 685358, 2188387, 7978896, 7478285, 11225086, \
14997287, 16641064, 9846745, 9283142, 12948663, 10375144, 9928288, 15508887, \
11478606, 11934841, 16633248, 6673999, 3039708, 5585025, 6072946, 217595, \
671756, 5372757, 3914186, 2236986, 6919093, 3197124, 3889947, 14691202, \
12693621, 10167228, 13785739, 13224018, 8561577, 12267580, 16001399, 11393666, \
10896408, 16537061, 11906790, 965947, 4679112, 5035605, 1563950, 5648107, \
7092080, 2467205, 4087518, 7688047, 2921633, 2336600, 5914447, 13663382, \
9160545, 12735720, 14232727, 11583238, 15458521, 14831928, 12110503, 12294366, \
14819593, 9003665, 1110386, 6015791, 4201108, 827713, 7844538, 8285119, \
2447716, 7242457, 7803658, 3946615, 322292, 5230889, 10240219, 9804742, \
13544493, 15168764, 12347235, 16178194, 15437261, 10487396, 16381107, 13823818, \
9002589, 8390020, 5936939, 1257211, 2653572, 6546965, 7509966, 3743011, \
6327856, 7009741, 1139742, 6053523, 4688352, 954429, 9790342, 16707667, \
11987065, 11340716, 14946423, 16745418, 11827865, 13461616, 13538279, 9863742, \
10295617, 12905424, 2880063, 3158510, 7932529, 2267401, 2802126, 7435895, \
5959072, 236697, 4720198, 5330311, 1764412, 2715497, 14759058, 12224007, \
11771852, 15486129, 10975011, 10397662, 13966349, 13438720, 8836347, 14546286, \
16019349, 3128532, 2526571, 8213170, 3621221, 2554332, 5057179, 1315171, \
2085628, 4246061, 4815186, 3351251, 8041260, 14747893, 11164386, 11789083, \
16298136, 8465253, 9144630, 13684874, 14238529, 9074836, 14920111, 16267130, \
12010625, 7331084, 6614623, 4011426, 1455921, 6262476, 286151, 1000982, \
5748456, 8170873, 2440838, 7260111, 8246392, 11806369, 13577590, 12827743, \
9979776, 9655665, 13290734, 8502207, 12066900, 15954368, 15321915, 10508326, \
16462837, 5415448, 637067, 4344822, 5493293, 1671576, 277075, 7285254, \
3469757, 4047456, 6703490, 7321627, 1417804, 14578165, 13060138, 9232331, \
9766356, 14562309, 10874874, 10812515, 16668420, 11765725, 11058282, 12791730, \
5930725, 1164364, 4757399, 4329058, 1686905, 3204796, 7037959, 2252250, \
3772073, 7353652, 681207, 653834, 13945104, 14618853, 8815422, 13482395, \
15104576, 12477211, 11899054, 15502197, 10959824, 10281099, 14021470, 9308901, \
399400, 6128474, 5660871, 2586900, 6867689, 7442658, 3801363, 2162380, \
4844925, 1209634, 1771179, 4228444, 9150085, 9596850, 16315754, 14780069, \
11149076, 15797451, 15792058, 9398069, 8813804, 14458655, 9929730, 9327857, \
4583228, 8191119, 3605970, 7082568, 6604989, 4192630, 5661251, 5087640, \
432965, 2034422, 5788091, 57928, 11221969, 15862030, 16355951, 10666993, \
15431680, 13663135, 10002918, 12783649, 13126584, 9558095, 10153110, 6502313, \
2655336, 3579827, 7818758, 7103581, 374697, 5123618, 5578239, 1886092, \
4707857, 5189106, 3423855, 12551444, 15095233, 11361882, 11857343, 14660836, \
12658269, 8445323, 14403666, 13783925, 8986796, 10664531, 16452546, 3227677, \
2675516, 6531811, 1587226, 1123213, 4903652, 4409651, 1661867, 5677144, \
7319813, 2906798, 3524987, 16701856, 10822293, 9253198, 14085283, 10444336, \
8668525, 13612766, 14069507, 12397801, 15030012, 15648519, 12000470, 3682137, \
4437792, 189687, 1662798, 5360793, 697680, 79719, 7892158, 7593217, \
2803409, 6362526, 8104239, 9616116, 9003273, 12603930, 10459895, 9709860, \
12923577, 15721410, 10934279, 16583356, 16159593, 11509811, 4486030, 6121805, \
1558768, 824227, 4530298, 2030021, 3664644, 6836475, 6489578, 3907093, \
7876036, 4290379, 9106995, 13733348, 14163549, 8627866, 9106819, 15756924, \
12279725, 10650646, 15308371, 15756680, 10480693, 12908518, 4982170, 2038809, \
5697476, 5076031, 2384170, 4168657, 7637012, 2888623, 2617974, 6219873, \
5585800, 920159, 13079014, 14213808, 9468521, 11266502, 14717463, 11600232, \
12208377, 14940710, 8937935, 9580760, 14388001, 12622258, 615503, 5437188, \
7974032, 2105195, 3020734, 7849109, 3997512, 1519259, 5149734, 886645, \
1334936, 6188291, 12973782, 11281453, 16190780, 16703186, 10863939, 11433148, \
14036709, 10329458, 8389275, 13325132, 9494901, 1686186, 6962027, 6455508, \
3789701, 7490426, 7043298, 41761, 1642524, 5392591, 711472, 127145, \
5906894, 12007959, 11323520, 15028601, 16663206, 11843975, 12955480, 13506184, \
9946419, 10276470, 13057933, 9315600, 11843267, 8212478, 6708285, 3000256, \
7386459, 5975086, 155637, 4838512, 5457034, 1720279, 633956, 6340029, \
3884666, 11587651, 15305628, 14891565, 10101218, 13747123, 13261324, 8849885, \
14463522, 16098218, 12548573, 10766852, 15585683, 4063338, 3619617, 5044628, \
4702287, 2053082, 5540001, 5093484, 2499551, 8221698, 7393104, 2858749, \
2303014, 16295891, 9567944, 9063737, 12654582, 13665903, 10173720, 14905025, \
15267190, 11781567, 12195369, 14794064, 11070607, 1537598, 6112753, 302240, \
1019679, 5648582, 8249893, 2554680, 7276747, 8192790, 3453581, 3107049, \
12876658, 10338951, 9867612, 13568833, 8779938, 12247423, 15954636, 15210897, \
10586442, 16446187, 15819060, 9041989, 690907, 5444922, 1574629, 262012, \
6978571, 3221138, 3774325, 6458540, 7176115, 3468866, 6288541, 5637948, \
9247847, 8900027, 14608136, 11891925, 10792374, 15703595, 16123344, 12416325, \
15134222, 13515259, 9765472, 14193309, 4446670, 551495, 3257265, 8036456, \
2235103, 2706310, 7532617, 7595000, 538919, 4294742, 5948361, 1069088, \
13199799, 14859246, 12525593, 11800961, 15714922, 10943807, 12330916, 13973073, \
13540762, 8736423, 14442100, 14673321, 2536986, 7081303, 7855340, 4113977, \
2454979, 6827222, 1290013, 1594860, 4211827, 4972426, 1223901, 16332628, \
14813091, 11262074, 15747909, 15741572, 11251803, 8432619, 14244532, 9617677, \
9425614, 12855347, 15481120, 3654397, 8147206, 6637699, 3058424, 3649837, \
6037686, 416578, 510217, 6034100, 1385319, 3060986, 6672153, 16539456, \
11703551, 15443758, 14696145, 10185936, 9623311, 13190390, 8396128, 10137113, \
15856862, 11031879, 11226808, 7511529, 7939158, 2242199, 4975884, 5627505, \
1835938, 495887, 5024476, 3500960, 4083763, 6800366, 2988805, 11937808, \
16774123, 12902462, 8738981, 14551880, 13996123, 9269666, 10644085, 16505068, \
11569538, 11211347, 14852588, 7994175, 1142354, 4855241, 4425244, 1609703, \
5471730, 6481433, 2742208, 3214423, 8003374, 2483640, 11301969, 13070214, \
14589087, 9802848, 13576113, 13040670, 12447183, 15996592, 15664169, 10788846, \
12446231, 16740612, 435192, 887395, 5380518, 5989085, 62280, 6908339, \
7543406, 3703149, 6410384, 6972227, 3406334, 1620133, 12780352, 9113818, \
10020875, 13761396, 15343861, 10851082, 16551571, 16211140, 11495229, 10806970, \
14630211, 9834396, 906893, 4515186, 2064050, 3517705, 7116116, 6768295, \
3562810, 8256761, 6596292, 734495, 1150186, 5824353, 8610868, 9057999, \
15838043, 12196000, 10699757, 15254142, 15792263, 12266320, 12597865, 13222310, \
10113815, 9660616, 6076697, 2531878, 3080687, 7657753, 4049536, 2503127, \
7152190, 5552801, 1984848, 4674059, 5023646, 9944181, 12467880, 15550363, \
10802246, 12210165, 15809593, 15246442, 8640471, 14306316, 13753849, 9086962, \
12723239, 7945692, 3198533, 2839842, 6293499, 3784300, 3321237, 4347403, \
5063274, 1495477, 6240772, 4467675, 3010690, 16171557, 16669180, 10848271, \
11449106, 16212425, 10246188, 8768439, 13500611, 13906200, 10333085, 15399014, \
14893947, 3674760, 7571797, 6962166, 2123435, 1693040, 5430977, 593438, \
46591, 6022881, 7503160, 2641103, 6526550, 16418097, 12401832, 13954935, \
13616518, 8656009, 10227576, 14138535, 9332510, 10843981, 16680065, 16228146, \
11274991, 6680732, 6288129, 1329866, 858431, 4620836, 1306833, 1599818, \
6552199, 2851316, 3149933, 7932571, 14870866, 9007309, 13632444, 14391651, \
8620754, 8942365, 13754468, 12255219, 10555178, 15467677, 12572628, 12054059, \
5012667, 4687712, 2003989, 5590430, 5013099, 517296, 4011437, 7609934, \
3116435, 2554912, 8218237, 1488262, 9145858, 13180889, 13649260, 10220087, \
12643278, 15280201, 11703184, 12305383, 14776446, 11168641, 9678912, 14155871, \
4266926, 706672, 5370321, 6107790, 3549239, 6789600, 7094841, 3633434, \
4107207, 4569660, 852393, 1496818, 14536471, 12873100, 9385584, 16164643, \
16604348, 10964829, 15398274, 15836219, 9451368, 9112773, 12639254, 10049483, \
1254640, 4898085, 6401742, 3691610, 7587585, 6881012, 2174319, 5976962, \
5423825, 608588, 416447, 14655782, 10269001, 10840728, 15620391, 16040182, \
12399544, 15083777, 13613270, 9753391, 10436792, 13015793, 9218830, 1388703, \
8282976, 2218545, 2640058, 7550791, 7513812, 585128, 4415355, 5917910, \
1152261, 534104, 4406755, 12119334, 11589341, 15402440, 10664979, 11124458, \
14050669, 14636564, 8687490, 12852315, 14624420, 9762725, 11390042, 6708107, \
4133428, 3449069, 7240618, 485395, 1888708, 5604157, 5118006, 240098, \
5829145, 7487884, 2820599, 11049586, 15835561, 12218964, 8514119, 13146554, \
13763193, 10163140, 12640415, 13336139, 11689968, 16352305, 14980942, 3042519, \
3537920, 6088617, 463998, 396551, 6135704, 5694537, 943526, 6659767, \
8162633, 3610512, 7104035, 15072622, 10383037, 9573888, 13206995, 8575726, \
10189605, 13689072, 14783051, 11143454, 15816949, 16376681, 2290106, 4925639, \
5282644, 1802429, 147810, 4815699, 108684, 4070237, 7668466, 7131435, \
2616092, 8288965, 14524691, 8754874, 13524717, 13978900, 10286731, 8889674, \
15604785, 11898532, 12571999, 15099010, 15286177, 9481596, 5965039, 4216595, \
642120, 1294317, 5383990, 2692323, 2281432, 8084997, 3170790, 2732927, \
4438696, 5786065, 9556574, 13557935, 13056369, 10234432, 12030367, 15679518, \
10769121, 11909560, 16689167, 8729558, 9191701, 14146088, 6253555, 274438, \
5219229, 7789529, 3755042, 2148287, 7059020, 3222593, 1605554, 4441199, \
677364, 1650305, 13810762, 13346299, 10573348, 16276989, 15961803, 12203522, \
10561013, 13565548, 9948987, 10311106, 12887629, 5226428, 1337507, 8209234, \
7262621, 2557956, 8207222, 7774379, 1044504, 279509, 6101134, 1485115, \
602848, 12611605, 16435998, 11770563, 15204720, 14922669, 12249694, 13728086, \
12599977, 9081720, 9514471, 14184070, 8648025, 2802920, 7413559, 7998830, \
2536649, 7169808, 5536999, 2067710, 4495136, 5059715, 1503066, 2031149, \
7161012, 10884939, 12553866, 16055701, 15558500, 8836795, 14453010, 13699653, \
9075100, 8642858, 16282355, 11602260, 11180045, 6325206, 3764579, 3860664, \
4430813, 4722758, 1245883, 5962600, 5302389, 2716566, 2523722, 8231153, \
3427236, 11498095, 15136218, 10227457, 9903160, 13534703, 12973606, 9727377, \
16760264, 14976567, 11277734, 12012616, 8318617, 2209158, 657015, 5480360, \
1625089, 30290, 4941775, 7386172, 3739633, 6446794, 7065631, 3728324, \
11679856, 13338939, 8426438, 10043477, 14055848, 9284347, 10793334, 16646541, \
16239196, 11327843, 15164082, 16659005, 1411524, 809618, 5194539, 1569004, \
1878581, 6765442, 7230683, 3262244, 7888037, 6499418, 2733835, 5276816, \
14376301, 8572910, 9024658, 13772097, 12267228, 10607911, 14700386, 16471769, \
11576588, 16367319, 12734202, 9393449, 5621456, 6175559, 473151, 2925296, \
7721313, 4081822, 2472719, 7184752, 7745713, 1526574, 5036247, 4653440, \
10363705, 14006526, 15330087, 10637853, 12141000, 15776547, 11217590, 10645965, \
14271056, 13884547, 9051502, 4302461, 5813632, 3894363, 2121422, 6915493, \
3355761, 4073418, 6683923, 839236, 1525741, 6034490, 4566915, 9404244, \
16147517, 16635810, 10915443, 11484556, 16050077, 11919475, 9394602, 12847677, \
10063940, 9576855, 13335098, 6351329, 3903668, 7537167, 6830554, 2226801, \
3826476, 5329375, 559683, 236416, 4350205, 1635182, 3402647, 15603784, \
15008713, 12362934, 16252007, 15495128, 8690689, 10454278, 14030591, 9268265, \
8846736, 16721615, 15996174, 2924209, 7335520, 7632155, 3794582, 4366181, \
4918712, 1070763, 1763158, 4455581, 2633513, 3244402, 8032487, 14904092, \
11040985, 15900898, 14357311, 8390892, 12704085, 14344850, 9793771, 11311988, \
15108741, 12538187, 3433306, 7338661, 6727996, 1905355, 5555074, 5167381, \
355052, 6040887, 7836674, 2492361, 2972956, 7531686, 12236795, 10560520, \
13147269, 13881206, 9983019, 12679096, 13282885, 11705550, 12142395, 14866016, \
11267569, 10501918, 7939780, 1742321, 282154, 5065215, 5681492, 2073097, \
6560250, 7293031, 3593108, 3940761, 6633538, 3058615, 9814060, 14439004, \
8899475, 9353226, 13902845, 15815332, 11190275, 14769114, 16263693, 11776308, \
11187179, 12667914, 1793429, 1214052, 4797818, 11683, 3923520, 7390685, \
6902958, 2338419, 7777768, 8222221, 411478, 1039587, 13897272, 10303477, \
8905926, 15523610, 11882153, 12457072, 15185695, 15476878, 12024145, 14664608, \
12882111, 8980830, 1751681, 5366040, 2642927, 2312886, 8096016, 7355081, \
2843158, 6484263, 5884652, 1055577, 4923522, 12710655, 8939884, 11753633, \
16422738, 11371599, 10894516, 16772960, 16119019, 9176478, 13049669, 14462192, \
9795371, 5137954, 6802901, 4038412, 3409595, 7304690, 2420237, 4030108, \
5375298, 4429491, 634300, 5405765, 6025874, 10518795, 15276152, 15862709, \
12185870, 10608859, 15348672, 9668661, 10001406, 12804930, 13262865, 9829356, \
16583279, 7213490, 2474945, 3996252, 7825831, 963174, 360569, 6166920, \
1474071, 910831, 4502568, 8326705, 3448262, 15582239, 14841760, 12217825, \
10075678, 12720015, 9126992, 9502521, 14282666, 8533079, 11044741, 15851160, \
16403827, 3373030, 6857757, 4435272, 1710803, 1361974, 5108205, 402128, \
1521923, 8161534, 2577021, 3031461, 16055002, 16628555, 8782244, 13488693, \
13945706, 10451091, 8790788, 13415405, 11765946, 12213027, 14794972, 15245325, \
3882791, 5246194, 4773129, 214676, 5913799, 5352810, 702137, 2311492, \
7888471, 3202714, 2827617, 6305524, 14536591, 9887067, 13584080, 13416233, \
9872638, 14630855, 14961936, 11388153, 11932518, 16590903, 10795144, 9356121, \
5722294, 6048175, 506489, 4857984, 5337863, 3725950, 6474157, 6361648, \
3711691, 3406222, 4868661, 87008, 9994587, 13777414, 14232005, 8446073, \
15456170, 15863127, 12393548, 15116173, 15692914, 9784547, 10280860, 13599829, \
276418, 1965627, 5696620, 7296981, 2426395, 8295850, 7811061, 2915364, \
378267, 5936730, 1121569, 8990140, 12776047, 10183058, 12064913, 14912366, \
15372726, 11624993, 16382792, 12765407, 8978982, 9442297, 14411848, 195335, \
877270, 7835757, 4098992, 2439363, 7102798, 7861148, 1316961, 5049722, \
4691599, 2024772, 1408465, 13561514, 10982719, 12322516, 16088585, 11267386, \
10677987, 14227252, 13796508, 9166531, 12611378, 13726893, 10200956, 2104467, \
6884490, 2291581, 3929316, 7350579, 4954970, 229569, 5787956, 5597934, \
981451, 4563728, 8131277, 12044670, 11528739, 15495872, 12001629, 10394254, \
12913651, 13389928, 9953933, 14530838, 12855366, 11506617, 15912992, 7957703, \
2244510, 2860073, 5281264, 1591103, 253070, 4255697, 5846560, 1189311, \
7065462, 6315584, 12215705, 15971946, 15249143, 8723900, 10405449, 14013906, \
9186343, 8797820, 14661081, 16039938, 10836959, 15657452, 7712800, 3941331, \
415818, 5229333, 1332132, 2044011, 4369306, 653829, 3162460, 8016811, \
6400546, 2636245, 15934092, 14340146, 9030115, 8522284, 13285661, 9544902, \
9983603, 14896568, 11066597, 11872086, 16659851, 15134328, 909173, 5657775, \
6227802, 311233, 863412, 5658495, 3458754, 2989329, 6696776, 4175103, \
3466550, 5197449, 12983384, 9994503, 13709991, 13265272, 8509569, 12108438, \
15929679, 11152040, 10550065, 15954242, 14303903, 8493860, 4753633, 5452794, \
1762063, 4247765, 7277416, 3545131, 4038902, 6579013, 3111064, 1363443, \
6067814, 13042877, 9338700, 14544595, 14046650, 11470381, 14982901, 16645378, \
12019227, 11073524, 12684581, 10100378, 9635275, 4781076, 4452277, 1777002, \
7373843, 6915968, 2784333, 6383807, 7926690, 1245273, 728012, 4246023, \
2093170, 9855977, 13474324, 14981575, 12520170, 16085561, 15524324, 10992223, \
14551439, 13996512, 8839793, 9402798, 13969431, 1868624, 2560425, 6835262, \
7471079, 3859600, 6501913, 4820966, 1104951, 1795853, 4220632, 637971, \
3313582, 16455421, 11126016, 10682259, 16460894, 15742309, 9275056, 13000011, \
14515662, 9823765, 9351529, 15141114, 12376835, 3654084, 7238397, 2433834, \
4045043, 6212172, 4539149, 848050, 5745505, 6175420, 2162823, 2872131, \
15878328, 12138797, 10527606, 15446175, 9459976, 10078961, 13890982, 13247775, \
8470224, 15912193, 16504382, 10503918, 2735441, 7777944, 3942223, 349302, \
5164709, 5717848, 1844443, 4700038, 7261309, 3431656, 8193795, 6730838, \
11484652, 12349233, 14143650, 9355727, 8401436, 14264737, 13826938, 11092523, \
14700932, 16484949, 11676330, 15217075, 6546020, 1760140, 1116187, 4731618, \
762301, 1079324, 7883715, 6787154, 3051565, 7678972, 8322135, 2606474, \
13391833, 13896804, 10469302, 8676955, 13464896, 11980693, 12553838, 14947835, \
15083152, 12582413, 15748606, 13178403, 165152, 1686745, 5271046, 716214, \
2348265, 7866152, 3348887, 3860558, 6386617, 6832288, 1219431, 5868446, \
13135881, 8876912, 10414827, 16062734, 11273172, 10916033, 16640314, 11827959, \
11501636, 13013273, 14486218, 1468791, 5173436, 4580041, 3939666, 4165255, \
6608700, 2712948, 3309187, 8032026, 70893, 661300, 5500731, 14220490, \
8464149, 15373476, 15828459, 12148538, 10644613, 15447388, 11568682, 9637027, \
13557104, 8775373, 10318230, 5646947, 7183080, 2375965, 8344134, 7793627, \
2996520, 2560741, 6194135, 1431562, 814033, 4665712, 5546031, 12163998, \
14895169, 15388816, 11658047, 16394342, 14883217, 8962568, 8475903, 14380983, \
9616936, 9020889, 14833158, 8113719, 3210748, 6897185, 7284626, 3446223, \
6147692, 4611505, 1025130, 1357663, 6237573, 2579552, 2934779, 16082054, \
16661589, 10857416, 15519787, 14107634, 10476229, 12625948, 12792707, 10101346, \
11655485, 15260301, 2302546, 3781019, 7383724, 7035253, 147842, 5870107, \
5384564, 735397, 127806, 7913931, 3627216, 2371389, 15578351, 11953778, \
12539649, 12963036, 13541239, 9905826, 14460153, 12975948, 11423367, 11867510, \
16623593, 10894480, 3108167, 7657167, 1819960, 662817, 4275934, 5825807, \
1209472, 7031793, 6330670, 2859671, 3306304, 7989257, 10541754, 9044839, \
13697181, 10009496, 8612451, 13529334, 16089901, 11966544, 15608275, 15037230, \
12378365, 12015970, 4987411, 362972, 2027877, 5662391, 5111274, 2526809, \
8329108, 7611759, 2752122, 6451073, 7341060, 1677023, 8556450, 13335601, \
9463756, 10195982, 14814231, 15212520, 11658297, 16446854, 14778311, 11045912, \
13866913, 6177398, 293199, 1043336, 6197873, 3473894, 2923070, 6810193, \
8151488, 3420731, 7309806, 4593909, 1917464, 13955531, 13625462, 8657701, \
12093688, 15978579, 11170694, 10578108, 15907689, 16484242, 8410143, 13160268, \
12844725, 1582370, 1120203, 6987420, 2313477, 3700474, 7513131, 3128708, \
2363092, 6149451, 5686450, 360037, 4992332, 14124187, 12572514, 10767865, \
15728300, 11969351, 12398802, 12847913, 9427828, 9781478, 14430987, 12827352, \
9079269, 7426878, 8044731, 2863424, 2173457, 7878830, 1294719, 578192, \
4278665, 1747038, 1290918, 4800817, 6445784, 12308359, 16004374, 15541993, \
10927992, 10472471, 14505934, 8828765, 9415840, 13909987, 10306654, 10933636, \
7196529, 7683178, 4105647, 6813268, 5000393, 1265082, 1750631, 4269540, \
622105, 1231370, 7459315, 7864876, 10697644, 15378771, 15825410, 10179517, \
12746868, 13220739, 9447834, 10219597, 12895156, 11360315, 11995210, 16692177, \
6643716, 3041790, 6281971, 5537792, 866269, 4664910, 6094131, 1394424, \
3020365, 6786454, 3981027, 3372904, 15459773, 12623431, 10030430, 13776041, \
13231904, 8945143, 13847566, 16488209, 10519776, 11103279, 15892414, 12182721, \
4888, 4915887, 5683303, 1895216, 4682377, 5144914, 3508983, 3938988, \
6775129, 2421442, 3959063, 5708156, 9339617, 8778002, 14575823, 14121949, \
9212208, 14942443, 16472926, 11593861, 11138772, 14821243, 10198178, 1085205, \
5928524, 746667, 44850, 5872877, 7472541, 2742018, 6352099, 8027452, \
3343909, 824790, 4672779, 10387112, 9829877, 13411942, 8787867, 12422464, \
16570981, 15164351, 11415626, 16091857, 14588828, 8798319, 9298930, 5552129, \
1779928, 136151, 6930470, 7494073, 3828552, 6402071, 6848927, 1268328, \
5298609, 4842374, 143967, 10103216, 13737507, 11192190, 10704269, 16559620, \
16105459, 11404458, 12863029, 14540229, 9858122, 13580091, 12887268, 2086013, \
4083594, 6609987, 2991476, 3553197, 8215638, 4509635, 775816, 5383549, \
5880807, 240154, 4870425, 15811268, 12098103, 11741610, 15213265, 11129108, \
9685135, 14310010, 12689697, 9089168, 13855582, 14440615, 10862768, 3113833, \
7616670, 4041495, 2544488, 5193977, 1318694, 1945287, 4666712, 4482849, \
1957622, 7773550, 15666829, 10761424, 12576107, 15949502, 8932677, 8492096, \
14329499, 9534758, 8973557, 12830600, 16454923, 11546326, 6536996, 6972473, \
3232722, 1608451, 4429980, 599021, 1339954, 6289819, 396108, 2953397, \
7774626, 8387195, 10840276, 15520004, 14123643, 10230250, 9267249, 13034204, \
10449359, 9767474, 15637473, 10723692, 12088863, 15822786, 6986873, 69548, \
4790150, 5436499, 1830792, 31797, 4949350, 3315599, 3238936, 6913473, \
6481598, 3871791, 13897152, 13618705, 8844686, 14509814, 13975089, 9341320, \
10818143, 16540518, 12057017, 11446904, 15012803, 14061718, 2018157, 4553208, \
5005363, 1291086, 5802204, 6379553, 2810866, 3338495, 7940868, 2230929, \
757866, 13648683, 14250644, 8564045, 13155994, 14222883, 11720036, 15462044, \
14691587, 12531154, 11962029, 13425964, 8735955, 2029322, 5612829, 4988132, \
479079, 8311962, 7632585, 3092341, 2538686, 7702379, 1857104, 510085, \
4766590, 9446131, 10162592, 12765789, 15321294, 10514739, 16491064, 15776233, \
11028759, 8606342, 14336377, 9517104, 8530823, 4970846, 3199625, 3949472, \
6797439, 7121550, 3486481, 8275008, 4710315, 822847, 1455300, 6268889, \
314378, 11361767, 16140148, 12432393, 11283922, 15105639, 16500140, 9491961, \
13307458, 12729759, 10073725, 9455588, 15359411, 2199050, 3717077, 7544884, \
7010859, 2214906, 5902341, 5964700, 108795, 5011490, 5718933, 3985485, \
10846490, 15612851, 12019816, 12448157, 15090310, 13572419, 9739256, 14524965, \
13005142, 9423563, 16096008, 16123381, 2832111, 2158362, 7961793, 3294820, \
1672639, 4300004, 4878161, 1275018, 5817391, 6496116, 2755745, 7468314, \
16377815, 10648741, 11116344, 14190315, 9909526, 9334557, 12975852, 14614835, \
11932290, 15567581, 15006036, 12548771, 7627130, 7180365, 461461, 1997146, \
5628139, 979764, 985157, 7379146, 7963411, 2318560, 6847485, 7449358, \
12193987, 8586096, 13171245, 9694647, 10172226, 12584585, 11115964, 11689575, \
16344250, 14742793, 10989124, 16719287, 5555246, 915185, 421264, 6110222, \
1345535, 3114080, 6774297, 3993566, 3650631, 7219120, 6624105, 10274902, \
14121879, 13197388, 8958457, 9673634, 16402518, 11653597, 11198976, 14891123, \
12069358, 11588109, 13353360, 4225771, 1681982, 5415333, 4919872, 2116379, \
4118946, 8331892, 2373549, 2993290, 7790419, 6112684, 324669, 13549538, \
14101699, 10245404, 15189989, 15654002, 11873563, 12367564, 15115348, 11100071, \
9457402, 13870417, 13252228, 75359, 5954922, 7524017, 2691932, 6332879, \
8108690, 3164449, 2707708, 4379414, 1747203, 1128696, 4776745, 13095078, \
12339423, 16587528, 15114417, 11416422, 16079535, 16697496, 8885057, 9183998, \
13973806, 10414689, 8672976, 7161099, 7773942, 4173285, 6317320, 7067355, \
3853638, 1055805, 5842936, 193859, 617622, 5267404, 12291185, 10655410, \
15218447, 15952988, 12246917, 14747194, 13112571, 9940740, 10287637, 12870122, \
8901179, 12486836, 7670220, 3043867, 2613666, 8149349, 7670396, 1020291, \
4497490, 6126569, 1468844, 1020535, 6296522, 3868697, 11795045, 14738406, \
11079739, 11701184, 14393045, 12608558, 9140203, 13888592, 14159241, 10557342, \
11191415, 15857056, 3698201, 2563407, 7308694, 5510713, 2059752, 5176983, \
4568838, 1836505, 7839280, 7196455, 2389214, 4154957, 16161712, 11340027, \
8803183, 14672020, 13756481, 8928106, 12779703, 15257956, 11627481, 15890570, \
15442279, 10588924, 3803433, 5495762, 586435, 74029, 5913276, 5344067, \
2740506, 6447757, 8387940, 3452083, 7282314, 15091029, 9815188, 10321707, \
12987514, 9286789, 9733917, 16735454, 15134691, 11384624, 16065743, 16650070, \
10870321, 4769256, 5453695, 1748614, 114009, 4933240, 3821735, 3271031, \
6830796, 6500745, 3719282, 7461615, 4933948, 8564737, 10068930, 13776959, \
9390756, 10802129, 16621578, 11938703, 11320181, 15056936, 16143259, 10437186, \
12892549, 5189564, 1471587, 1885650, 6675997, 3030092, 3515891, 7927330, \
2313693, 678997, 4228642, 6010363, 1191532, 12713877, 13157598, 11732587, \
12074928, 14724133, 11237214, 11683731, 14277664, 8555517, 9384111, 13918466, \
14474201, 481324, 7209271, 7713478, 4122633, 3111312, 6603495, 1872190, \
1510025, 4995648, 4581846, 1983151, 5706608, 15239617, 10664462, 16474975, \
15757536, 11128633, 8527322, 14222535, 9500468, 8584425, 13323634, 13670166, \
3900557, 6438264, 6909603, 3208382, 7997277, 4529792, 822579, 1566318, \
6190773, 331028, 958155, 7735226, 16086308, 11332293, 15202586, 16515203, \
9798644, 13556077, 13002890, 10318675, 9601100, 13308349, 10488674, 11139267, \
7529368, 7877188, 2169079, 4885290, 5984841, 1073620, 653871, 4360890, \
1642993, 3261956, 7011743, 2583906, 12330545, 16225720, 13519950, 8740759, \
14542112, 14070905, 9244598, 9182215, 16238296, 12482473, 10828854, 15708127, \
3577416, 1917969, 4251622, 4976254, 1062293, 5833408, 4446299, 2804142, \
3236453, 8040792, 2335115, 2103894, 14240229, 9695912, 8921875, 12663238, \
14322236, 9949993, 15487202, 15182355, 12565388, 11804789, 15553314, 444587, \
1964124, 5515141, 1029306, 1035643, 5525412, 8344596, 2532683, 7159538, \
7351601, 3921868, 1296095, 13122818, 8630009, 10139516, 13718791, 13127378, \
10739529, 16360637, 16266998, 10743115, 15391896, 13716229, 10105062, 237759, \
5073664, 1333457, 2081070, 6591279, 7153904, 3586825, 8381087, 6640102, \
920353, 5745336, 5550407, 9265686, 8838057, 14535016, 11801331, 11149710, \
14941277, 16281328, 11752739, 13276255, 12693452, 9976849, 13788410, 4839407, \
3092, 3874753, 8038234, 2225335, 2781092, 7507549, 6133130, 272147, \
5207677, 5565868, 1924627, 8783040, 15634861, 11921974, 12351971, 15167512, \
11305485, 10295782, 14035007, 13562792, 8773841, 14293575, 5475246, 3707001, \
2188128, 6974367, 3201102, 3736545, 4330032, 780623, 1113046, 5988369, \
4330984, 36603, 16342023, 15889820, 11396697, 10788130, 16714935, 9868876, \
9233809, 13074066, 10366831, 9804988, 13370881, 15157082, 3996863, 7663397, \
6756340, 3015819, 1433354, 5926133, 225644, 566075, 5281986, 5970245, \
2147004, 6942819, 15870322, 12262029, 14713165, 13259510, 9661099, 10008920, \
13214405, 8520454, 10180923, 16042720, 15627029, 10952862, 8166347, 7719216, \
939172, 4581215, 6077458, 1523073, 984952, 4510895, 4179350, 3554905, \
6663400, 7116599, 10700518, 14245337, 13696528, 9119462, 12727679, 14274088, \
9625025, 11224414, 14792367, 12103156, 11753569, 6833034, 4309335, 1226852, \
5974969, 4567050, 967622, 1530773, 8136744, 2470899, 3023366, 7690253, \
4053976, 8831523, 13578682, 13937373, 10483716, 12992915, 13455978, 12429812, \
11713941, 15281738, 10536443, 12309540, 13766525, 605658, 108035, 5928944, \
5328109, 564790, 6531027, 8008776, 3276604, 2871015, 6444130, 1378201, \
1883268, 13102455, 9205418, 9815049, 14653780, 15084175, 11346238, 16183777, \
16730624, 10754334, 9274055, 14136112, 10250665, 359118, 4375383, 2822280, \
3160697, 8121206, 6549639, 2638680, 7444705, 5933234, 97150, 549069, \
5502224, 10096483, 10489086, 15447349, 15918784, 12156379, 15470382, 15177397, \
10225016, 13925899, 13627282, 8844644, 1906349, 7769906, 3144771, 2385564, \
8156461, 7834850, 3022747, 4521996, 6222037, 1309538, 4204587, 4723156, \
11764548, 12089503, 14773226, 11186785, 11764116, 16259919, 12765778, 9167281, \
13660780, 14222303, 8558978, 15288953, 7631357, 3596326, 3127955, 6557128, \
4133937, 1497014, 5074031, 4471832, 2000769, 5608574, 7098303, 2621344, \
12510289, 16070543, 11406894, 10669425, 13227976, 9987615, 9682374, 13143781, \
12670008, 12207555, 15924822, 15280397, 2240744, 3904115, 7391631, 612572, \
172867, 5812386, 1378941, 940996, 7325847, 7664442, 4137961, 6727732, \
15522575, 11879130, 10375473, 13085605, 9189630, 9896203, 14602896, 10800253, \
11353390, 16168627, 16360768, 2121433, 6508214, 5936487, 1156824, 737033
};
void p25p2_vf::process_vcw(const uint8_t vf[], int* b) {
int c0,c1,c2,c3;
int u0,u1,u2,u3;
extract_vcw(vf, c0, c1, c2, c3 );
u0 = gly24128Dec(c0);
// TODO: use pr_n[] to lookup m1
int pr[24];
int _m1[24];
pr[0] = 16 * u0;
for (int n=1; n < 24; n++) {
pr[n] = (173*pr[n-1] + 13849) - 65536 * int((173*pr[n-1]+13849)/65536);
_m1[n-1] = (pr[n] / 32768) & 1;
}
_m1[23] = 0;
int m1 = 0;
for (int i=0; i<23; i++)
m1 = (m1 << 1) + _m1[i];
u1 = gly23127Dec(c1 ^ m1);
u2 = c2;
u3 = c3;
// int b[9];
b[0] = ((u0 >> 5) & 0x78) + ((u3 >> 9) & 0x7);
b[1] = ((u0 >> 3) & 0x1e) + ((u3 >> 13) & 0x1);
b[2] = ((u0 << 1) & 0x1e) + ((u3 >> 12) & 0x1);
b[3] = ((u1 >> 3) & 0x1fe) + ((u3 >> 8) & 0x1);
b[4] = ((u1 << 3) & 0x78) + ((u3 >> 5) & 0x7);
b[5] = ((u2 >> 6) & 0x1e) + ((u3 >> 4) & 0x1);
b[6] = ((u2 >> 3) & 0x0e) + ((u3 >> 3) & 0x1);
b[7] = ( u2 & 0x0e) + ((u3 >> 2) & 0x1);
b[8] = ((u2 << 2) & 0x04) + ( u3 & 0x3);
}
void p25p2_vf::encode_vcw(uint8_t vf[], const int* b) {
uint32_t c0,c1,c2,c3;
int u0,u1,u2,u3;
u0 = \
((b[0] & 0x78) << 5 ) | \
((b[1] & 0x1e) << 3 ) | \
((b[2] & 0x1e) >> 1 );
u1 = \
((b[3] & 0x1fe) << 3 ) | \
((b[4] & 0x78) >> 3 );
u2 = \
((b[5] & 0x1e) << 6 ) | \
((b[6] & 0xe) << 3 ) | \
((b[7] & 0xe) ) | \
((b[8] & 0x4) >> 2 );
u3 = \
((b[1] & 0x1) << 13 ) | \
((b[2] & 0x1) << 12 ) | \
((b[0] & 0x7) << 9 ) | \
((b[3] & 0x1) << 8 ) | \
((b[4] & 0x7) << 5 ) | \
((b[5] & 0x1) << 4 ) | \
((b[6] & 0x1) << 3 ) | \
((b[7] & 0x1) << 2 ) | \
((b[8] & 0x3) );
int m1 = pr_n[u0] >> 1;
c0 = golay_24_encode(u0);
c1 = golay_23_encode(u1) ^ m1;
c2 = u2;
c3 = u3;
interleave_vcw(vf, c0, c1, c2, c3);
}
void p25p2_vf::interleave_vcw(uint8_t _vf[], int _c0, int _c1, int _c2, int _c3){
uint8_t vf[72];
uint8_t c0[24];
uint8_t c1[23];
uint8_t c2[11];
uint8_t c3[14];
dump_i(c0, _c0, 24);
dump_i(c1, _c1, 23);
dump_i(c2, _c2, 11);
dump_i(c3, _c3, 14);
vf[0] = c0[23];
vf[1] = c0[5];
vf[2] = c1[10];
vf[3] = c2[3];
vf[4] = c0[22];
vf[5] = c0[4];
vf[6] = c1[9];
vf[7] = c2[2];
vf[8] = c0[21];
vf[9] = c0[3];
vf[10] = c1[8];
vf[11] = c2[1];
vf[12] = c0[20];
vf[13] = c0[2];
vf[14] = c1[7];
vf[15] = c2[0];
vf[16] = c0[19];
vf[17] = c0[1];
vf[18] = c1[6];
vf[19] = c3[13];
vf[20] = c0[18];
vf[21] = c0[0];
vf[22] = c1[5];
vf[23] = c3[12];
vf[24] = c0[17];
vf[25] = c1[22];
vf[26] = c1[4];
vf[27] = c3[11];
vf[28] = c0[16];
vf[29] = c1[21];
vf[30] = c1[3];
vf[31] = c3[10];
vf[32] = c0[15];
vf[33] = c1[20];
vf[34] = c1[2];
vf[35] = c3[9];
vf[36] = c0[14];
vf[37] = c1[19];
vf[38] = c1[1];
vf[39] = c3[8];
vf[40] = c0[13];
vf[41] = c1[18];
vf[42] = c1[0];
vf[43] = c3[7];
vf[44] = c0[12];
vf[45] = c1[17];
vf[46] = c2[10];
vf[47] = c3[6];
vf[48] = c0[11];
vf[49] = c1[16];
vf[50] = c2[9];
vf[51] = c3[5];
vf[52] = c0[10];
vf[53] = c1[15];
vf[54] = c2[8];
vf[55] = c3[4];
vf[56] = c0[9];
vf[57] = c1[14];
vf[58] = c2[7];
vf[59] = c3[3];
vf[60] = c0[8];
vf[61] = c1[13];
vf[62] = c2[6];
vf[63] = c3[2];
vf[64] = c0[7];
vf[65] = c1[12];
vf[66] = c2[5];
vf[67] = c3[1];
vf[68] = c0[6];
vf[69] = c1[11];
vf[70] = c2[4];
vf[71] = c3[0];
for (int i=0; i<sizeof(vf)/2; i++) {
_vf[i] = (vf[i*2] << 1) | vf[i*2+1];
}
}
void p25p2_vf::extract_vcw(const uint8_t _vf[], int& _c0, int& _c1, int& _c2, int& _c3){
uint8_t vf[72];
uint8_t c0[24];
uint8_t c1[23];
uint8_t c2[11];
uint8_t c3[14];
for (int i=0; i<sizeof(vf)/2; i++) {
vf[i*2] = (_vf[i] >> 1) & 1;
vf[i*2+1] = _vf[i] & 1;
}
c0[23] = vf[0];
c0[5] = vf[1];
c1[10] = vf[2];
c2[3] = vf[3];
c0[22] = vf[4];
c0[4] = vf[5];
c1[9] = vf[6];
c2[2] = vf[7];
c0[21] = vf[8];
c0[3] = vf[9];
c1[8] = vf[10];
c2[1] = vf[11];
c0[20] = vf[12];
c0[2] = vf[13];
c1[7] = vf[14];
c2[0] = vf[15];
c0[19] = vf[16];
c0[1] = vf[17];
c1[6] = vf[18];
c3[13] = vf[19];
c0[18] = vf[20];
c0[0] = vf[21];
c1[5] = vf[22];
c3[12] = vf[23];
c0[17] = vf[24];
c1[22] = vf[25];
c1[4] = vf[26];
c3[11] = vf[27];
c0[16] = vf[28];
c1[21] = vf[29];
c1[3] = vf[30];
c3[10] = vf[31];
c0[15] = vf[32];
c1[20] = vf[33];
c1[2] = vf[34];
c3[9] = vf[35];
c0[14] = vf[36];
c1[19] = vf[37];
c1[1] = vf[38];
c3[8] = vf[39];
c0[13] = vf[40];
c1[18] = vf[41];
c1[0] = vf[42];
c3[7] = vf[43];
c0[12] = vf[44];
c1[17] = vf[45];
c2[10] = vf[46];
c3[6] = vf[47];
c0[11] = vf[48];
c1[16] = vf[49];
c2[9] = vf[50];
c3[5] = vf[51];
c0[10] = vf[52];
c1[15] = vf[53];
c2[8] = vf[54];
c3[4] = vf[55];
c0[9] = vf[56];
c1[14] = vf[57];
c2[7] = vf[58];
c3[3] = vf[59];
c0[8] = vf[60];
c1[13] = vf[61];
c2[6] = vf[62];
c3[2] = vf[63];
c0[7] = vf[64];
c1[12] = vf[65];
c2[5] = vf[66];
c3[1] = vf[67];
c0[6] = vf[68];
c1[11] = vf[69];
c2[4] = vf[70];
c3[0] = vf[71];
load_i(c0, _c0, 24);
load_i(c1, _c1, 23);
load_i(c2, _c2, 11);
load_i(c3, _c3, 14);
}
static const int m_list[] = {0, 1, 2, 3, 4, 5, 11, 12, 13, 14, 17, 18, 19, 20, 21, 22, 23, 26, 27, 28, 29, 30, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 7, 8, 9, 10, 15, 16, 24, 25, 31, 32, 6};
static const int d_list[] = {7, 1, 11, 21, 31, 25, 35, 45, 55, 49, 59, 69, 6, 0, 10, 20, 30, 24, 34, 44, 54, 48, 58, 68, 5, 15, 9, 19, 29, 39, 33, 43, 53, 63, 57, 67, 4, 14, 8, 18, 28, 38, 32, 42, 52, 62, 56, 66, 3, 13, 23, 17, 27, 37, 47, 41, 51, 61, 71, 65, 2, 12, 22, 16, 26, 36, 46, 40, 50, 60, 70, 64};
static const int alt_d_list[] = {0, 12, 24, 36, 48, 60, 1, 13, 25, 37, 49, 61, 2, 14, 26, 38, 50, 62, 3, 15, 27, 39, 51, 63, 4, 16, 28, 40, 52, 64, 5, 17, 29, 41, 53, 65, 6, 18, 30, 42, 54, 66, 7, 19, 31, 43, 55, 67, 8, 20, 32, 44, 56, 68, 9, 21, 33, 45, 57, 69, 10, 22, 34, 46, 58, 70, 11, 23, 35, 47, 59, 71};
static const int b_lengths[] = {7,4,6,9,7,4,4,4,3};
void p25p2_vf::encode_dstar(uint8_t result[72], const int b[9], bool alt_dstar_interleave) {
uint8_t pbuf[48];
uint8_t tbuf[48];
int tbufp = 0;
for (int i=0; i < 9; i++) {
store_reg(b[i], &tbuf[tbufp], b_lengths[i]);
tbufp += b_lengths[i];
}
for (int i=0; i < 48; i++)
pbuf[i] = tbuf[m_list[i]];
int u0 = load_reg(pbuf+0, 12);
int u1 = load_reg(pbuf+12, 12);
int m1 = pr_n[u0];
int c0 = golay_24_encode(u0);
int c1 = golay_24_encode(u1) ^ m1;
uint8_t pre_buf[72];
store_reg(c0, pre_buf, 24);
store_reg(c1, pre_buf+24, 24);
memcpy(pre_buf+48, pbuf+24, 24);
for (int i=0; i < 72; i++)
if (alt_dstar_interleave)
result[i] = pre_buf[alt_d_list[i]];
else
result[d_list[i]] = pre_buf[i];
}
void p25p2_vf::decode_dstar(const uint8_t codeword[72], int b[9], bool alt_dstar_interleave) {
uint8_t pre_buf[72];
uint8_t post_buf[48];
uint8_t tbuf[48];
for (int i=0; i < 72; i++)
if (alt_dstar_interleave)
pre_buf[alt_d_list[i]] = codeword[i];
else
pre_buf[i] = codeword[d_list[i]];
uint32_t c0 = load_reg(pre_buf, 24);
uint32_t c1 = load_reg(pre_buf+24, 24);
uint32_t u0 = gly24128Dec(c0);
uint32_t m1 = pr_n[u0];
uint32_t u1 = gly24128Dec(c1 ^ m1);
store_reg(u0, post_buf, 12);
store_reg(u1, post_buf+12, 12);
memcpy(post_buf+24, pre_buf+48, 24);
for (int i=0; i < 48; i++)
tbuf[m_list[i]] = post_buf[i];
int tbufp = 0;
for (int i=0; i < 9; i++) {
b[i] = load_reg(&tbuf[tbufp], b_lengths[i]);
tbufp += b_lengths[i];
}
}