/******************************************************************** Tables and references used for QR code *********************************************************************/ //Pattern (bitmatri-1) template for Function pattern and Format info var function_pattern_with_format_info = { /* 0 : white 1 : black 2-16 : Format info */ TOP_LEFT: [ [1,1,1,1,1,1,1,0,2], [1,0,0,0,0,0,1,0,3], [1,0,1,1,1,0,1,0,4], [1,0,1,1,1,0,1,0,5], [1,0,1,1,1,0,1,0,6], [1,0,0,0,0,0,1,0,7], [1,1,1,1,1,1,1,0,1], [0,0,0,0,0,0,0,0,8], [16,15,14,13,12,11,1,10,9] ], TOP_RIGHT: [ [0,1,1,1,1,1,1,1], [0,1,0,0,0,0,0,1], [0,1,0,1,1,1,0,1], [0,1,0,1,1,1,0,1], [0,1,0,1,1,1,0,1], [0,1,0,0,0,0,0,1], [0,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0], [9,8,7,6,5,4,3,2] ], BOTTOM_LEFT: [ [0,0,0,0,0,0,0,0,1], [1,1,1,1,1,1,1,0,10], [1,0,0,0,0,0,1,0,11], [1,0,1,1,1,0,1,0,12], [1,0,1,1,1,0,1,0,13], [1,0,1,1,1,0,1,0,14], [1,0,0,0,0,0,1,0,15], [1,1,1,1,1,1,1,0,16], ] }; var alignment_pattern_array = [ [], //1 [6, 18], //2 [6, 22], //3 [6, 26], //4 [6, 30], //5 [6, 34], //6 [6, 22, 38], //7 [6, 24, 42], //8 [6, 26, 46], //9 [6, 28, 50], //10 [6, 30, 54], //11 [6, 32, 58], //12 [6, 34, 62], //13 [6, 26, 46, 66], //14 [6, 26, 48, 70], //15 [6, 26, 50, 74], //16 [6, 30, 54, 78], //17 [6, 30, 56, 82], //18 [6, 30, 58, 86], //19 [6, 34, 62, 90], //20 [6, 28, 50, 72, 94], //21 [6, 26, 50, 74, 98], //22 [6, 30, 54, 78, 102], //23 [6, 28, 54, 80, 106], //24 [6, 32, 58, 84, 110], //25 [6, 30, 58, 86, 114], //26 [6, 34, 62, 90, 118], //27 [6, 26, 50, 74, 98, 122], //28 [6, 30, 54, 78, 102, 126], //29 [6, 26, 52, 78, 104, 130], //30 [6, 30, 56, 82, 108, 134], //31 [6, 34, 60, 86, 112, 138], //32 [6, 30, 58, 86, 114, 142], //33 [6, 34, 62, 90, 118, 146], //34 [6, 30, 54, 78, 102, 126, 150], //35 [6, 24, 50, 76, 102, 128, 154], //36 [6, 28, 54, 80, 106, 132, 158], //37 [6, 32, 58, 84, 110, 136, 162], //38 [6, 26, 54, 82, 110, 138, 166], //39 [6, 30, 58, 86, 114, 142, 170] //40 ]; var format_information_bits_raw = { ecc: [ "11", //L "10", //M "01", //Q "00" //H ], mask: [ "101", "001", "111", "110", "001", "000", "011", "010" ] } var format_information_bits_partial = { BOTTOM_LEFT: [ "1110111", "1110010", "1111101", "1111000", "1100110", "1100011", "1101100", "1101001", //ECC M "1010100", "1010001", "1011110", "1011011", "1000101", "1000000", "1001111", "1001010", //ECC Q "0110101", "0110000", "0111111", "0111010", "0100100", "0100001", "0101110", "0101011", //ECC H "0010110", "0010011", "0011100", "0011001", "0000111", "0000010", "0001101", "0001000" ], TOP_RIGHT: [ "11000100", "11110011", "10101010", "10011101", "00101111", "00011000", "01000001", "01110110", //ECC M "00010010", "00100101", "01111100", "01001011", "11111001", "11001110", "10010111", "10100000", //ECC Q "01011111", "01101000", "00110001", "00000110", "10110100", "10000011", "11011010", "11101101", //ECC H "10001001", "10111110", "11100111", "11010000", "01100010", "01010101", "00001100", "00111011" ] } var format_information_bits = [ //ECC L ["111011111000100", "111001011110011", "111110110101010", "111100010011101", "110011000101111", "110001100011000", "110110001000001", "110100101110110"], //ECC M ["101010000010010", "101000100100101", "101111001111100", "101101101001011", "100010111111001", "100000011001110", "100111110010111", "100101010100000"], //ECC Q ["011010101011111", "011000001101000", "011111100110001", "011101000000110", "010010010110100", "010000110000011", "010111011011010", "010101111101101"], //ECC H ["001011010001001", "001001110111110", "001110011100111", "001100111010000", "000011101100010", "000001001010101", "000110100001100", "000100000111011"] ]; var format_information_unmask = [ '000000000000000', '000010100110111', '000101001101110', '000111101011001', '001000111101011', '001010011011100', '001101110000101', '001111010110010', '010001111010110', '010011011100001', '010100110111000', '010110010001111', '011001000111101', '011011100001010', '011100001010011', '011110101100100', '100001010011011', '100011110101100', '100100011110101', '100110111000010', '101001101110000', '101011001000111', '101100100011110', '101110000101001', '110000101001101', '110010001111010', '110101100100011', '110111000010100', '111000010100110', '111010110010001', '111101011001000', '111111111111111' ]; /* https://www.thonky.com/qr-code-tutorial/format-version-tables */ //Version information table for QR version 7 and higher var version_information_table = [ "000111110010010100", //7 "001000010110111100", //8 "001001101010011001", //9 "001010010011010011", //10 "001011101111110110", //11 "001100011101100010", //12 "001101100001000111", //13 "001110011000001101", //14 "001111100100101000", //15 "010000101101111000", //16 "010001010001011101", //17 "010010101000010111", //18 "010011010100110010", //19 "010100100110100110", //20 "010101011010000011", //21 "010110100011001001", //22 "010111011111101100", //23 "011000111011000100", //24 "011001000111100001", //25 "011010111110101011", //26 "011011000010001110", //27 "011100110000011010", //28 "011101001100111111", //29 "011110110101110101", //30 "011111001001010000", //31 "100000100111010101", //32 "100001011011110000", //33 "100010100010111010", //34 "100011011110011111", //35 "100100101100001011", //36 "100101010000101110", //37 "100110101001100100", //38 "100111010101000001", //39 "101000110001101001" //40 ]; /* https://www.thonky.com/qr-code-tutorial/format-version-information */ // L = 1 // M = 0 // Q = 3 // H = 2 /* M L H Q https://www.thonky.com/qr-code-tutorial/error-correction-table adding code block 1 and 2 */ var data_code_num_table = [ [ 16, 19, 9, 13], //1 [ 28, 34, 16, 22], //2 [ 44, 55, 26, 34], //3 [ 64, 80, 36, 48], //4 [ 86, 108, 46, 62], //5 [ 108, 136, 60, 76], //6 [ 124, 156, 66, 88], //7 [ 154, 194, 86, 110], //8 [ 182, 232, 100, 132], //9 [ 216, 274, 122, 154], //10 [ 254, 324, 140, 180], //11 [ 290, 370, 158, 206], //12 [ 334, 428, 180, 244], //13 [ 365, 461, 197, 261], //14 [ 415, 523, 223, 295], //15 [ 453, 589, 253, 325], //16 [ 507, 647, 283, 367], //17 [ 563, 721, 313, 397], //18 [ 627, 795, 341, 445], //19 [ 669, 861, 385, 485], //20 [ 714, 932, 406, 512], //21 [ 782, 1006, 442, 568], //22 [ 860, 1094, 464, 614], //23 [ 914, 1174, 514, 664], //24 [1000, 1276, 538, 718], //25 [1062, 1370, 596, 754], //26 [1128, 1468, 628, 808], //27 [1193, 1531, 661, 871], //28 [1267, 1631, 701, 911], //29 [1373, 1735, 745, 985], //30 [1455, 1843, 793, 1033], //31 [1541, 1955, 845, 1115], //32 [1631, 2071, 901, 1171], //33 [1725, 2191, 961, 1231], //34 [1812, 2306, 986, 1286], //35 [1914, 2434, 1054, 1354], //36 [1992, 2566, 1096, 1426], //37 [2102, 2702, 1142, 1502], //38 [2216, 2812, 1222, 1582], //39 [2334, 2956, 1276, 1666] //40 ]; /* M L H Q https://www.thonky.com/qr-code-tutorial/error-correction-table adding code block 1 and 2 */ var RS_block_num_table = [ [1, 1, 1, 1], //1 [1, 1, 1, 1], //2 [1, 1, 2, 2], //3 [2, 1, 4, 2], //4 [2, 1, 4, 4], //5 [4, 2, 4, 4], //6 [4, 2, 5, 6], //7 [4, 2, 6, 6], //8 [5, 2, 8, 8], //9 [5, 4, 8, 8], //10 [5, 4, 11,8], //11 [8, 4, 11,10], //12 [9, 4, 16,12], //13 [9, 4, 16,16], //14 [10,6, 18,12], //15 [10,6, 16,17], //16 [11,6, 19,16], //17 [13, 6, 21, 18], //18 [14, 7, 25, 21], //19 [16, 8, 25, 20], //20 [17, 8, 25, 23], //21 [17, 9, 34, 23], //22 [18, 9, 30, 25], //23 [20, 10, 32, 27], //24 [21, 12, 35, 29], //25 [23, 12, 37, 34], //26 [25, 12, 40, 34], //27 [26, 13, 42, 35], //28 [28, 14, 45, 38], //29 [29, 15, 48, 40], //30 [31, 16, 51, 43], //31 [33, 17, 54, 45], //32 [35, 18, 57, 48], //33 [37, 19, 60, 51], //34 [38, 19, 63, 53], //35 [40, 20, 66, 56], //36 [43, 21, 70, 59], //37 [45, 22, 74, 62], //38 [47, 24, 77, 65], //39 [49, 25, 81, 68] //40 ]; /* M L H Q https://www.thonky.com/qr-code-tutorial/error-correction-table adding code block 1 and 2 */ var error_correction_code_table = [ [10, 7,17,13], //1 [16,10,28,22], //2 [26,15,22,18], //3 [18,20,16,26], //4 [24,26,22,18], //5 [16,18,28,24], //6 [18,20,26,18], //7 [22,24,26,22], //8 [22,30,24,20], //9 [26,18,28,24], //10 [30,20,24,28], //11 [22,24,28,26], //12 [22,26,22,24], //13 [24,30,24,20], //14 [24,22,24,30], //15 [28,24,30,24], //16 [28,28,28,28], //17 [26,30,28,28], //18 [26,28,26,26], //19 [26,28,28,30], //20 [26,28,30,28], //21 [28,28,24,30], //22 [28,30,30,30], //23 [28,30,30,30], //24 [28,26,30,30], //25 [28,28,30,28], //26 [28,30,30,30], //27 [28,30,30,30], //28 [28,30,30,30], //29 [28,30,30,30], //30 [28,30,30,30], //31 [28,30,30,30], //32 [28,30,30,30], //33 [28,30,30,30], //34 [28,30,30,30], //35 [28,30,30,30], //36 [28,30,30,30], //37 [28,30,30,30], //38 [28,30,30,30], //39 [28,30,30,30] //40 ]; var alphanumeric_table = [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", " ", "$", "%", "*", "+", "-", ".", "/", ":" ]; /* https://www.thonky.com/qr-code-tutorial/structure-final-message up to QR version 40 1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031323334353637383940 */ var remainder_bits_table = [0,7,7,7,7,7,0,0,0,0,0,0,0,3,3,3,3,3,3,3,4,4,4,4,4,4,4,3,3,3,3,3,3,3,0,0,0,0,0,0];