diff --git a/backend/2of5.c b/backend/2of5.c index 9e550cc1..81e2c0a0 100644 --- a/backend/2of5.c +++ b/backend/2of5.c @@ -2,7 +2,7 @@ /* libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart + Copyright (C) 2008-2016 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -28,7 +28,7 @@ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + */ #include #include @@ -39,331 +39,332 @@ #define inline _inline #endif -static const char *C25MatrixTable[10] = {"113311", "311131", "131131", "331111", "113131", "313111", - "133111", "111331", "311311", "131311"}; +static const char *C25MatrixTable[10] = { + "113311", "311131", "131131", "331111", "113131", "313111", + "133111", "111331", "311311", "131311" +}; -static const char *C25IndustTable[10] = {"1111313111", "3111111131", "1131111131", "3131111111", "1111311131", - "3111311111", "1131311111", "1111113131", "3111113111", "1131113111"}; +static const char *C25IndustTable[10] = { + "1111313111", "3111111131", "1131111131", "3131111111", "1111311131", + "3111311111", "1131311111", "1111113131", "3111113111", "1131113111" +}; -static const char *C25InterTable[10] = {"11331", "31113", "13113", "33111", "11313", "31311", "13311", "11133", - "31131", "13131"}; +static const char *C25InterTable[10] = { + "11331", "31113", "13113", "33111", "11313", "31311", "13311", "11133", + "31131", "13131" +}; -static inline char check_digit(unsigned int count) -{ - return itoc((10 - (count % 10)) % 10); +static inline char check_digit(unsigned int count) { + return itoc((10 - (count % 10)) % 10); } -int matrix_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Code 2 of 5 Standard (Code 2 of 5 Matrix) */ - - int i, error_number; - char dest[512]; /* 6 + 80 * 6 + 6 + 1 ~ 512*/ +/* Code 2 of 5 Standard (Code 2 of 5 Matrix) */ +int matrix_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) { - error_number = 0; + int i, error_number; + char dest[512]; /* 6 + 80 * 6 + 6 + 1 ~ 512*/ - if(length > 80) { - strcpy(symbol->errtxt, "Input too long"); - return ZINT_ERROR_TOO_LONG; - } - error_number = is_sane(NEON, source, length); - if(error_number == ZINT_ERROR_INVALID_DATA) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } + error_number = 0; - /* start character */ - strcpy(dest, "411111"); + if (length > 80) { + strcpy(symbol->errtxt, "Input too long"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Invalid characters in data"); + return error_number; + } - for(i = 0; i < length; i++) { - lookup(NEON, C25MatrixTable, source[i], dest); - } + /* start character */ + strcpy(dest, "411111"); - /* Stop character */ - concat (dest, "41111"); + for (i = 0; i < length; i++) { + lookup(NEON, C25MatrixTable, source[i], dest); + } - expand(symbol, dest); - ustrcpy(symbol->text, source); - return error_number; + /* Stop character */ + concat(dest, "41111"); + + expand(symbol, dest); + ustrcpy(symbol->text, source); + return error_number; } -int industrial_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Code 2 of 5 Industrial */ +/* Code 2 of 5 Industrial */ +int industrial_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) { - int i, error_number; - char dest[512]; /* 6 + 40 * 10 + 6 + 1 */ + int i, error_number; + char dest[512]; /* 6 + 40 * 10 + 6 + 1 */ - error_number = 0; + error_number = 0; - if(length > 45) { - strcpy(symbol->errtxt, "Input too long"); - return ZINT_ERROR_TOO_LONG; - } - error_number = is_sane(NEON, source, length); - if(error_number == ZINT_ERROR_INVALID_DATA) { - strcpy(symbol->errtxt, "Invalid character in data"); - return error_number; - } + if (length > 45) { + strcpy(symbol->errtxt, "Input too long"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Invalid character in data"); + return error_number; + } - /* start character */ - strcpy(dest, "313111"); + /* start character */ + strcpy(dest, "313111"); - for(i = 0; i < length; i++) { - lookup(NEON, C25IndustTable, source[i], dest); - } + for (i = 0; i < length; i++) { + lookup(NEON, C25IndustTable, source[i], dest); + } - /* Stop character */ - concat (dest, "31113"); + /* Stop character */ + concat(dest, "31113"); - expand(symbol, dest); - ustrcpy(symbol->text, source); - return error_number; + expand(symbol, dest); + ustrcpy(symbol->text, source); + return error_number; } -int iata_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Code 2 of 5 IATA */ - int i, error_number; - char dest[512]; /* 4 + 45 * 10 + 3 + 1 */ +/* Code 2 of 5 IATA */ +int iata_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) { + int i, error_number; + char dest[512]; /* 4 + 45 * 10 + 3 + 1 */ - error_number = 0; + error_number = 0; - if(length > 45) { - strcpy(symbol->errtxt, "Input too long"); - return ZINT_ERROR_TOO_LONG; - } - error_number = is_sane(NEON, source, length); - if(error_number == ZINT_ERROR_INVALID_DATA) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } + if (length > 45) { + strcpy(symbol->errtxt, "Input too long"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Invalid characters in data"); + return error_number; + } - /* start */ - strcpy(dest, "1111"); - - for(i = 0; i < length; i++) { - lookup(NEON, C25IndustTable, source[i], dest); - } + /* start */ + strcpy(dest, "1111"); - /* stop */ - concat (dest, "311"); + for (i = 0; i < length; i++) { + lookup(NEON, C25IndustTable, source[i], dest); + } - expand(symbol, dest); - ustrcpy(symbol->text, source); - return error_number; + /* stop */ + concat(dest, "311"); + + expand(symbol, dest); + ustrcpy(symbol->text, source); + return error_number; } -int logic_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Code 2 of 5 Data Logic */ - - int i, error_number; - char dest[512]; /* 4 + 80 * 6 + 3 + 1 */ +/* Code 2 of 5 Data Logic */ +int logic_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) { - error_number = 0; + int i, error_number; + char dest[512]; /* 4 + 80 * 6 + 3 + 1 */ - if(length > 80) { - strcpy(symbol->errtxt, "Input too long"); - return ZINT_ERROR_TOO_LONG; - } - error_number = is_sane(NEON, source, length); - if(error_number == ZINT_ERROR_INVALID_DATA) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } + error_number = 0; - /* start character */ - strcpy(dest, "1111"); + if (length > 80) { + strcpy(symbol->errtxt, "Input too long"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Invalid characters in data"); + return error_number; + } - for(i = 0; i < length; i++) { - lookup(NEON, C25MatrixTable, source[i], dest); - } + /* start character */ + strcpy(dest, "1111"); - /* Stop character */ - concat (dest, "311"); + for (i = 0; i < length; i++) { + lookup(NEON, C25MatrixTable, source[i], dest); + } - expand(symbol, dest); - ustrcpy(symbol->text, source); - return error_number; + /* Stop character */ + concat(dest, "311"); + + expand(symbol, dest); + ustrcpy(symbol->text, source); + return error_number; } -int interleaved_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Code 2 of 5 Interleaved */ +/* Code 2 of 5 Interleaved */ +int interleaved_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) { - int i, j, k, error_number; - char bars[7], spaces[7], mixed[14], dest[1000]; + int i, j, k, error_number; + char bars[7], spaces[7], mixed[14], dest[1000]; #ifndef _MSC_VER - unsigned char temp[length + 2]; + unsigned char temp[length + 2]; #else - unsigned char* temp = (unsigned char *)_alloca((length + 2) * sizeof(unsigned char)); + unsigned char* temp = (unsigned char *) _alloca((length + 2) * sizeof (unsigned char)); #endif - error_number = 0; + error_number = 0; - if(length > 89) { - strcpy(symbol->errtxt, "Input too long"); - return ZINT_ERROR_TOO_LONG; - } - error_number = is_sane(NEON, source, length); - if (error_number == ZINT_ERROR_INVALID_DATA) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } + if (length > 89) { + strcpy(symbol->errtxt, "Input too long"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Invalid characters in data"); + return error_number; + } - ustrcpy(temp, (unsigned char *) ""); - /* Input must be an even number of characters for Interlaced 2 of 5 to work: - if an odd number of characters has been entered then add a leading zero */ - if (length & 1) - { - ustrcpy(temp, (unsigned char *) "0"); - length++; - } - uconcat(temp, source); + ustrcpy(temp, (unsigned char *) ""); + /* Input must be an even number of characters for Interlaced 2 of 5 to work: + if an odd number of characters has been entered then add a leading zero */ + if (length & 1) { + ustrcpy(temp, (unsigned char *) "0"); + length++; + } + uconcat(temp, source); - /* start character */ - strcpy(dest, "1111"); + /* start character */ + strcpy(dest, "1111"); - for(i = 0; i < length; i+=2 ) - { - /* look up the bars and the spaces and put them in two strings */ - strcpy(bars, ""); - lookup(NEON, C25InterTable, temp[i], bars); - strcpy(spaces, ""); - lookup(NEON, C25InterTable, temp[i + 1], spaces); + for (i = 0; i < length; i += 2) { + /* look up the bars and the spaces and put them in two strings */ + strcpy(bars, ""); + lookup(NEON, C25InterTable, temp[i], bars); + strcpy(spaces, ""); + lookup(NEON, C25InterTable, temp[i + 1], spaces); - /* then merge (interlace) the strings together */ - k = 0; - for(j = 0; j <= 4; j++) - { - mixed[k] = bars[j]; k++; - mixed[k] = spaces[j]; k++; - } - mixed[k] = '\0'; - concat (dest, mixed); - } + /* then merge (interlace) the strings together */ + k = 0; + for (j = 0; j <= 4; j++) { + mixed[k] = bars[j]; + k++; + mixed[k] = spaces[j]; + k++; + } + mixed[k] = '\0'; + concat(dest, mixed); + } - /* Stop character */ - concat (dest, "311"); + /* Stop character */ + concat(dest, "311"); - expand(symbol, dest); - ustrcpy(symbol->text, temp); - return error_number; + expand(symbol, dest); + ustrcpy(symbol->text, temp); + return error_number; } -int itf14(struct zint_symbol *symbol, unsigned char source[], int length) -{ - int i, error_number, zeroes; - unsigned int count; - char localstr[16]; +/* Interleaved 2-of-5 (ITF) */ +int itf14(struct zint_symbol *symbol, unsigned char source[], int length) { + int i, error_number, zeroes; + unsigned int count; + char localstr[16]; - error_number = 0; + error_number = 0; - count = 0; + count = 0; - if(length > 13) { - strcpy(symbol->errtxt, "Input too long"); - return ZINT_ERROR_TOO_LONG; - } + if (length > 13) { + strcpy(symbol->errtxt, "Input too long"); + return ZINT_ERROR_TOO_LONG; + } - error_number = is_sane(NEON, source, length); - if(error_number == ZINT_ERROR_INVALID_DATA) { - strcpy(symbol->errtxt, "Invalid character in data"); - return error_number; - } + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Invalid character in data"); + return error_number; + } - /* Add leading zeros as required */ - zeroes = 13 - length; - for(i = 0; i < zeroes; i++) { - localstr[i] = '0'; - } - strcpy(localstr + zeroes, (char *)source); + /* Add leading zeros as required */ + zeroes = 13 - length; + for (i = 0; i < zeroes; i++) { + localstr[i] = '0'; + } + strcpy(localstr + zeroes, (char *) source); - /* Calculate the check digit - the same method used for EAN-13 */ + /* Calculate the check digit - the same method used for EAN-13 */ + for (i = 12; i >= 0; i--) { + count += ctoi(localstr[i]); - for (i = 12; i >= 0; i--) { - count += ctoi(localstr[i]); - - if (!(i & 1)) { - count += 2 * ctoi(localstr[i]); - } - } - localstr[13] = check_digit(count); - localstr[14] = '\0'; - error_number = interleaved_two_of_five(symbol, (unsigned char *)localstr, strlen(localstr)); - ustrcpy(symbol->text, (unsigned char*)localstr); - return error_number; + if (!(i & 1)) { + count += 2 * ctoi(localstr[i]); + } + } + localstr[13] = check_digit(count); + localstr[14] = '\0'; + error_number = interleaved_two_of_five(symbol, (unsigned char *) localstr, strlen(localstr)); + ustrcpy(symbol->text, (unsigned char*) localstr); + return error_number; } -int dpleit(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Deutshe Post Leitcode */ - int i, error_number; - unsigned int count; - char localstr[16]; - int zeroes; +/* Deutshe Post Leitcode */ +int dpleit(struct zint_symbol *symbol, unsigned char source[], int length) { + int i, error_number; + unsigned int count; + char localstr[16]; + int zeroes; - error_number = 0; - count = 0; - if(length > 13) { - strcpy(symbol->errtxt, "Input wrong length"); - return ZINT_ERROR_TOO_LONG; - } - error_number = is_sane(NEON, source, length); - if(error_number == ZINT_ERROR_INVALID_DATA) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } + error_number = 0; + count = 0; + if (length > 13) { + strcpy(symbol->errtxt, "Input wrong length"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Invalid characters in data"); + return error_number; + } - zeroes = 13 - length; - for(i = 0; i < zeroes; i++) - localstr[i] = '0'; - strcpy(localstr + zeroes, (char *)source); - - for (i = 12; i >= 0; i--) - { - count += 4 * ctoi(localstr[i]); + zeroes = 13 - length; + for (i = 0; i < zeroes; i++) + localstr[i] = '0'; + strcpy(localstr + zeroes, (char *) source); - if (i & 1) { - count += 5 * ctoi(localstr[i]); - } - } - localstr[13] = check_digit(count); - localstr[14] = '\0'; - error_number = interleaved_two_of_five(symbol, (unsigned char *)localstr, strlen(localstr)); - ustrcpy(symbol->text, (unsigned char*)localstr); - return error_number; + for (i = 12; i >= 0; i--) { + count += 4 * ctoi(localstr[i]); + + if (i & 1) { + count += 5 * ctoi(localstr[i]); + } + } + localstr[13] = check_digit(count); + localstr[14] = '\0'; + error_number = interleaved_two_of_five(symbol, (unsigned char *) localstr, strlen(localstr)); + ustrcpy(symbol->text, (unsigned char*) localstr); + return error_number; } -int dpident(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Deutsche Post Identcode */ - int i, error_number, zeroes; - unsigned int count; - char localstr[16]; +/* Deutsche Post Identcode */ +int dpident(struct zint_symbol *symbol, unsigned char source[], int length) { + int i, error_number, zeroes; + unsigned int count; + char localstr[16]; - count = 0; - if(length > 11) { - strcpy(symbol->errtxt, "Input wrong length"); - return ZINT_ERROR_TOO_LONG; - } - error_number = is_sane(NEON, source, length); - if(error_number == ZINT_ERROR_INVALID_DATA) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } + count = 0; + if (length > 11) { + strcpy(symbol->errtxt, "Input wrong length"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Invalid characters in data"); + return error_number; + } - zeroes = 11 - length; - for(i = 0; i < zeroes; i++) - localstr[i] = '0'; - strcpy(localstr + zeroes, (char *)source); - - for (i = 10; i >= 0; i--) - { - count += 4 * ctoi(localstr[i]); + zeroes = 11 - length; + for (i = 0; i < zeroes; i++) + localstr[i] = '0'; + strcpy(localstr + zeroes, (char *) source); - if (i & 1) { - count += 5 * ctoi(localstr[i]); - } - } - localstr[11] = check_digit(count); - localstr[12] = '\0'; - error_number = interleaved_two_of_five(symbol, (unsigned char *)localstr, strlen(localstr)); - ustrcpy(symbol->text, (unsigned char*)localstr); - return error_number; + for (i = 10; i >= 0; i--) { + count += 4 * ctoi(localstr[i]); + + if (i & 1) { + count += 5 * ctoi(localstr[i]); + } + } + localstr[11] = check_digit(count); + localstr[12] = '\0'; + error_number = interleaved_two_of_five(symbol, (unsigned char *) localstr, strlen(localstr)); + ustrcpy(symbol->text, (unsigned char*) localstr); + return error_number; } diff --git a/backend/auspost.c b/backend/auspost.c index ce697615..ffb382c7 100644 --- a/backend/auspost.c +++ b/backend/auspost.c @@ -2,20 +2,20 @@ /* libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart + Copyright (C) 2008-2016 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. + notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. 3. Neither the name of the project nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. + may be used to endorse or promote products derived from this software + without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -28,25 +28,31 @@ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + */ #define GDSET "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz #" -static const char *AusNTable[10] = {"00", "01", "02", "10", "11", "12", "20", "21", "22", "30"}; +static const char *AusNTable[10] = { + "00", "01", "02", "10", "11", "12", "20", "21", "22", "30" +}; -static const char *AusCTable[64] = {"222", "300", "301", "302", "310", "311", "312", "320", "321", "322", - "000", "001", "002", "010", "011", "012", "020", "021", "022", "100", "101", "102", "110", - "111", "112", "120", "121", "122", "200", "201", "202", "210", "211", "212", "220", "221", - "023", "030", "031", "032", "033", "103", "113", "123", "130", "131", "132", "133", "203", - "213", "223", "230", "231", "232", "233", "303", "313", "323", "330", "331", "332", "333", - "003", "013"}; +static const char *AusCTable[64] = { + "222", "300", "301", "302", "310", "311", "312", "320", "321", "322", + "000", "001", "002", "010", "011", "012", "020", "021", "022", "100", "101", "102", "110", + "111", "112", "120", "121", "122", "200", "201", "202", "210", "211", "212", "220", "221", + "023", "030", "031", "032", "033", "103", "113", "123", "130", "131", "132", "133", "203", + "213", "223", "230", "231", "232", "233", "303", "313", "323", "330", "331", "332", "333", + "003", "013" +}; -static const char *AusBarTable[64] = {"000", "001", "002", "003", "010", "011", "012", "013", "020", "021", - "022", "023", "030", "031", "032", "033", "100", "101", "102", "103", "110", "111", "112", - "113", "120", "121", "122", "123", "130", "131", "132", "133", "200", "201", "202", "203", - "210", "211", "212", "213", "220", "221", "222", "223", "230", "231", "232", "233", "300", - "301", "302", "303", "310", "311", "312", "313", "320", "321", "322", "323", "330", "331", - "332", "333"}; +static const char *AusBarTable[64] = { + "000", "001", "002", "003", "010", "011", "012", "013", "020", "021", + "022", "023", "030", "031", "032", "033", "100", "101", "102", "103", "110", "111", "112", + "113", "120", "121", "122", "123", "130", "131", "132", "133", "200", "201", "202", "203", + "210", "211", "212", "213", "220", "221", "222", "223", "230", "231", "232", "233", "300", + "301", "302", "303", "310", "311", "312", "313", "320", "321", "322", "323", "330", "331", + "332", "333" +}; #include #include @@ -57,204 +63,191 @@ static const char *AusBarTable[64] = {"000", "001", "002", "003", "010", "011", #define inline _inline #endif -static inline char convert_pattern(char data, int shift) -{ - return (data - '0') << shift; +static inline char convert_pattern(char data, int shift) { + return (data - '0') << shift; } -void rs_error(char data_pattern[]) -{ - /* Adds Reed-Solomon error correction to auspost */ +/* Adds Reed-Solomon error correction to auspost */ +void rs_error(char data_pattern[]) { + int reader, triple_writer = 0; + char triple[31], inv_triple[31]; + unsigned char result[5]; - int reader, triple_writer = 0; - char triple[31], inv_triple[31]; - unsigned char result[5]; + for (reader = 2; reader < strlen(data_pattern); reader += 3, triple_writer++) { + triple[triple_writer] = convert_pattern(data_pattern[reader], 4) + + convert_pattern(data_pattern[reader + 1], 2) + + convert_pattern(data_pattern[reader + 2], 0); + } - for(reader = 2; reader < strlen(data_pattern); reader += 3, triple_writer++) - { - triple[triple_writer] = convert_pattern(data_pattern[reader], 4) - + convert_pattern(data_pattern[reader + 1], 2) - + convert_pattern(data_pattern[reader + 2], 0); - } + for (reader = 0; reader < triple_writer; reader++) { + inv_triple[reader] = triple[(triple_writer - 1) - reader]; + } - for(reader = 0; reader < triple_writer; reader++) - { - inv_triple[reader] = triple[(triple_writer - 1) - reader]; - } + rs_init_gf(0x43); + rs_init_code(4, 1); + rs_encode(triple_writer, (unsigned char*) inv_triple, result); - rs_init_gf(0x43); - rs_init_code(4, 1); - rs_encode(triple_writer, (unsigned char*) inv_triple, result); - - for(reader = 4; reader > 0; reader--) - { - concat(data_pattern, AusBarTable[(int)result[reader - 1]]); - } - rs_free(); + for (reader = 4; reader > 0; reader--) { + concat(data_pattern, AusBarTable[(int) result[reader - 1]]); + } + rs_free(); } -int australia_post(struct zint_symbol *symbol, unsigned char source[], int length) -{ - /* Handles Australia Posts's 4 State Codes */ - /* Customer Standard Barcode, Barcode 2 or Barcode 3 system determined automatically - (i.e. the FCC doesn't need to be specified by the user) dependent - on the length of the input string */ +/* Handles Australia Posts's 4 State Codes */ +int australia_post(struct zint_symbol *symbol, unsigned char source[], int length) { + /* Customer Standard Barcode, Barcode 2 or Barcode 3 system determined automatically + (i.e. the FCC doesn't need to be specified by the user) dependent + on the length of the input string */ - /* The contents of data_pattern conform to the following standard: - 0 = Tracker, Ascender and Descender - 1 = Tracker and Ascender - 2 = Tracker and Descender - 3 = Tracker only */ - int error_number, zeroes; - int writer; - unsigned int loopey, reader, h; + /* The contents of data_pattern conform to the following standard: + 0 = Tracker, Ascender and Descender + 1 = Tracker and Ascender + 2 = Tracker and Descender + 3 = Tracker only */ + int error_number, zeroes; + int writer; + unsigned int loopey, reader, h; - char data_pattern[200]; - char fcc[3] = {0, 0}, dpid[10]; - char localstr[30]; + char data_pattern[200]; + char fcc[3] = {0, 0}, dpid[10]; + char localstr[30]; - error_number = 0; - strcpy(localstr, ""); + error_number = 0; + strcpy(localstr, ""); - /* Do all of the length checking first to avoid stack smashing */ - if(symbol->symbology == BARCODE_AUSPOST) { - /* Format control code (FCC) */ - switch(length) - { - case 8: - strcpy(fcc, "11"); - break; - case 13: - strcpy(fcc, "59"); - break; - case 16: - strcpy(fcc, "59"); - error_number = is_sane(NEON, source, length); - break; - case 18: - strcpy(fcc, "62"); - break; - case 23: - strcpy(fcc, "62"); - error_number = is_sane(NEON, source, length); - break; - default: - strcpy(symbol->errtxt, "Auspost input is wrong length"); - return ZINT_ERROR_TOO_LONG; - } - if(error_number == ZINT_ERROR_INVALID_DATA) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - } else { - if (length > 8) { - strcpy(symbol->errtxt, "Auspost input is too long"); - return ZINT_ERROR_TOO_LONG; - } - switch(symbol->symbology) { - case BARCODE_AUSREPLY: strcpy(fcc, "45"); break; - case BARCODE_AUSROUTE: strcpy(fcc, "87"); break; - case BARCODE_AUSREDIRECT: strcpy(fcc, "92"); break; - } + /* Do all of the length checking first to avoid stack smashing */ + if (symbol->symbology == BARCODE_AUSPOST) { + /* Format control code (FCC) */ + switch (length) { + case 8: + strcpy(fcc, "11"); + break; + case 13: + strcpy(fcc, "59"); + break; + case 16: + strcpy(fcc, "59"); + error_number = is_sane(NEON, source, length); + break; + case 18: + strcpy(fcc, "62"); + break; + case 23: + strcpy(fcc, "62"); + error_number = is_sane(NEON, source, length); + break; + default: + strcpy(symbol->errtxt, "Auspost input is wrong length"); + return ZINT_ERROR_TOO_LONG; + } + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Invalid characters in data"); + return error_number; + } + } else { + if (length > 8) { + strcpy(symbol->errtxt, "Auspost input is too long"); + return ZINT_ERROR_TOO_LONG; + } + switch (symbol->symbology) { + case BARCODE_AUSREPLY: strcpy(fcc, "45"); + break; + case BARCODE_AUSROUTE: strcpy(fcc, "87"); + break; + case BARCODE_AUSREDIRECT: strcpy(fcc, "92"); + break; + } - /* Add leading zeros as required */ - zeroes = 8 - length; - memset(localstr, '0', zeroes); - localstr[8] = '\0'; - } + /* Add leading zeros as required */ + zeroes = 8 - length; + memset(localstr, '0', zeroes); + localstr[8] = '\0'; + } - concat(localstr, (char*)source); - h = strlen(localstr); - error_number = is_sane(GDSET, (unsigned char *)localstr, h); - if(error_number == ZINT_ERROR_INVALID_DATA) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } + concat(localstr, (char*) source); + h = strlen(localstr); + error_number = is_sane(GDSET, (unsigned char *) localstr, h); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Invalid characters in data"); + return error_number; + } - /* Verifiy that the first 8 characters are numbers */ - memcpy(dpid, localstr, 8); - dpid[8] = '\0'; - error_number = is_sane(NEON, (unsigned char *)dpid, strlen(dpid)); - if(error_number == ZINT_ERROR_INVALID_DATA) { - strcpy(symbol->errtxt, "Invalid characters in DPID"); - return error_number; - } + /* Verifiy that the first 8 characters are numbers */ + memcpy(dpid, localstr, 8); + dpid[8] = '\0'; + error_number = is_sane(NEON, (unsigned char *) dpid, strlen(dpid)); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Invalid characters in DPID"); + return error_number; + } - /* Start character */ - strcpy(data_pattern, "13"); + /* Start character */ + strcpy(data_pattern, "13"); - /* Encode the FCC */ - for(reader = 0; reader < 2; reader++) - { - lookup(NEON, AusNTable, fcc[reader], data_pattern); - } + /* Encode the FCC */ + for (reader = 0; reader < 2; reader++) { + lookup(NEON, AusNTable, fcc[reader], data_pattern); + } - /* printf("AUSPOST FCC: %s ", fcc); */ + /* printf("AUSPOST FCC: %s ", fcc); */ - /* Delivery Point Identifier (DPID) */ - for(reader = 0; reader < 8; reader++) - { - lookup(NEON, AusNTable, dpid[reader], data_pattern); - } + /* Delivery Point Identifier (DPID) */ + for (reader = 0; reader < 8; reader++) { + lookup(NEON, AusNTable, dpid[reader], data_pattern); + } - /* Customer Information */ - if(h > 8) - { - if((h == 13) || (h == 18)) { - for(reader = 8; reader < h; reader++) { - lookup(GDSET, AusCTable, localstr[reader], data_pattern); - } - } - else if((h == 16) || (h == 23)) { - for(reader = 8; reader < h; reader++) { - lookup(NEON, AusNTable, localstr[reader], data_pattern); - } - } - } + /* Customer Information */ + if (h > 8) { + if ((h == 13) || (h == 18)) { + for (reader = 8; reader < h; reader++) { + lookup(GDSET, AusCTable, localstr[reader], data_pattern); + } + } else if ((h == 16) || (h == 23)) { + for (reader = 8; reader < h; reader++) { + lookup(NEON, AusNTable, localstr[reader], data_pattern); + } + } + } - /* Filler bar */ - h = strlen(data_pattern); - switch (h) - { - case 22: - case 37: - case 52: - concat(data_pattern, "3"); - break; - default: - break; - } + /* Filler bar */ + h = strlen(data_pattern); + switch (h) { + case 22: + case 37: + case 52: + concat(data_pattern, "3"); + break; + default: + break; + } - /* Reed Solomon error correction */ - rs_error(data_pattern); + /* Reed Solomon error correction */ + rs_error(data_pattern); - /* Stop character */ - concat(data_pattern, "13"); + /* Stop character */ + concat(data_pattern, "13"); - /* Turn the symbol into a bar pattern ready for plotting */ - writer = 0; - h = strlen(data_pattern); - for(loopey = 0; loopey < h; loopey++) - { - if((data_pattern[loopey] == '1') || (data_pattern[loopey] == '0')) - { - set_module(symbol, 0, writer); - } - set_module(symbol, 1, writer); - if((data_pattern[loopey] == '2') || (data_pattern[loopey] == '0')) - { - set_module(symbol, 2, writer); - } - writer += 2; - } + /* Turn the symbol into a bar pattern ready for plotting */ + writer = 0; + h = strlen(data_pattern); + for (loopey = 0; loopey < h; loopey++) { + if ((data_pattern[loopey] == '1') || (data_pattern[loopey] == '0')) { + set_module(symbol, 0, writer); + } + set_module(symbol, 1, writer); + if ((data_pattern[loopey] == '2') || (data_pattern[loopey] == '0')) { + set_module(symbol, 2, writer); + } + writer += 2; + } - symbol->row_height[0] = 3; - symbol->row_height[1] = 2; - symbol->row_height[2] = 3; + symbol->row_height[0] = 3; + symbol->row_height[1] = 2; + symbol->row_height[2] = 3; - symbol->rows = 3; - symbol->width = writer - 1; + symbol->rows = 3; + symbol->width = writer - 1; - return error_number; + return error_number; } diff --git a/backend/aztec.c b/backend/aztec.c index 5895f00b..891f9ee9 100644 --- a/backend/aztec.c +++ b/backend/aztec.c @@ -2,20 +2,20 @@ /* libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart + Copyright (C) 2009-2016 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. + notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. 3. Neither the name of the project nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. + may be used to endorse or promote products derived from this software + without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -28,7 +28,7 @@ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + */ #include #include @@ -43,629 +43,664 @@ /** * Shorten the string by one character */ -void mapshorten(int *charmap, int *typemap, int start, int length) -{ - memmove(charmap + start + 1 , charmap + start + 2, (length - 1) * sizeof(int)); - memmove(typemap + start + 1 , typemap + start + 2, (length - 1) * sizeof(int)); +void mapshorten(int *charmap, int *typemap, int start, int length) { + memmove(charmap + start + 1, charmap + start + 2, (length - 1) * sizeof (int)); + memmove(typemap + start + 1, typemap + start + 2, (length - 1) * sizeof (int)); } /** * Insert a character into the middle of a string at position posn */ -void insert(char binary_string[], int posn, char newbit) -{ - int i, end; - - end = strlen(binary_string); - for(i = end; i > posn; i--) { - binary_string[i] = binary_string[i - 1]; - } - binary_string[posn] = newbit; +void insert(char binary_string[], int posn, char newbit) { + int i, end; + + end = strlen(binary_string); + for (i = end; i > posn; i--) { + binary_string[i] = binary_string[i - 1]; + } + binary_string[posn] = newbit; } /** * Encode input data into a binary string */ -int aztec_text_process(unsigned char source[], const unsigned int src_len, char binary_string[], int gs1) -{ - int i, j, k, bytes; - int curtable, newtable, lasttable, chartype, maplength, blocks, debug; +int aztec_text_process(unsigned char source[], const unsigned int src_len, char binary_string[], int gs1) { + int i, j, k, bytes; + int curtable, newtable, lasttable, chartype, maplength, blocks, debug; #ifndef _MSC_VER - int charmap[src_len * 2], typemap[src_len * 2]; - int blockmap[2][src_len]; + int charmap[src_len * 2], typemap[src_len * 2]; + int blockmap[2][src_len]; #else - int* charmap = (int*)_alloca(src_len * 2 * sizeof(int)); - int* typemap = (int*)_alloca(src_len * 2 * sizeof(int)); - int* blockmap[2]; - blockmap[0] = (int*)_alloca(src_len * sizeof(int)); - blockmap[1] = (int*)_alloca(src_len * sizeof(int)); + int* charmap = (int*) _alloca(src_len * 2 * sizeof (int)); + int* typemap = (int*) _alloca(src_len * 2 * sizeof (int)); + int* blockmap[2]; + blockmap[0] = (int*) _alloca(src_len * sizeof (int)); + blockmap[1] = (int*) _alloca(src_len * sizeof (int)); #endif - /* Lookup input string in encoding table */ - maplength = 0; - debug = 0; - - for(i = 0; i < src_len; i++) { - if(gs1 && (i == 0)) { - /* Add FNC1 to beginning of GS1 messages */ - charmap[maplength] = 0; - typemap[maplength++] = PUNC; - charmap[maplength] = 400; - typemap[maplength++] = PUNC; - } - if((gs1) && (source[i] == '[')) { - /* FNC1 represented by FLG(0) */ - charmap[maplength] = 0; - typemap[maplength++] = PUNC; - charmap[maplength] = 400; - typemap[maplength++] = PUNC; - } else { - if((source[i] > 127) || (source[i] == 0)) { - charmap[maplength] = source[i]; - typemap[maplength++] = BINARY; - } else { - charmap[maplength] = AztecSymbolChar[source[i]]; - typemap[maplength++] = AztecCodeSet[source[i]]; - } - } - } + /* Lookup input string in encoding table */ + maplength = 0; + debug = 0; - /* Look for double character encoding possibilities */ - i = 0; - do{ - if(((charmap[i] == 300) && (charmap[i + 1] == 11)) && ((typemap[i] == PUNC) && (typemap[i + 1] == PUNC))) { - /* CR LF combination */ - charmap[i] = 2; - typemap[i] = PUNC; - mapshorten(charmap, typemap, i, maplength); - maplength--; - } + for (i = 0; i < src_len; i++) { + if (gs1 && (i == 0)) { + /* Add FNC1 to beginning of GS1 messages */ + charmap[maplength] = 0; + typemap[maplength++] = PUNC; + charmap[maplength] = 400; + typemap[maplength++] = PUNC; + } + if ((gs1) && (source[i] == '[')) { + /* FNC1 represented by FLG(0) */ + charmap[maplength] = 0; + typemap[maplength++] = PUNC; + charmap[maplength] = 400; + typemap[maplength++] = PUNC; + } else { + if ((source[i] > 127) || (source[i] == 0)) { + charmap[maplength] = source[i]; + typemap[maplength++] = BINARY; + } else { + charmap[maplength] = AztecSymbolChar[source[i]]; + typemap[maplength++] = AztecCodeSet[source[i]]; + } + } + } - if(((charmap[i] == 302) && (charmap[i + 1] == 1)) && ((typemap[i] == 24) && (typemap[i + 1] == 23))) { - /* . SP combination */ - charmap[i] = 3; - typemap[i] = PUNC; - mapshorten(charmap, typemap, i, maplength); - maplength--; - } + /* Look for double character encoding possibilities */ + i = 0; + do { + if (((charmap[i] == 300) && (charmap[i + 1] == 11)) + && ((typemap[i] == PUNC) && (typemap[i + 1] == PUNC))) { + /* CR LF combination */ + charmap[i] = 2; + typemap[i] = PUNC; + mapshorten(charmap, typemap, i, maplength); + maplength--; + } - if(((charmap[i] == 301) && (charmap[i + 1] == 1)) && ((typemap[i] == 24) && (typemap[i + 1] == 23))) { - /* , SP combination */ - charmap[i] = 4; - typemap[i] = PUNC; - mapshorten(charmap, typemap, i, maplength); - maplength--; - } + if (((charmap[i] == 302) && (charmap[i + 1] == 1)) + && ((typemap[i] == 24) && (typemap[i + 1] == 23))) { + /* . SP combination */ + charmap[i] = 3; + typemap[i] = PUNC; + mapshorten(charmap, typemap, i, maplength); + maplength--; + } - if(((charmap[i] == 21) && (charmap[i + 1] == 1)) && ((typemap[i] == PUNC) && (typemap[i + 1] == 23))) { - /* : SP combination */ - charmap[i] = 5; - typemap[i] = PUNC; - mapshorten(charmap, typemap, i, maplength); - maplength--; - } + if (((charmap[i] == 301) && (charmap[i + 1] == 1)) + && ((typemap[i] == 24) && (typemap[i + 1] == 23))) { + /* , SP combination */ + charmap[i] = 4; + typemap[i] = PUNC; + mapshorten(charmap, typemap, i, maplength); + maplength--; + } - i++; - }while(i < (maplength - 1)); + if (((charmap[i] == 21) && (charmap[i + 1] == 1)) + && ((typemap[i] == PUNC) && (typemap[i + 1] == 23))) { + /* : SP combination */ + charmap[i] = 5; + typemap[i] = PUNC; + mapshorten(charmap, typemap, i, maplength); + maplength--; + } - /* look for blocks of characters which use the same table */ - blocks = 1; - blockmap[0][0] = typemap[0]; - blockmap[1][0] = 1; - for(i = 1; i < maplength; i++) { - if(typemap[i] == typemap[i - 1]) { - blockmap[1][blocks - 1]++; - } else { - blocks++; - blockmap[0][blocks - 1] = typemap[i]; - blockmap[1][blocks - 1] = 1; - } - } - - if(blockmap[0][0] & 1) { blockmap[0][0] = 1; } - if(blockmap[0][0] & 2) { blockmap[0][0] = 2; } - if(blockmap[0][0] & 4) { blockmap[0][0] = 4; } - if(blockmap[0][0] & 8) { blockmap[0][0] = 8; } - - if(blocks > 1) { - /* look for adjacent blocks which can use the same table (left to right search) */ - for(i = 1; i < blocks; i++) { - if(blockmap[0][i] & blockmap[0][i - 1]) { - blockmap[0][i] = (blockmap[0][i] & blockmap[0][i - 1]); - } - } - - if(blockmap[0][blocks - 1] & 1) { blockmap[0][blocks - 1] = 1; } - if(blockmap[0][blocks - 1] & 2) { blockmap[0][blocks - 1] = 2; } - if(blockmap[0][blocks - 1] & 4) { blockmap[0][blocks - 1] = 4; } - if(blockmap[0][blocks - 1] & 8) { blockmap[0][blocks - 1] = 8; } - - /* look for adjacent blocks which can use the same table (right to left search) */ - for(i = blocks - 1; i > 0; i--) { - if(blockmap[0][i] & blockmap[0][i + 1]) { - blockmap[0][i] = (blockmap[0][i] & blockmap[0][i + 1]); - } - } - - /* determine the encoding table for characters which do not fit with adjacent blocks */ - for(i = 1; i < blocks; i++) { - if(blockmap[0][i] & 8) { blockmap[0][i] = 8; } - if(blockmap[0][i] & 4) { blockmap[0][i] = 4; } - if(blockmap[0][i] & 2) { blockmap[0][i] = 2; } - if(blockmap[0][i] & 1) { blockmap[0][i] = 1; } - } + i++; + } while (i < (maplength - 1)); - /* Combine blocks of the same type */ - i = 0; - do{ - if(blockmap[0][i] == blockmap[0][i + 1]) { - blockmap[1][i] += blockmap[1][i + 1]; - for(j = i + 1; j < blocks; j++) { - blockmap[0][j] = blockmap[0][j + 1]; - blockmap[1][j] = blockmap[1][j + 1]; - } - blocks--; - } else { - i++; - } - } while (i < blocks); - } + /* look for blocks of characters which use the same table */ + blocks = 1; + blockmap[0][0] = typemap[0]; + blockmap[1][0] = 1; + for (i = 1; i < maplength; i++) { + if (typemap[i] == typemap[i - 1]) { + blockmap[1][blocks - 1]++; + } else { + blocks++; + blockmap[0][blocks - 1] = typemap[i]; + blockmap[1][blocks - 1] = 1; + } + } - /* Put the adjusted block data back into typemap */ - j = 0; - for(i = 0; i < blocks; i++) { - if((blockmap[1][i] < 3) && (blockmap[0][i] != 32)) { /* Shift character(s) needed */ - for(k = 0; k < blockmap[1][i]; k++) { - typemap[j + k] = blockmap[0][i] + 64; - } - } else { /* Latch character (or byte mode) needed */ - for(k = 0; k < blockmap[1][i]; k++) { - typemap[j + k] = blockmap[0][i]; - } - } - j += blockmap[1][i]; - } + if (blockmap[0][0] & 1) { + blockmap[0][0] = 1; + } + if (blockmap[0][0] & 2) { + blockmap[0][0] = 2; + } + if (blockmap[0][0] & 4) { + blockmap[0][0] = 4; + } + if (blockmap[0][0] & 8) { + blockmap[0][0] = 8; + } - /* Don't shift an initial capital letter */ - if(typemap[0] == 65) { typemap[0] = 1; }; + if (blocks > 1) { + /* look for adjacent blocks which can use the same table (left to right search) */ + for (i = 1; i < blocks; i++) { + if (blockmap[0][i] & blockmap[0][i - 1]) { + blockmap[0][i] = (blockmap[0][i] & blockmap[0][i - 1]); + } + } - /* Problem characters (those that appear in different tables with different values) can now be resolved into their tables */ - for(i = 0; i < maplength; i++) { - if((charmap[i] >= 300) && (charmap[i] < 400)) { - curtable = typemap[i]; - if(curtable > 64) { - curtable -= 64; - } - switch(charmap[i]) { - case 300: /* Carriage Return */ - switch(curtable) { - case PUNC: charmap[i] = 1; break; - case MIXED: charmap[i] = 14; break; - } - break; - case 301: /* Comma */ - switch(curtable) { - case PUNC: charmap[i] = 17; break; - case DIGIT: charmap[i] = 12; break; - } - break; - case 302: /* Full Stop */ - switch(curtable) { - case PUNC: charmap[i] = 19; break; - case DIGIT: charmap[i] = 13; break; - } - break; - } - } - } - *binary_string = '\0'; + if (blockmap[0][blocks - 1] & 1) { + blockmap[0][blocks - 1] = 1; + } + if (blockmap[0][blocks - 1] & 2) { + blockmap[0][blocks - 1] = 2; + } + if (blockmap[0][blocks - 1] & 4) { + blockmap[0][blocks - 1] = 4; + } + if (blockmap[0][blocks - 1] & 8) { + blockmap[0][blocks - 1] = 8; + } - curtable = UPPER; /* start with UPPER table */ - lasttable = UPPER; - for(i = 0; i < maplength; i++) { - newtable = curtable; - if((typemap[i] != curtable) && (charmap[i] < 400)) { - /* Change table */ - if(curtable == BINARY) { - /* If ending binary mode the current table is the same as when entering binary mode */ - curtable = lasttable; - newtable = lasttable; - } - if(typemap[i] > 64) { - /* Shift character */ - switch(typemap[i]) { - case (64 + UPPER): /* To UPPER */ - switch(curtable) { - case LOWER: /* US */ - concat(binary_string, hexbit[28]); - if(debug) printf("US "); - break; - case MIXED: /* UL */ - concat(binary_string, hexbit[29]); - if(debug) printf("UL "); - newtable = UPPER; - break; - case PUNC: /* UL */ - concat(binary_string, hexbit[31]); - if(debug) printf("UL "); - newtable = UPPER; - break; - case DIGIT: /* US */ - concat(binary_string, pentbit[15]); - if(debug) printf("US "); - break; - } - break; - case (64 + LOWER): /* To LOWER */ - switch(curtable) { - case UPPER: /* LL */ - concat(binary_string, hexbit[28]); - if(debug) printf("LL "); - newtable = LOWER; - break; - case MIXED: /* LL */ - concat(binary_string, hexbit[28]); - if(debug) printf("LL "); - newtable = LOWER; - break; - case PUNC: /* UL LL */ - concat(binary_string, hexbit[31]); - if(debug) printf("UL "); - concat(binary_string, hexbit[28]); - if(debug) printf("LL "); - newtable = LOWER; - break; - case DIGIT: /* UL LL */ - concat(binary_string, pentbit[14]); - if(debug) printf("UL "); - concat(binary_string, hexbit[28]); - if(debug) printf("LL "); - newtable = LOWER; - break; - } - break; - case (64 + MIXED): /* To MIXED */ - switch(curtable) { - case UPPER: /* ML */ - concat(binary_string, hexbit[29]); - if(debug) printf("ML "); - newtable = MIXED; - break; - case LOWER: /* ML */ - concat(binary_string, hexbit[29]); - if(debug) printf("ML "); - newtable = MIXED; - break; - case PUNC: /* UL ML */ - concat(binary_string, hexbit[31]); - if(debug) printf("UL "); - concat(binary_string, hexbit[29]); - if(debug) printf("ML "); - newtable = MIXED; - break; - case DIGIT: /* UL ML */ - concat(binary_string, pentbit[14]); - if(debug) printf("UL "); - concat(binary_string, hexbit[29]); - if(debug) printf("ML "); - newtable = MIXED; - break; - } - break; - case (64 + PUNC): /* To PUNC */ - switch(curtable) { - case UPPER: /* PS */ - concat(binary_string, hexbit[0]); - if(debug) printf("PS "); - break; - case LOWER: /* PS */ - concat(binary_string, hexbit[0]); - if(debug) printf("PS "); - break; - case MIXED: /* PS */ - concat(binary_string, hexbit[0]); - if(debug) printf("PS "); - break; - case DIGIT: /* PS */ - concat(binary_string, pentbit[0]); - if(debug) printf("PS "); - break; - } - break; - case (64 + DIGIT): /* To DIGIT */ - switch(curtable) { - case UPPER: /* DL */ - concat(binary_string, hexbit[30]); - if(debug) printf("DL "); - newtable = DIGIT; - break; - case LOWER: /* DL */ - concat(binary_string, hexbit[30]); - if(debug) printf("DL "); - newtable = DIGIT; - break; - case MIXED: /* UL DL */ - concat(binary_string, hexbit[29]); - if(debug) printf("UL "); - concat(binary_string, hexbit[30]); - if(debug) printf("DL "); - newtable = DIGIT; - break; - case PUNC: /* UL DL */ - concat(binary_string, hexbit[31]); - if(debug) printf("UL "); - concat(binary_string, hexbit[30]); - if(debug) printf("DL "); - newtable = DIGIT; - break; - } - break; - } - } else { - /* Latch character */ - switch(typemap[i]) { - case UPPER: /* To UPPER */ - switch(curtable) { - case LOWER: /* ML UL */ - concat(binary_string, hexbit[29]); - if(debug) printf("ML "); - concat(binary_string, hexbit[29]); - if(debug) printf("UL "); - newtable = UPPER; - break; - case MIXED: /* UL */ - concat(binary_string, hexbit[29]); - if(debug) printf("UL "); - newtable = UPPER; - break; - case PUNC: /* UL */ - concat(binary_string, hexbit[31]); - if(debug) printf("UL "); - newtable = UPPER; - break; - case DIGIT: /* UL */ - concat(binary_string, pentbit[14]); - if(debug) printf("UL "); - newtable = UPPER; - break; - } - break; - case LOWER: /* To LOWER */ - switch(curtable) { - case UPPER: /* LL */ - concat(binary_string, hexbit[28]); - if(debug) printf("LL "); - newtable = LOWER; - break; - case MIXED: /* LL */ - concat(binary_string, hexbit[28]); - if(debug) printf("LL "); - newtable = LOWER; - break; - case PUNC: /* UL LL */ - concat(binary_string, hexbit[31]); - if(debug) printf("UL "); - concat(binary_string, hexbit[28]); - if(debug) printf("LL "); - newtable = LOWER; - break; - case DIGIT: /* UL LL */ - concat(binary_string, pentbit[14]); - if(debug) printf("UL "); - concat(binary_string, hexbit[28]); - if(debug) printf("LL "); - newtable = LOWER; - break; - } - break; - case MIXED: /* To MIXED */ - switch(curtable) { - case UPPER: /* ML */ - concat(binary_string, hexbit[29]); - if(debug) printf("ML "); - newtable = MIXED; - break; - case LOWER: /* ML */ - concat(binary_string, hexbit[29]); - if(debug) printf("ML "); - newtable = MIXED; - break; - case PUNC: /* UL ML */ - concat(binary_string, hexbit[31]); - if(debug) printf("UL "); - concat(binary_string, hexbit[29]); - if(debug) printf("ML "); - newtable = MIXED; - break; - case DIGIT: /* UL ML */ - concat(binary_string, pentbit[14]); - if(debug) printf("UL "); - concat(binary_string, hexbit[29]); - if(debug) printf("ML "); - newtable = MIXED; - break; - } - break; - case PUNC: /* To PUNC */ - switch(curtable) { - case UPPER: /* ML PL */ - concat(binary_string, hexbit[29]); - if(debug) printf("ML "); - concat(binary_string, hexbit[30]); - if(debug) printf("PL "); - newtable = PUNC; - break; - case LOWER: /* ML PL */ - concat(binary_string, hexbit[29]); - if(debug) printf("ML "); - concat(binary_string, hexbit[30]); - if(debug) printf("PL "); - newtable = PUNC; - break; - case MIXED: /* PL */ - concat(binary_string, hexbit[30]); - if(debug) printf("PL "); - newtable = PUNC; - break; - case DIGIT: /* UL ML PL */ - concat(binary_string, pentbit[14]); - if(debug) printf("UL "); - concat(binary_string, hexbit[29]); - if(debug) printf("ML "); - concat(binary_string, hexbit[30]); - if(debug) printf("PL "); - newtable = PUNC; - break; - } - break; - case DIGIT: /* To DIGIT */ - switch(curtable) { - case UPPER: /* DL */ - concat(binary_string, hexbit[30]); - if(debug) printf("DL "); - newtable = DIGIT; - break; - case LOWER: /* DL */ - concat(binary_string, hexbit[30]); - if(debug) printf("DL "); - newtable = DIGIT; - break; - case MIXED: /* UL DL */ - concat(binary_string, hexbit[29]); - if(debug) printf("UL "); - concat(binary_string, hexbit[30]); - if(debug) printf("DL "); - newtable = DIGIT; - break; - case PUNC: /* UL DL */ - concat(binary_string, hexbit[31]); - if(debug) printf("UL "); - concat(binary_string, hexbit[30]); - if(debug) printf("DL "); - newtable = DIGIT; - break; - } - break; - case BINARY: /* To BINARY */ - lasttable = curtable; - switch(curtable) { - case UPPER: /* BS */ - concat(binary_string, hexbit[31]); - if(debug) printf("BS "); - newtable = BINARY; - break; - case LOWER: /* BS */ - concat(binary_string, hexbit[31]); - if(debug) printf("BS "); - newtable = BINARY; - break; - case MIXED: /* BS */ - concat(binary_string, hexbit[31]); - if(debug) printf("BS "); - newtable = BINARY; - break; - case PUNC: /* UL BS */ - concat(binary_string, hexbit[31]); - if(debug) printf("UL "); - concat(binary_string, hexbit[31]); - if(debug) printf("BS "); - lasttable = UPPER; - newtable = BINARY; - break; - case DIGIT: /* UL BS */ - concat(binary_string, pentbit[14]); - if(debug) printf("UL "); - concat(binary_string, hexbit[31]); - if(debug) printf("BS "); - lasttable = UPPER; - newtable = BINARY; - break; - } + /* look for adjacent blocks which can use the same table (right to left search) */ + for (i = blocks - 1; i > 0; i--) { + if (blockmap[0][i] & blockmap[0][i + 1]) { + blockmap[0][i] = (blockmap[0][i] & blockmap[0][i + 1]); + } + } - bytes = 0; - do{ - bytes++; - }while(typemap[i + (bytes - 1)] == BINARY); - bytes--; + /* determine the encoding table for characters which do not fit with adjacent blocks */ + for (i = 1; i < blocks; i++) { + if (blockmap[0][i] & 8) { + blockmap[0][i] = 8; + } + if (blockmap[0][i] & 4) { + blockmap[0][i] = 4; + } + if (blockmap[0][i] & 2) { + blockmap[0][i] = 2; + } + if (blockmap[0][i] & 1) { + blockmap[0][i] = 1; + } + } - if(bytes > 2079) { - return ZINT_ERROR_TOO_LONG; - } + /* Combine blocks of the same type */ + i = 0; + do { + if (blockmap[0][i] == blockmap[0][i + 1]) { + blockmap[1][i] += blockmap[1][i + 1]; + for (j = i + 1; j < blocks; j++) { + blockmap[0][j] = blockmap[0][j + 1]; + blockmap[1][j] = blockmap[1][j + 1]; + } + blocks--; + } else { + i++; + } + } while (i < blocks); + } - if(bytes > 31) { /* Put 00000 followed by 11-bit number of bytes less 31 */ - int adjusted; + /* Put the adjusted block data back into typemap */ + j = 0; + for (i = 0; i < blocks; i++) { + if ((blockmap[1][i] < 3) && (blockmap[0][i] != 32)) { + /* Shift character(s) needed */ + for (k = 0; k < blockmap[1][i]; k++) { + typemap[j + k] = blockmap[0][i] + 64; + } + } else { /* Latch character (or byte mode) needed */ + for (k = 0; k < blockmap[1][i]; k++) { + typemap[j + k] = blockmap[0][i]; + } + } + j += blockmap[1][i]; + } - adjusted = bytes - 31; - concat(binary_string, "00000"); - if(adjusted & 0x400) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(adjusted & 0x200) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(adjusted & 0x100) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(adjusted & 0x80) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(adjusted & 0x40) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(adjusted & 0x20) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(adjusted & 0x10) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(adjusted & 0x08) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(adjusted & 0x04) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(adjusted & 0x02) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(adjusted & 0x01) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - } else { /* Put 5-bit number of bytes */ - if(bytes & 0x10) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(bytes & 0x08) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(bytes & 0x04) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(bytes & 0x02) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(bytes & 0x01) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - } - if(debug) printf("(%d bytes) ", bytes); + /* Don't shift an initial capital letter */ + if (typemap[0] == 65) { + typemap[0] = 1; + }; - break; - } - } - } - /* Add data to the binary string */ - curtable = newtable; - chartype = typemap[i]; - if(chartype > 64) { chartype -= 64; } - switch(chartype) { - case UPPER: - case LOWER: - case MIXED: - case PUNC: - if(charmap[i] >= 400) { - concat(binary_string, tribit[charmap[i] - 400]); - if(debug) printf("FLG(%d) ",charmap[i] - 400); - } else { - concat(binary_string, hexbit[charmap[i]]); - if(!((chartype == PUNC) && (charmap[i] == 0))) - if(debug) printf("%d ",charmap[i]); - } - break; - case DIGIT: - concat(binary_string, pentbit[charmap[i]]); - if(debug) printf("%d ",charmap[i]); - break; - case BINARY: - if(charmap[i] & 0x80) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(charmap[i] & 0x40) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(charmap[i] & 0x20) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(charmap[i] & 0x10) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(charmap[i] & 0x08) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(charmap[i] & 0x04) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(charmap[i] & 0x02) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(charmap[i] & 0x01) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(debug) printf("%d ",charmap[i]); - break; - } + /* Problem characters (those that appear in different tables with + * different values) can now be resolved into their tables */ + for (i = 0; i < maplength; i++) { + if ((charmap[i] >= 300) && (charmap[i] < 400)) { + curtable = typemap[i]; + if (curtable > 64) { + curtable -= 64; + } + switch (charmap[i]) { + case 300: /* Carriage Return */ + switch (curtable) { + case PUNC: charmap[i] = 1; + break; + case MIXED: charmap[i] = 14; + break; + } + break; + case 301: /* Comma */ + switch (curtable) { + case PUNC: charmap[i] = 17; + break; + case DIGIT: charmap[i] = 12; + break; + } + break; + case 302: /* Full Stop */ + switch (curtable) { + case PUNC: charmap[i] = 19; + break; + case DIGIT: charmap[i] = 13; + break; + } + break; + } + } + } + *binary_string = '\0'; - } + curtable = UPPER; /* start with UPPER table */ + lasttable = UPPER; + for (i = 0; i < maplength; i++) { + newtable = curtable; + if ((typemap[i] != curtable) && (charmap[i] < 400)) { + /* Change table */ + if (curtable == BINARY) { + /* If ending binary mode the current table is the same as when entering binary mode */ + curtable = lasttable; + newtable = lasttable; + } + if (typemap[i] > 64) { + /* Shift character */ + switch (typemap[i]) { + case (64 + UPPER): /* To UPPER */ + switch (curtable) { + case LOWER: /* US */ + concat(binary_string, hexbit[28]); + if (debug) printf("US "); + break; + case MIXED: /* UL */ + concat(binary_string, hexbit[29]); + if (debug) printf("UL "); + newtable = UPPER; + break; + case PUNC: /* UL */ + concat(binary_string, hexbit[31]); + if (debug) printf("UL "); + newtable = UPPER; + break; + case DIGIT: /* US */ + concat(binary_string, pentbit[15]); + if (debug) printf("US "); + break; + } + break; + case (64 + LOWER): /* To LOWER */ + switch (curtable) { + case UPPER: /* LL */ + concat(binary_string, hexbit[28]); + if (debug) printf("LL "); + newtable = LOWER; + break; + case MIXED: /* LL */ + concat(binary_string, hexbit[28]); + if (debug) printf("LL "); + newtable = LOWER; + break; + case PUNC: /* UL LL */ + concat(binary_string, hexbit[31]); + if (debug) printf("UL "); + concat(binary_string, hexbit[28]); + if (debug) printf("LL "); + newtable = LOWER; + break; + case DIGIT: /* UL LL */ + concat(binary_string, pentbit[14]); + if (debug) printf("UL "); + concat(binary_string, hexbit[28]); + if (debug) printf("LL "); + newtable = LOWER; + break; + } + break; + case (64 + MIXED): /* To MIXED */ + switch (curtable) { + case UPPER: /* ML */ + concat(binary_string, hexbit[29]); + if (debug) printf("ML "); + newtable = MIXED; + break; + case LOWER: /* ML */ + concat(binary_string, hexbit[29]); + if (debug) printf("ML "); + newtable = MIXED; + break; + case PUNC: /* UL ML */ + concat(binary_string, hexbit[31]); + if (debug) printf("UL "); + concat(binary_string, hexbit[29]); + if (debug) printf("ML "); + newtable = MIXED; + break; + case DIGIT: /* UL ML */ + concat(binary_string, pentbit[14]); + if (debug) printf("UL "); + concat(binary_string, hexbit[29]); + if (debug) printf("ML "); + newtable = MIXED; + break; + } + break; + case (64 + PUNC): /* To PUNC */ + switch (curtable) { + case UPPER: /* PS */ + concat(binary_string, hexbit[0]); + if (debug) printf("PS "); + break; + case LOWER: /* PS */ + concat(binary_string, hexbit[0]); + if (debug) printf("PS "); + break; + case MIXED: /* PS */ + concat(binary_string, hexbit[0]); + if (debug) printf("PS "); + break; + case DIGIT: /* PS */ + concat(binary_string, pentbit[0]); + if (debug) printf("PS "); + break; + } + break; + case (64 + DIGIT): /* To DIGIT */ + switch (curtable) { + case UPPER: /* DL */ + concat(binary_string, hexbit[30]); + if (debug) printf("DL "); + newtable = DIGIT; + break; + case LOWER: /* DL */ + concat(binary_string, hexbit[30]); + if (debug) printf("DL "); + newtable = DIGIT; + break; + case MIXED: /* UL DL */ + concat(binary_string, hexbit[29]); + if (debug) printf("UL "); + concat(binary_string, hexbit[30]); + if (debug) printf("DL "); + newtable = DIGIT; + break; + case PUNC: /* UL DL */ + concat(binary_string, hexbit[31]); + if (debug) printf("UL "); + concat(binary_string, hexbit[30]); + if (debug) printf("DL "); + newtable = DIGIT; + break; + } + break; + } + } else { + /* Latch character */ + switch (typemap[i]) { + case UPPER: /* To UPPER */ + switch (curtable) { + case LOWER: /* ML UL */ + concat(binary_string, hexbit[29]); + if (debug) printf("ML "); + concat(binary_string, hexbit[29]); + if (debug) printf("UL "); + newtable = UPPER; + break; + case MIXED: /* UL */ + concat(binary_string, hexbit[29]); + if (debug) printf("UL "); + newtable = UPPER; + break; + case PUNC: /* UL */ + concat(binary_string, hexbit[31]); + if (debug) printf("UL "); + newtable = UPPER; + break; + case DIGIT: /* UL */ + concat(binary_string, pentbit[14]); + if (debug) printf("UL "); + newtable = UPPER; + break; + } + break; + case LOWER: /* To LOWER */ + switch (curtable) { + case UPPER: /* LL */ + concat(binary_string, hexbit[28]); + if (debug) printf("LL "); + newtable = LOWER; + break; + case MIXED: /* LL */ + concat(binary_string, hexbit[28]); + if (debug) printf("LL "); + newtable = LOWER; + break; + case PUNC: /* UL LL */ + concat(binary_string, hexbit[31]); + if (debug) printf("UL "); + concat(binary_string, hexbit[28]); + if (debug) printf("LL "); + newtable = LOWER; + break; + case DIGIT: /* UL LL */ + concat(binary_string, pentbit[14]); + if (debug) printf("UL "); + concat(binary_string, hexbit[28]); + if (debug) printf("LL "); + newtable = LOWER; + break; + } + break; + case MIXED: /* To MIXED */ + switch (curtable) { + case UPPER: /* ML */ + concat(binary_string, hexbit[29]); + if (debug) printf("ML "); + newtable = MIXED; + break; + case LOWER: /* ML */ + concat(binary_string, hexbit[29]); + if (debug) printf("ML "); + newtable = MIXED; + break; + case PUNC: /* UL ML */ + concat(binary_string, hexbit[31]); + if (debug) printf("UL "); + concat(binary_string, hexbit[29]); + if (debug) printf("ML "); + newtable = MIXED; + break; + case DIGIT: /* UL ML */ + concat(binary_string, pentbit[14]); + if (debug) printf("UL "); + concat(binary_string, hexbit[29]); + if (debug) printf("ML "); + newtable = MIXED; + break; + } + break; + case PUNC: /* To PUNC */ + switch (curtable) { + case UPPER: /* ML PL */ + concat(binary_string, hexbit[29]); + if (debug) printf("ML "); + concat(binary_string, hexbit[30]); + if (debug) printf("PL "); + newtable = PUNC; + break; + case LOWER: /* ML PL */ + concat(binary_string, hexbit[29]); + if (debug) printf("ML "); + concat(binary_string, hexbit[30]); + if (debug) printf("PL "); + newtable = PUNC; + break; + case MIXED: /* PL */ + concat(binary_string, hexbit[30]); + if (debug) printf("PL "); + newtable = PUNC; + break; + case DIGIT: /* UL ML PL */ + concat(binary_string, pentbit[14]); + if (debug) printf("UL "); + concat(binary_string, hexbit[29]); + if (debug) printf("ML "); + concat(binary_string, hexbit[30]); + if (debug) printf("PL "); + newtable = PUNC; + break; + } + break; + case DIGIT: /* To DIGIT */ + switch (curtable) { + case UPPER: /* DL */ + concat(binary_string, hexbit[30]); + if (debug) printf("DL "); + newtable = DIGIT; + break; + case LOWER: /* DL */ + concat(binary_string, hexbit[30]); + if (debug) printf("DL "); + newtable = DIGIT; + break; + case MIXED: /* UL DL */ + concat(binary_string, hexbit[29]); + if (debug) printf("UL "); + concat(binary_string, hexbit[30]); + if (debug) printf("DL "); + newtable = DIGIT; + break; + case PUNC: /* UL DL */ + concat(binary_string, hexbit[31]); + if (debug) printf("UL "); + concat(binary_string, hexbit[30]); + if (debug) printf("DL "); + newtable = DIGIT; + break; + } + break; + case BINARY: /* To BINARY */ + lasttable = curtable; + switch (curtable) { + case UPPER: /* BS */ + concat(binary_string, hexbit[31]); + if (debug) printf("BS "); + newtable = BINARY; + break; + case LOWER: /* BS */ + concat(binary_string, hexbit[31]); + if (debug) printf("BS "); + newtable = BINARY; + break; + case MIXED: /* BS */ + concat(binary_string, hexbit[31]); + if (debug) printf("BS "); + newtable = BINARY; + break; + case PUNC: /* UL BS */ + concat(binary_string, hexbit[31]); + if (debug) printf("UL "); + concat(binary_string, hexbit[31]); + if (debug) printf("BS "); + lasttable = UPPER; + newtable = BINARY; + break; + case DIGIT: /* UL BS */ + concat(binary_string, pentbit[14]); + if (debug) printf("UL "); + concat(binary_string, hexbit[31]); + if (debug) printf("BS "); + lasttable = UPPER; + newtable = BINARY; + break; + } - if(debug) printf("\n"); + bytes = 0; + do { + bytes++; + } while (typemap[i + (bytes - 1)] == BINARY); + bytes--; - if(strlen(binary_string) > 14970) { - return ZINT_ERROR_TOO_LONG; - } + if (bytes > 2079) { + return ZINT_ERROR_TOO_LONG; + } - return 0; + if (bytes > 31) { + /* Put 00000 followed by 11-bit number of bytes less 31 */ + concat(binary_string, "00000"); + + for (int p = 0; p < 11; p++) { + if ((bytes - 31) & (0x400 >> p)) { + concat(binary_string, "1"); + } else { + concat(binary_string, "0"); + } + } + } else { + /* Put 5-bit number of bytes */ + for (int p = 0; p < 5; p++) { + if (bytes & (0x10 >> p)) { + concat(binary_string, "1"); + } else { + concat(binary_string, "0"); + } + } + } + if (debug) printf("(%d bytes) ", bytes); + + break; + } + } + } + /* Add data to the binary string */ + curtable = newtable; + chartype = typemap[i]; + if (chartype > 64) { + chartype -= 64; + } + switch (chartype) { + case UPPER: + case LOWER: + case MIXED: + case PUNC: + if (charmap[i] >= 400) { + concat(binary_string, tribit[charmap[i] - 400]); + if (debug) printf("FLG(%d) ", charmap[i] - 400); + } else { + concat(binary_string, hexbit[charmap[i]]); + if (!((chartype == PUNC) && (charmap[i] == 0))) + if (debug) printf("%d ", charmap[i]); + } + break; + case DIGIT: + concat(binary_string, pentbit[charmap[i]]); + if (debug) printf("%d ", charmap[i]); + break; + case BINARY: + for (int p = 0; p < 8; p++) { + if (charmap[i] & (0x80 >> p)) { + concat(binary_string, "1"); + } else { + concat(binary_string, "0"); + } + } + if (debug) printf("%d ", charmap[i]); + break; + } + + } + + if (debug) printf("\n"); + + if (strlen(binary_string) > 14970) { + return ZINT_ERROR_TOO_LONG; + } + + return 0; } +/* Prevent data from obscuring reference grid */ int avoidReferenceGrid(int input) { int output; @@ -701,9 +736,8 @@ int avoidReferenceGrid(int input) { return output; } -void popilate_map() -{ - /* Calculate the position of the bits in the grid */ +/* Calculate the position of the bits in the grid */ +void popilate_map() { int layer, start, length, n, i; int x, y; @@ -795,20 +829,20 @@ void popilate_map() } /* Descriptor */ - for (i = 0; i < 10; i++) { /* Top */ - + for (i = 0; i < 10; i++) { + /* Top */ AztecMap[(avoidReferenceGrid(66 + i) * 151) + avoidReferenceGrid(64)] = 20000 + i; } - for (i = 0; i < 10; i++) { /* Right */ - + for (i = 0; i < 10; i++) { + /* Right */ AztecMap[(avoidReferenceGrid(77) * 151) + avoidReferenceGrid(66 + i)] = 20010 + i; } - for (i = 0; i < 10; i++) { /* Bottom */ - + for (i = 0; i < 10; i++) { + /* Bottom */ AztecMap[(avoidReferenceGrid(75 - i) * 151) + avoidReferenceGrid(77)] = 20020 + i; } - for (i = 0; i < 10; i++) { /* Left */ - + for (i = 0; i < 10; i++) { + /* Left */ AztecMap[(avoidReferenceGrid(64) * 151) + avoidReferenceGrid(75 - i)] = 20030 + i; } @@ -821,699 +855,883 @@ void popilate_map() AztecMap[(avoidReferenceGrid(77) * 151) + avoidReferenceGrid(76)] = 1; } -int aztec(struct zint_symbol *symbol, unsigned char source[], int length) -{ - int x, y, i, j, data_blocks, ecc_blocks, layers, total_bits; - char binary_string[20000], bit_pattern[20045], descriptor[42]; - char adjusted_string[20000]; - unsigned char desc_data[4], desc_ecc[6]; - int err_code, ecc_level, compact, data_length, data_maxsize, codeword_size, adjusted_length; - int remainder, padbits, count, gs1, adjustment_size; - int debug = 0, reader = 0; - int comp_loop = 4; +int aztec(struct zint_symbol *symbol, unsigned char source[], int length) { + int x, y, i, j, data_blocks, ecc_blocks, layers, total_bits; + char binary_string[20000], bit_pattern[20045], descriptor[42]; + char adjusted_string[20000]; + unsigned char desc_data[4], desc_ecc[6]; + int err_code, ecc_level, compact, data_length, data_maxsize, codeword_size, adjusted_length; + int remainder, padbits, count, gs1, adjustment_size; + int debug = 0, reader = 0; + int comp_loop = 4; #ifndef _MSC_VER - unsigned char local_source[length + 1]; + unsigned char local_source[length + 1]; #else - unsigned char* local_source = (unsigned char*)_alloca(length + 1); - unsigned int* data_part; - unsigned int* ecc_part; + unsigned char* local_source = (unsigned char*) _alloca(length + 1); + unsigned int* data_part; + unsigned int* ecc_part; #endif - memset(binary_string,0,20000); - memset(adjusted_string,0,20000); + memset(binary_string, 0, 20000); + memset(adjusted_string, 0, 20000); - if(symbol->input_mode == GS1_MODE) { gs1 = 1; } else { gs1 = 0; } - if(symbol->output_options & READER_INIT) { reader = 1; comp_loop = 1; } - if((gs1 == 1) && (reader == 1)) { - strcpy(symbol->errtxt, "Cannot encode in GS1 and Reader Initialisation mode at the same time"); - return ZINT_ERROR_INVALID_OPTION; - } + if (symbol->input_mode == GS1_MODE) { + gs1 = 1; + } else { + gs1 = 0; + } + if (symbol->output_options & READER_INIT) { + reader = 1; + comp_loop = 1; + } + if ((gs1 == 1) && (reader == 1)) { + strcpy(symbol->errtxt, "Cannot encode in GS1 and Reader Initialisation mode at the same time"); + return ZINT_ERROR_INVALID_OPTION; + } - switch(symbol->input_mode) { - case DATA_MODE: - case GS1_MODE: - memcpy(local_source, source, length); - local_source[length] = '\0'; - break; - case UNICODE_MODE: - err_code = latin1_process(symbol, source, local_source, &length); - if(err_code != 0) { return err_code; } - break; - } - - err_code = aztec_text_process(local_source, length, binary_string, gs1); + switch (symbol->input_mode) { + case DATA_MODE: + case GS1_MODE: + memcpy(local_source, source, length); + local_source[length] = '\0'; + break; + case UNICODE_MODE: + err_code = latin1_process(symbol, source, local_source, &length); + if (err_code != 0) { + return err_code; + } + break; + } + + err_code = aztec_text_process(local_source, length, binary_string, gs1); - if(err_code != 0) { - strcpy(symbol->errtxt, "Input too long or too many extended ASCII characters"); - return err_code; - } + if (err_code != 0) { + strcpy(symbol->errtxt, "Input too long or too many extended ASCII characters"); + return err_code; + } - if(!((symbol->option_1 >= -1) && (symbol->option_1 <= 4))) { - strcpy(symbol->errtxt, "Invalid error correction level - using default instead"); - err_code = ZINT_WARN_INVALID_OPTION; - symbol->option_1 = -1; - } + if (!((symbol->option_1 >= -1) && (symbol->option_1 <= 4))) { + strcpy(symbol->errtxt, "Invalid error correction level - using default instead"); + err_code = ZINT_WARN_INVALID_OPTION; + symbol->option_1 = -1; + } - ecc_level = symbol->option_1; + ecc_level = symbol->option_1; - if((ecc_level == -1) || (ecc_level == 0)) { - ecc_level = 2; - } + if ((ecc_level == -1) || (ecc_level == 0)) { + ecc_level = 2; + } - data_length = strlen(binary_string); + data_length = strlen(binary_string); - layers = 0; /* Keep compiler happy! */ - data_maxsize = 0; /* Keep compiler happy! */ - adjustment_size = 0; - if(symbol->option_2 == 0) { /* The size of the symbol can be determined by Zint */ - do { - /* Decide what size symbol to use - the smallest that fits the data */ - compact = 0; /* 1 = Aztec Compact, 0 = Normal Aztec */ - layers = 0; + layers = 0; /* Keep compiler happy! */ + data_maxsize = 0; /* Keep compiler happy! */ + adjustment_size = 0; + if (symbol->option_2 == 0) { /* The size of the symbol can be determined by Zint */ + do { + /* Decide what size symbol to use - the smallest that fits the data */ + compact = 0; /* 1 = Aztec Compact, 0 = Normal Aztec */ + layers = 0; - switch(ecc_level) { - /* For each level of error correction work out the smallest symbol which - the data will fit in */ - case 1: for(i = 32; i > 0; i--) { - if((data_length + adjustment_size) < Aztec10DataSizes[i - 1]) { - layers = i; - compact = 0; - data_maxsize = Aztec10DataSizes[i - 1]; - } - } - for(i = comp_loop; i > 0; i--) { - if((data_length + adjustment_size) < AztecCompact10DataSizes[i - 1]) { - layers = i; - compact = 1; - data_maxsize = AztecCompact10DataSizes[i - 1]; - } - } - break; - case 2: for(i = 32; i > 0; i--) { - if((data_length + adjustment_size) < Aztec23DataSizes[i - 1]) { - layers = i; - compact = 0; - data_maxsize = Aztec23DataSizes[i - 1]; - } - } - for(i = comp_loop; i > 0; i--) { - if((data_length + adjustment_size) < AztecCompact23DataSizes[i - 1]) { - layers = i; - compact = 1; - data_maxsize = AztecCompact23DataSizes[i - 1]; - } - } - break; - case 3: for(i = 32; i > 0; i--) { - if((data_length + adjustment_size) < Aztec36DataSizes[i - 1]) { - layers = i; - compact = 0; - data_maxsize = Aztec36DataSizes[i - 1]; - } - } - for(i = comp_loop; i > 0; i--) { - if((data_length + adjustment_size) < AztecCompact36DataSizes[i - 1]) { - layers = i; - compact = 1; - data_maxsize = AztecCompact36DataSizes[i - 1]; - } - } - break; - case 4: for(i = 32; i > 0; i--) { - if((data_length + adjustment_size) < Aztec50DataSizes[i - 1]) { - layers = i; - compact = 0; - data_maxsize = Aztec50DataSizes[i - 1]; - } - } - for(i = comp_loop; i > 0; i--) { - if((data_length + adjustment_size) < AztecCompact50DataSizes[i - 1]) { - layers = i; - compact = 1; - data_maxsize = AztecCompact50DataSizes[i - 1]; - } - } - break; - } + switch (ecc_level) { + /* For each level of error correction work out the smallest symbol which + the data will fit in */ + case 1: for (i = 32; i > 0; i--) { + if ((data_length + adjustment_size) < Aztec10DataSizes[i - 1]) { + layers = i; + compact = 0; + data_maxsize = Aztec10DataSizes[i - 1]; + } + } + for (i = comp_loop; i > 0; i--) { + if ((data_length + adjustment_size) < AztecCompact10DataSizes[i - 1]) { + layers = i; + compact = 1; + data_maxsize = AztecCompact10DataSizes[i - 1]; + } + } + break; + case 2: for (i = 32; i > 0; i--) { + if ((data_length + adjustment_size) < Aztec23DataSizes[i - 1]) { + layers = i; + compact = 0; + data_maxsize = Aztec23DataSizes[i - 1]; + } + } + for (i = comp_loop; i > 0; i--) { + if ((data_length + adjustment_size) < AztecCompact23DataSizes[i - 1]) { + layers = i; + compact = 1; + data_maxsize = AztecCompact23DataSizes[i - 1]; + } + } + break; + case 3: for (i = 32; i > 0; i--) { + if ((data_length + adjustment_size) < Aztec36DataSizes[i - 1]) { + layers = i; + compact = 0; + data_maxsize = Aztec36DataSizes[i - 1]; + } + } + for (i = comp_loop; i > 0; i--) { + if ((data_length + adjustment_size) < AztecCompact36DataSizes[i - 1]) { + layers = i; + compact = 1; + data_maxsize = AztecCompact36DataSizes[i - 1]; + } + } + break; + case 4: for (i = 32; i > 0; i--) { + if ((data_length + adjustment_size) < Aztec50DataSizes[i - 1]) { + layers = i; + compact = 0; + data_maxsize = Aztec50DataSizes[i - 1]; + } + } + for (i = comp_loop; i > 0; i--) { + if ((data_length + adjustment_size) < AztecCompact50DataSizes[i - 1]) { + layers = i; + compact = 1; + data_maxsize = AztecCompact50DataSizes[i - 1]; + } + } + break; + } - if(layers == 0) { /* Couldn't find a symbol which fits the data */ - strcpy(symbol->errtxt, "Input too long (too many bits for selected ECC)"); - return ZINT_ERROR_TOO_LONG; - } + if (layers == 0) { + /* Couldn't find a symbol which fits the data */ + strcpy(symbol->errtxt, "Input too long (too many bits for selected ECC)"); + return ZINT_ERROR_TOO_LONG; + } - /* Determine codeword bitlength - Table 3 */ - codeword_size = 6; /* if (layers <= 2) */ - if((layers >= 3) && (layers <= 8)) { codeword_size = 8; } - if((layers >= 9) && (layers <= 22)) { codeword_size = 10; } - if(layers >= 23) { codeword_size = 12; } + /* Determine codeword bitlength - Table 3 */ + codeword_size = 6; /* if (layers <= 2) */ + if ((layers >= 3) && (layers <= 8)) { + codeword_size = 8; + } + if ((layers >= 9) && (layers <= 22)) { + codeword_size = 10; + } + if (layers >= 23) { + codeword_size = 12; + } - j = 0; i = 0; - do { - if((j + 1) % codeword_size == 0) { - /* Last bit of codeword */ - int t, done = 0; - count = 0; + j = 0; + i = 0; + do { + if ((j + 1) % codeword_size == 0) { + /* Last bit of codeword */ + int t, done = 0; + count = 0; - /* Discover how many '1's in current codeword */ - for(t = 0; t < (codeword_size - 1); t++) { - if(binary_string[(i - (codeword_size - 1)) + t] == '1') count++; - } + /* Discover how many '1's in current codeword */ + for (t = 0; t < (codeword_size - 1); t++) { + if (binary_string[(i - (codeword_size - 1)) + t] == '1') count++; + } - if(count == (codeword_size - 1)) { - adjusted_string[j] = '0'; - j++; - done = 1; - } + if (count == (codeword_size - 1)) { + adjusted_string[j] = '0'; + j++; + done = 1; + } - if(count == 0) { - adjusted_string[j] = '1'; - j++; - done = 1; - } + if (count == 0) { + adjusted_string[j] = '1'; + j++; + done = 1; + } - if(done == 0) { - adjusted_string[j] = binary_string[i]; - j++; - i++; - } - } - adjusted_string[j] = binary_string[i]; - j++; - i++; - } while (i <= (data_length + 1)); - adjusted_string[j] = '\0'; - adjusted_length = strlen(adjusted_string); - adjustment_size = adjusted_length - data_length; + if (done == 0) { + adjusted_string[j] = binary_string[i]; + j++; + i++; + } + } + adjusted_string[j] = binary_string[i]; + j++; + i++; + } while (i <= (data_length + 1)); + adjusted_string[j] = '\0'; + adjusted_length = strlen(adjusted_string); + adjustment_size = adjusted_length - data_length; - /* Add padding */ - remainder = adjusted_length % codeword_size; + /* Add padding */ + remainder = adjusted_length % codeword_size; - padbits = codeword_size - remainder; - if(padbits == codeword_size) { padbits = 0; } - - for(i = 0; i < padbits; i++) { - concat(adjusted_string, "1"); - } - adjusted_length = strlen(adjusted_string); + padbits = codeword_size - remainder; + if (padbits == codeword_size) { + padbits = 0; + } - count = 0; - for(i = (adjusted_length - codeword_size); i < adjusted_length; i++) { - if(adjusted_string[i] == '1') { count++; } - } - if(count == codeword_size) { adjusted_string[adjusted_length - 1] = '0'; } - - if(debug) { - printf("Codewords:\n"); - for(i = 0; i < (adjusted_length / codeword_size); i++) { - for(j = 0; j < codeword_size; j++) { - printf("%c", adjusted_string[(i * codeword_size) + j]); - } - printf("\n"); - } - } + for (i = 0; i < padbits; i++) { + concat(adjusted_string, "1"); + } + adjusted_length = strlen(adjusted_string); - } while(adjusted_length > data_maxsize); - /* This loop will only repeat on the rare occasions when the rule about not having all 1s or all 0s - means that the binary string has had to be lengthened beyond the maximum number of bits that can - be encoded in a symbol of the selected size */ + count = 0; + for (i = (adjusted_length - codeword_size); i < adjusted_length; i++) { + if (adjusted_string[i] == '1') { + count++; + } + } + if (count == codeword_size) { + adjusted_string[adjusted_length - 1] = '0'; + } - } else { /* The size of the symbol has been specified by the user */ - if((reader == 1) && ((symbol->option_2 >= 2) && (symbol->option_2 <= 4))) { - symbol->option_2 = 5; - } - if((symbol->option_2 >= 1) && (symbol->option_2 <= 4)) { - compact = 1; - layers = symbol->option_2; - } - if((symbol->option_2 >= 5) && (symbol->option_2 <= 36)) { - compact = 0; - layers = symbol->option_2 - 4; - } - if((symbol->option_2 < 0) || (symbol->option_2 > 36)) { - strcpy(symbol->errtxt, "Invalid Aztec Code size"); - return ZINT_ERROR_INVALID_OPTION; - } + if (debug) { + printf("Codewords:\n"); + for (i = 0; i < (adjusted_length / codeword_size); i++) { + for (j = 0; j < codeword_size; j++) { + printf("%c", adjusted_string[(i * codeword_size) + j]); + } + printf("\n"); + } + } - /* Determine codeword bitlength - Table 3 */ - if((layers >= 0) && (layers <= 2)) { codeword_size = 6; } - if((layers >= 3) && (layers <= 8)) { codeword_size = 8; } - if((layers >= 9) && (layers <= 22)) { codeword_size = 10; } - if(layers >= 23) { codeword_size = 12; } + } while (adjusted_length > data_maxsize); + /* This loop will only repeat on the rare occasions when the rule about not having all 1s or all 0s + means that the binary string has had to be lengthened beyond the maximum number of bits that can + be encoded in a symbol of the selected size */ - j = 0; i = 0; - do { - if((j + 1) % codeword_size == 0) { - /* Last bit of codeword */ - int t, done = 0; - count = 0; + } else { /* The size of the symbol has been specified by the user */ + if ((reader == 1) && ((symbol->option_2 >= 2) && (symbol->option_2 <= 4))) { + symbol->option_2 = 5; + } + if ((symbol->option_2 >= 1) && (symbol->option_2 <= 4)) { + compact = 1; + layers = symbol->option_2; + } + if ((symbol->option_2 >= 5) && (symbol->option_2 <= 36)) { + compact = 0; + layers = symbol->option_2 - 4; + } + if ((symbol->option_2 < 0) || (symbol->option_2 > 36)) { + strcpy(symbol->errtxt, "Invalid Aztec Code size"); + return ZINT_ERROR_INVALID_OPTION; + } - /* Discover how many '1's in current codeword */ - for(t = 0; t < (codeword_size - 1); t++) { - if(binary_string[(i - (codeword_size - 1)) + t] == '1') count++; - } + /* Determine codeword bitlength - Table 3 */ + if ((layers >= 0) && (layers <= 2)) { + codeword_size = 6; + } + if ((layers >= 3) && (layers <= 8)) { + codeword_size = 8; + } + if ((layers >= 9) && (layers <= 22)) { + codeword_size = 10; + } + if (layers >= 23) { + codeword_size = 12; + } - if(count == (codeword_size - 1)) { - adjusted_string[j] = '0'; - j++; - done = 1; - } + j = 0; + i = 0; + do { + if ((j + 1) % codeword_size == 0) { + /* Last bit of codeword */ + int t, done = 0; + count = 0; - if(count == 0) { - adjusted_string[j] = '1'; - j++; - done = 1; - } + /* Discover how many '1's in current codeword */ + for (t = 0; t < (codeword_size - 1); t++) { + if (binary_string[(i - (codeword_size - 1)) + t] == '1') count++; + } - if(done == 0) { - adjusted_string[j] = binary_string[i]; - j++; - i++; - } - } - adjusted_string[j] = binary_string[i]; - j++; - i++; - } while (i <= (data_length + 1)); - adjusted_string[j] = '\0'; - adjusted_length = strlen(adjusted_string); + if (count == (codeword_size - 1)) { + adjusted_string[j] = '0'; + j++; + done = 1; + } - remainder = adjusted_length % codeword_size; + if (count == 0) { + adjusted_string[j] = '1'; + j++; + done = 1; + } - padbits = codeword_size - remainder; - if(padbits == codeword_size) { padbits = 0; } - - for(i = 0; i < padbits; i++) { - concat(adjusted_string, "1"); - } - adjusted_length = strlen(adjusted_string); + if (done == 0) { + adjusted_string[j] = binary_string[i]; + j++; + i++; + } + } + adjusted_string[j] = binary_string[i]; + j++; + i++; + } while (i <= (data_length + 1)); + adjusted_string[j] = '\0'; + adjusted_length = strlen(adjusted_string); - count = 0; - for(i = (adjusted_length - codeword_size); i < adjusted_length; i++) { - if(adjusted_string[i] == '1') { count++; } - } - if(count == codeword_size) { adjusted_string[adjusted_length - 1] = '0'; } - - /* Check if the data actually fits into the selected symbol size */ - if (compact) { - data_maxsize = codeword_size * (AztecCompactSizes[layers - 1] - 3); - } else { - data_maxsize = codeword_size * (AztecSizes[layers - 1] - 3); - } + remainder = adjusted_length % codeword_size; - if(adjusted_length > data_maxsize) { - strcpy(symbol->errtxt, "Data too long for specified Aztec Code symbol size"); - return ZINT_ERROR_TOO_LONG; - } + padbits = codeword_size - remainder; + if (padbits == codeword_size) { + padbits = 0; + } - if(debug) { - printf("Codewords:\n"); - for(i = 0; i < (adjusted_length / codeword_size); i++) { - for(j = 0; j < codeword_size; j++) { - printf("%c", adjusted_string[(i * codeword_size) + j]); - } - printf("\n"); - } - } + for (i = 0; i < padbits; i++) { + concat(adjusted_string, "1"); + } + adjusted_length = strlen(adjusted_string); - } + count = 0; + for (i = (adjusted_length - codeword_size); i < adjusted_length; i++) { + if (adjusted_string[i] == '1') { + count++; + } + } + if (count == codeword_size) { + adjusted_string[adjusted_length - 1] = '0'; + } - if(reader && (layers > 22)) { - strcpy(symbol->errtxt, "Data too long for reader initialisation symbol"); - return ZINT_ERROR_TOO_LONG; - } + /* Check if the data actually fits into the selected symbol size */ + if (compact) { + data_maxsize = codeword_size * (AztecCompactSizes[layers - 1] - 3); + } else { + data_maxsize = codeword_size * (AztecSizes[layers - 1] - 3); + } - data_blocks = adjusted_length / codeword_size; + if (adjusted_length > data_maxsize) { + strcpy(symbol->errtxt, "Data too long for specified Aztec Code symbol size"); + return ZINT_ERROR_TOO_LONG; + } - if(compact) { - ecc_blocks = AztecCompactSizes[layers - 1] - data_blocks; - } else { - ecc_blocks = AztecSizes[layers - 1] - data_blocks; - } + if (debug) { + printf("Codewords:\n"); + for (i = 0; i < (adjusted_length / codeword_size); i++) { + for (j = 0; j < codeword_size; j++) { + printf("%c", adjusted_string[(i * codeword_size) + j]); + } + printf("\n"); + } + } + + } + + if (reader && (layers > 22)) { + strcpy(symbol->errtxt, "Data too long for reader initialisation symbol"); + return ZINT_ERROR_TOO_LONG; + } + + data_blocks = adjusted_length / codeword_size; + + if (compact) { + ecc_blocks = AztecCompactSizes[layers - 1] - data_blocks; + } else { + ecc_blocks = AztecSizes[layers - 1] - data_blocks; + } + + if (debug) { + printf("Generating a "); + if (compact) { + printf("compact"); + } else { + printf("full-size"); + } + printf(" symbol with %d layers\n", layers); + printf("Requires "); + if (compact) { + printf("%d", AztecCompactSizes[layers - 1]); + } else { + printf("%d", AztecSizes[layers - 1]); + } + printf(" codewords of %d-bits\n", codeword_size); + printf(" (%d data words, %d ecc words)\n", data_blocks, ecc_blocks); + } - if(debug) { - printf("Generating a "); - if(compact) { printf("compact"); } else { printf("full-size"); } - printf(" symbol with %d layers\n", layers); - printf("Requires "); - if(compact) { printf("%d", AztecCompactSizes[layers - 1]); } else { printf("%d", AztecSizes[layers - 1]); } - printf(" codewords of %d-bits\n", codeword_size); - printf(" (%d data words, %d ecc words)\n", data_blocks, ecc_blocks); - } - #ifndef _MSC_VER - unsigned int data_part[data_blocks + 3], ecc_part[ecc_blocks + 3]; + unsigned int data_part[data_blocks + 3], ecc_part[ecc_blocks + 3]; #else - data_part = (unsigned int*)_alloca((data_blocks + 3) * sizeof(unsigned int)); - ecc_part = (unsigned int*)_alloca((ecc_blocks + 3) * sizeof(unsigned int)); + data_part = (unsigned int*) _alloca((data_blocks + 3) * sizeof (unsigned int)); + ecc_part = (unsigned int*) _alloca((ecc_blocks + 3) * sizeof (unsigned int)); #endif - /* Copy across data into separate integers */ - memset(data_part,0,(data_blocks + 2)*sizeof(int)); - memset(ecc_part,0,(ecc_blocks + 2)*sizeof(int)); + /* Copy across data into separate integers */ + memset(data_part, 0, (data_blocks + 2) * sizeof (int)); + memset(ecc_part, 0, (ecc_blocks + 2) * sizeof (int)); - /* Split into codewords and calculate reed-colomon error correction codes */ - switch(codeword_size) { - case 6: - for(i = 0; i < data_blocks; i++) { - if(adjusted_string[i * codeword_size] == '1') { data_part[i] += 32; } - if(adjusted_string[(i * codeword_size) + 1] == '1') { data_part[i] += 16; } - if(adjusted_string[(i * codeword_size) + 2] == '1') { data_part[i] += 8; } - if(adjusted_string[(i * codeword_size) + 3] == '1') { data_part[i] += 4; } - if(adjusted_string[(i * codeword_size) + 4] == '1') { data_part[i] += 2; } - if(adjusted_string[(i * codeword_size) + 5] == '1') { data_part[i] += 1; } - } - rs_init_gf(0x43); - rs_init_code(ecc_blocks, 1); - rs_encode_long(data_blocks, data_part, ecc_part); - for(i = (ecc_blocks - 1); i >= 0; i--) { - if(ecc_part[i] & 0x20) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x10) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x08) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x04) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x02) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x01) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - } - rs_free(); - break; - case 8: - for(i = 0; i < data_blocks; i++) { - if(adjusted_string[i * codeword_size] == '1') { data_part[i] += 128; } - if(adjusted_string[(i * codeword_size) + 1] == '1') { data_part[i] += 64; } - if(adjusted_string[(i * codeword_size) + 2] == '1') { data_part[i] += 32; } - if(adjusted_string[(i * codeword_size) + 3] == '1') { data_part[i] += 16; } - if(adjusted_string[(i * codeword_size) + 4] == '1') { data_part[i] += 8; } - if(adjusted_string[(i * codeword_size) + 5] == '1') { data_part[i] += 4; } - if(adjusted_string[(i * codeword_size) + 6] == '1') { data_part[i] += 2; } - if(adjusted_string[(i * codeword_size) + 7] == '1') { data_part[i] += 1; } - } - rs_init_gf(0x12d); - rs_init_code(ecc_blocks, 1); - rs_encode_long(data_blocks, data_part, ecc_part); - for(i = (ecc_blocks - 1); i >= 0; i--) { - if(ecc_part[i] & 0x80) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x40) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x20) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x10) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x08) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x04) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x02) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x01) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - } - rs_free(); - break; - case 10: - for(i = 0; i < data_blocks; i++) { - if(adjusted_string[i * codeword_size] == '1') { data_part[i] += 512; } - if(adjusted_string[(i * codeword_size) + 1] == '1') { data_part[i] += 256; } - if(adjusted_string[(i * codeword_size) + 2] == '1') { data_part[i] += 128; } - if(adjusted_string[(i * codeword_size) + 3] == '1') { data_part[i] += 64; } - if(adjusted_string[(i * codeword_size) + 4] == '1') { data_part[i] += 32; } - if(adjusted_string[(i * codeword_size) + 5] == '1') { data_part[i] += 16; } - if(adjusted_string[(i * codeword_size) + 6] == '1') { data_part[i] += 8; } - if(adjusted_string[(i * codeword_size) + 7] == '1') { data_part[i] += 4; } - if(adjusted_string[(i * codeword_size) + 8] == '1') { data_part[i] += 2; } - if(adjusted_string[(i * codeword_size) + 9] == '1') { data_part[i] += 1; } - } - rs_init_gf(0x409); - rs_init_code(ecc_blocks, 1); - rs_encode_long(data_blocks, data_part, ecc_part); - for(i = (ecc_blocks - 1); i >= 0; i--) { - if(ecc_part[i] & 0x200) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x100) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x80) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x40) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x20) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x10) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x08) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x04) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x02) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x01) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - } - rs_free(); - break; - case 12: - for(i = 0; i < data_blocks; i++) { - if(adjusted_string[i * codeword_size] == '1') { data_part[i] += 2048; } - if(adjusted_string[(i * codeword_size) + 1] == '1') { data_part[i] += 1024; } - if(adjusted_string[(i * codeword_size) + 2] == '1') { data_part[i] += 512; } - if(adjusted_string[(i * codeword_size) + 3] == '1') { data_part[i] += 256; } - if(adjusted_string[(i * codeword_size) + 4] == '1') { data_part[i] += 128; } - if(adjusted_string[(i * codeword_size) + 5] == '1') { data_part[i] += 64; } - if(adjusted_string[(i * codeword_size) + 6] == '1') { data_part[i] += 32; } - if(adjusted_string[(i * codeword_size) + 7] == '1') { data_part[i] += 16; } - if(adjusted_string[(i * codeword_size) + 8] == '1') { data_part[i] += 8; } - if(adjusted_string[(i * codeword_size) + 9] == '1') { data_part[i] += 4; } - if(adjusted_string[(i * codeword_size) + 10] == '1') { data_part[i] += 2; } - if(adjusted_string[(i * codeword_size) + 11] == '1') { data_part[i] += 1; } - } - rs_init_gf(0x1069); - rs_init_code(ecc_blocks, 1); - rs_encode_long(data_blocks, data_part, ecc_part); - for(i = (ecc_blocks - 1); i >= 0; i--) { - if(ecc_part[i] & 0x800) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x400) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x200) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x100) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x80) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x40) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x20) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x10) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x08) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x04) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x02) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x01) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - } - rs_free(); - break; - } + /* Split into codewords and calculate reed-colomon error correction codes */ + switch (codeword_size) { + case 6: + for (i = 0; i < data_blocks; i++) { + for (int p = 0; p < 6; p++) { + if (adjusted_string[i * codeword_size + p] == '1') { + data_part[i] += (0x20 >> p); + } + } + } + rs_init_gf(0x43); + rs_init_code(ecc_blocks, 1); + rs_encode_long(data_blocks, data_part, ecc_part); + for (i = (ecc_blocks - 1); i >= 0; i--) { + for (int p = 0; p < 6; p++) { + if (ecc_part[i] & (0x20 >> p)) { + concat(adjusted_string, "1"); + } else { + concat(adjusted_string, "0"); + } + } + } + rs_free(); + break; + case 8: + for (i = 0; i < data_blocks; i++) { + for (int p = 0; p < 8; p++) { + if (adjusted_string[i * codeword_size + p] == '1') { + data_part[i] += (0x80 >> p); + } + } + } + rs_init_gf(0x12d); + rs_init_code(ecc_blocks, 1); + rs_encode_long(data_blocks, data_part, ecc_part); + for (i = (ecc_blocks - 1); i >= 0; i--) { + for (int p = 0; p < 8; p++) { + if (ecc_part[i] & (0x80 >> p)) { + concat(adjusted_string, "1"); + } else { + concat(adjusted_string, "0"); + } + } + } + rs_free(); + break; + case 10: + for (i = 0; i < data_blocks; i++) { + for(int p = 0; p < 10; p++) { + if (adjusted_string[i * codeword_size + p] == '1') { + data_part[i] += (0x200 >> p); + } + } + } + rs_init_gf(0x409); + rs_init_code(ecc_blocks, 1); + rs_encode_long(data_blocks, data_part, ecc_part); + for (i = (ecc_blocks - 1); i >= 0; i--) { + for (int p = 0; p < 10; p++) { + if (ecc_part[i] & (0x200 >> p)) { + concat(adjusted_string, "1"); + } else { + concat(adjusted_string, "0"); + } + } + } + rs_free(); + break; + case 12: + for (i = 0; i < data_blocks; i++) { + for (int p = 0; p < 12; p++) { + if (adjusted_string[i * codeword_size + p] == '1') { + data_part[i] += (0x800 >> p); + } + } + } + rs_init_gf(0x1069); + rs_init_code(ecc_blocks, 1); + rs_encode_long(data_blocks, data_part, ecc_part); + for (i = (ecc_blocks - 1); i >= 0; i--) { + for (int p = 0; p < 12; p++) { + if (ecc_part[i] & (0x800 >> p)) { + concat(adjusted_string, "1"); + } else { + concat(adjusted_string, "0"); + } + } + } + rs_free(); + break; + } - /* Invert the data so that actual data is on the outside and reed-solomon on the inside */ - memset(bit_pattern,'0',20045); + /* Invert the data so that actual data is on the outside and reed-solomon on the inside */ + memset(bit_pattern, '0', 20045); - total_bits = (data_blocks + ecc_blocks) * codeword_size; - for(i = 0; i < total_bits; i++) { - bit_pattern[i] = adjusted_string[total_bits - i - 1]; - } + total_bits = (data_blocks + ecc_blocks) * codeword_size; + for (i = 0; i < total_bits; i++) { + bit_pattern[i] = adjusted_string[total_bits - i - 1]; + } - /* Now add the symbol descriptor */ - memset(desc_data,0,4); - memset(desc_ecc,0,6); - memset(descriptor,0,42); + /* Now add the symbol descriptor */ + memset(desc_data, 0, 4); + memset(desc_ecc, 0, 6); + memset(descriptor, 0, 42); - if(compact) { - /* The first 2 bits represent the number of layers minus 1 */ - if((layers - 1) & 0x02) { descriptor[0] = '1'; } else { descriptor[0] = '0'; } - if((layers - 1) & 0x01) { descriptor[1] = '1'; } else { descriptor[1] = '0'; } - /* The next 6 bits represent the number of data blocks minus 1 */ - if(reader) { - descriptor[2] = '1'; - } else { - if((data_blocks - 1) & 0x20) { descriptor[2] = '1'; } else { descriptor[2] = '0'; } - } - if((data_blocks - 1) & 0x10) { descriptor[3] = '1'; } else { descriptor[3] = '0'; } - if((data_blocks - 1) & 0x08) { descriptor[4] = '1'; } else { descriptor[4] = '0'; } - if((data_blocks - 1) & 0x04) { descriptor[5] = '1'; } else { descriptor[5] = '0'; } - if((data_blocks - 1) & 0x02) { descriptor[6] = '1'; } else { descriptor[6] = '0'; } - if((data_blocks - 1) & 0x01) { descriptor[7] = '1'; } else { descriptor[7] = '0'; } - descriptor[8] = '\0'; - if(debug) printf("Mode Message = %s\n", descriptor); - } else { - /* The first 5 bits represent the number of layers minus 1 */ - if((layers - 1) & 0x10) { descriptor[0] = '1'; } else { descriptor[0] = '0'; } - if((layers - 1) & 0x08) { descriptor[1] = '1'; } else { descriptor[1] = '0'; } - if((layers - 1) & 0x04) { descriptor[2] = '1'; } else { descriptor[2] = '0'; } - if((layers - 1) & 0x02) { descriptor[3] = '1'; } else { descriptor[3] = '0'; } - if((layers - 1) & 0x01) { descriptor[4] = '1'; } else { descriptor[4] = '0'; } - /* The next 11 bits represent the number of data blocks minus 1 */ - if(reader) { - descriptor[5] = '1'; - } else { - if((data_blocks - 1) & 0x400) { descriptor[5] = '1'; } else { descriptor[5] = '0'; } - } - if((data_blocks - 1) & 0x200) { descriptor[6] = '1'; } else { descriptor[6] = '0'; } - if((data_blocks - 1) & 0x100) { descriptor[7] = '1'; } else { descriptor[7] = '0'; } - if((data_blocks - 1) & 0x80) { descriptor[8] = '1'; } else { descriptor[8] = '0'; } - if((data_blocks - 1) & 0x40) { descriptor[9] = '1'; } else { descriptor[9] = '0'; } - if((data_blocks - 1) & 0x20) { descriptor[10] = '1'; } else { descriptor[10] = '0'; } - if((data_blocks - 1) & 0x10) { descriptor[11] = '1'; } else { descriptor[11] = '0'; } - if((data_blocks - 1) & 0x08) { descriptor[12] = '1'; } else { descriptor[12] = '0'; } - if((data_blocks - 1) & 0x04) { descriptor[13] = '1'; } else { descriptor[13] = '0'; } - if((data_blocks - 1) & 0x02) { descriptor[14] = '1'; } else { descriptor[14] = '0'; } - if((data_blocks - 1) & 0x01) { descriptor[15] = '1'; } else { descriptor[15] = '0'; } - descriptor[16] = '\0'; - if(debug) printf("Mode Message = %s\n", descriptor); - } + if (compact) { + /* The first 2 bits represent the number of layers minus 1 */ + if ((layers - 1) & 0x02) { + descriptor[0] = '1'; + } else { + descriptor[0] = '0'; + } + if ((layers - 1) & 0x01) { + descriptor[1] = '1'; + } else { + descriptor[1] = '0'; + } + /* The next 6 bits represent the number of data blocks minus 1 */ + if (reader) { + descriptor[2] = '1'; + } else { + if ((data_blocks - 1) & 0x20) { + descriptor[2] = '1'; + } else { + descriptor[2] = '0'; + } + } + if ((data_blocks - 1) & 0x10) { + descriptor[3] = '1'; + } else { + descriptor[3] = '0'; + } + if ((data_blocks - 1) & 0x08) { + descriptor[4] = '1'; + } else { + descriptor[4] = '0'; + } + if ((data_blocks - 1) & 0x04) { + descriptor[5] = '1'; + } else { + descriptor[5] = '0'; + } + if ((data_blocks - 1) & 0x02) { + descriptor[6] = '1'; + } else { + descriptor[6] = '0'; + } + if ((data_blocks - 1) & 0x01) { + descriptor[7] = '1'; + } else { + descriptor[7] = '0'; + } + descriptor[8] = '\0'; + if (debug) printf("Mode Message = %s\n", descriptor); + } else { + /* The first 5 bits represent the number of layers minus 1 */ + if ((layers - 1) & 0x10) { + descriptor[0] = '1'; + } else { + descriptor[0] = '0'; + } + if ((layers - 1) & 0x08) { + descriptor[1] = '1'; + } else { + descriptor[1] = '0'; + } + if ((layers - 1) & 0x04) { + descriptor[2] = '1'; + } else { + descriptor[2] = '0'; + } + if ((layers - 1) & 0x02) { + descriptor[3] = '1'; + } else { + descriptor[3] = '0'; + } + if ((layers - 1) & 0x01) { + descriptor[4] = '1'; + } else { + descriptor[4] = '0'; + } + /* The next 11 bits represent the number of data blocks minus 1 */ + if (reader) { + descriptor[5] = '1'; + } else { + if ((data_blocks - 1) & 0x400) { + descriptor[5] = '1'; + } else { + descriptor[5] = '0'; + } + } + if ((data_blocks - 1) & 0x200) { + descriptor[6] = '1'; + } else { + descriptor[6] = '0'; + } + if ((data_blocks - 1) & 0x100) { + descriptor[7] = '1'; + } else { + descriptor[7] = '0'; + } + if ((data_blocks - 1) & 0x80) { + descriptor[8] = '1'; + } else { + descriptor[8] = '0'; + } + if ((data_blocks - 1) & 0x40) { + descriptor[9] = '1'; + } else { + descriptor[9] = '0'; + } + if ((data_blocks - 1) & 0x20) { + descriptor[10] = '1'; + } else { + descriptor[10] = '0'; + } + if ((data_blocks - 1) & 0x10) { + descriptor[11] = '1'; + } else { + descriptor[11] = '0'; + } + if ((data_blocks - 1) & 0x08) { + descriptor[12] = '1'; + } else { + descriptor[12] = '0'; + } + if ((data_blocks - 1) & 0x04) { + descriptor[13] = '1'; + } else { + descriptor[13] = '0'; + } + if ((data_blocks - 1) & 0x02) { + descriptor[14] = '1'; + } else { + descriptor[14] = '0'; + } + if ((data_blocks - 1) & 0x01) { + descriptor[15] = '1'; + } else { + descriptor[15] = '0'; + } + descriptor[16] = '\0'; + if (debug) printf("Mode Message = %s\n", descriptor); + } - /* Split into 4-bit codewords */ - for(i = 0; i < 4; i++) { - if(descriptor[i * 4] == '1') { desc_data[i] += 8; } - if(descriptor[(i * 4) + 1] == '1') { desc_data[i] += 4; } - if(descriptor[(i * 4) + 2] == '1') { desc_data[i] += 2; } - if(descriptor[(i * 4) + 3] == '1') { desc_data[i] += 1; } - } - - /* Add reed-solomon error correction with Galois field GF(16) and prime modulus - x^4 + x + 1 (section 7.2.3)*/ + /* Split into 4-bit codewords */ + for (i = 0; i < 4; i++) { + if (descriptor[i * 4] == '1') { + desc_data[i] += 8; + } + if (descriptor[(i * 4) + 1] == '1') { + desc_data[i] += 4; + } + if (descriptor[(i * 4) + 2] == '1') { + desc_data[i] += 2; + } + if (descriptor[(i * 4) + 3] == '1') { + desc_data[i] += 1; + } + } - rs_init_gf(0x13); - if(compact) { - rs_init_code(5, 1); - rs_encode(2, desc_data, desc_ecc); - for(i = 0; i < 5; i++) { - if(desc_ecc[4 - i] & 0x08) { descriptor[(i * 4) + 8] = '1'; } else { descriptor[(i * 4) + 8] = '0'; } - if(desc_ecc[4 - i] & 0x04) { descriptor[(i * 4) + 9] = '1'; } else { descriptor[(i * 4) + 9] = '0'; } - if(desc_ecc[4 - i] & 0x02) { descriptor[(i * 4) + 10] = '1'; } else { descriptor[(i * 4) + 10] = '0'; } - if(desc_ecc[4 - i] & 0x01) { descriptor[(i * 4) + 11] = '1'; } else { descriptor[(i * 4) + 11] = '0'; } - } - } else { - rs_init_code(6, 1); - rs_encode(4, desc_data, desc_ecc); - for(i = 0; i < 6; i++) { - if(desc_ecc[5 - i] & 0x08) { descriptor[(i * 4) + 16] = '1'; } else { descriptor[(i * 4) + 16] = '0'; } - if(desc_ecc[5 - i] & 0x04) { descriptor[(i * 4) + 17] = '1'; } else { descriptor[(i * 4) + 17] = '0'; } - if(desc_ecc[5 - i] & 0x02) { descriptor[(i * 4) + 18] = '1'; } else { descriptor[(i * 4) + 18] = '0'; } - if(desc_ecc[5 - i] & 0x01) { descriptor[(i * 4) + 19] = '1'; } else { descriptor[(i * 4) + 19] = '0'; } - } - } - rs_free(); + /* Add reed-solomon error correction with Galois field GF(16) and prime modulus + x^4 + x + 1 (section 7.2.3)*/ - /* Merge descriptor with the rest of the symbol */ - for(i = 0; i < 40; i++) { - if(compact) { - bit_pattern[2000 + i - 2] = descriptor[i]; - } else { - bit_pattern[20000 + i - 2] = descriptor[i]; - } - } + rs_init_gf(0x13); + if (compact) { + rs_init_code(5, 1); + rs_encode(2, desc_data, desc_ecc); + for (i = 0; i < 5; i++) { + if (desc_ecc[4 - i] & 0x08) { + descriptor[(i * 4) + 8] = '1'; + } else { + descriptor[(i * 4) + 8] = '0'; + } + if (desc_ecc[4 - i] & 0x04) { + descriptor[(i * 4) + 9] = '1'; + } else { + descriptor[(i * 4) + 9] = '0'; + } + if (desc_ecc[4 - i] & 0x02) { + descriptor[(i * 4) + 10] = '1'; + } else { + descriptor[(i * 4) + 10] = '0'; + } + if (desc_ecc[4 - i] & 0x01) { + descriptor[(i * 4) + 11] = '1'; + } else { + descriptor[(i * 4) + 11] = '0'; + } + } + } else { + rs_init_code(6, 1); + rs_encode(4, desc_data, desc_ecc); + for (i = 0; i < 6; i++) { + if (desc_ecc[5 - i] & 0x08) { + descriptor[(i * 4) + 16] = '1'; + } else { + descriptor[(i * 4) + 16] = '0'; + } + if (desc_ecc[5 - i] & 0x04) { + descriptor[(i * 4) + 17] = '1'; + } else { + descriptor[(i * 4) + 17] = '0'; + } + if (desc_ecc[5 - i] & 0x02) { + descriptor[(i * 4) + 18] = '1'; + } else { + descriptor[(i * 4) + 18] = '0'; + } + if (desc_ecc[5 - i] & 0x01) { + descriptor[(i * 4) + 19] = '1'; + } else { + descriptor[(i * 4) + 19] = '0'; + } + } + } + rs_free(); - /* Plot all of the data into the symbol in pre-defined spiral pattern */ - if(compact) { + /* Merge descriptor with the rest of the symbol */ + for (i = 0; i < 40; i++) { + if (compact) { + bit_pattern[2000 + i - 2] = descriptor[i]; + } else { + bit_pattern[20000 + i - 2] = descriptor[i]; + } + } - for(y = AztecCompactOffset[layers - 1]; y < (27 - AztecCompactOffset[layers - 1]); y++) { - for(x = AztecCompactOffset[layers - 1]; x < (27 - AztecCompactOffset[layers - 1]); x++) { - if(CompactAztecMap[(y * 27) + x] == 1) { - set_module(symbol, y - AztecCompactOffset[layers - 1], x - AztecCompactOffset[layers - 1]); - } - if(CompactAztecMap[(y * 27) + x] >= 2) { - if(bit_pattern[CompactAztecMap[(y * 27) + x] - 2] == '1') { - set_module(symbol, y - AztecCompactOffset[layers - 1], x - AztecCompactOffset[layers - 1]); - } - } - } - symbol->row_height[y - AztecCompactOffset[layers - 1]] = 1; - } - symbol->rows = 27 - (2 * AztecCompactOffset[layers - 1]); - symbol->width = 27 - (2 * AztecCompactOffset[layers - 1]); - } else { + /* Plot all of the data into the symbol in pre-defined spiral pattern */ + if (compact) { - for(y = AztecOffset[layers - 1]; y < (151 - AztecOffset[layers - 1]); y++) { - for(x = AztecOffset[layers - 1]; x < (151 - AztecOffset[layers - 1]); x++) { - if(AztecMap[(y * 151) + x] == 1) { - set_module(symbol, y - AztecOffset[layers - 1], x - AztecOffset[layers - 1]); - } - if(AztecMap[(y * 151) + x] >= 2) { - if(bit_pattern[AztecMap[(y * 151) + x] - 2] == '1') { - set_module(symbol, y - AztecOffset[layers - 1], x - AztecOffset[layers - 1]); - } - } - } - symbol->row_height[y - AztecOffset[layers - 1]] = 1; - } - symbol->rows = 151 - (2 * AztecOffset[layers - 1]); - symbol->width = 151 - (2 * AztecOffset[layers - 1]); - } + for (y = AztecCompactOffset[layers - 1]; y < (27 - AztecCompactOffset[layers - 1]); y++) { + for (x = AztecCompactOffset[layers - 1]; x < (27 - AztecCompactOffset[layers - 1]); x++) { + if (CompactAztecMap[(y * 27) + x] == 1) { + set_module(symbol, y - AztecCompactOffset[layers - 1], x - AztecCompactOffset[layers - 1]); + } + if (CompactAztecMap[(y * 27) + x] >= 2) { + if (bit_pattern[CompactAztecMap[(y * 27) + x] - 2] == '1') { + set_module(symbol, y - AztecCompactOffset[layers - 1], x - AztecCompactOffset[layers - 1]); + } + } + } + symbol->row_height[y - AztecCompactOffset[layers - 1]] = 1; + } + symbol->rows = 27 - (2 * AztecCompactOffset[layers - 1]); + symbol->width = 27 - (2 * AztecCompactOffset[layers - 1]); + } else { - return err_code; + for (y = AztecOffset[layers - 1]; y < (151 - AztecOffset[layers - 1]); y++) { + for (x = AztecOffset[layers - 1]; x < (151 - AztecOffset[layers - 1]); x++) { + if (AztecMap[(y * 151) + x] == 1) { + set_module(symbol, y - AztecOffset[layers - 1], x - AztecOffset[layers - 1]); + } + if (AztecMap[(y * 151) + x] >= 2) { + if (bit_pattern[AztecMap[(y * 151) + x] - 2] == '1') { + set_module(symbol, y - AztecOffset[layers - 1], x - AztecOffset[layers - 1]); + } + } + } + symbol->row_height[y - AztecOffset[layers - 1]] = 1; + } + symbol->rows = 151 - (2 * AztecOffset[layers - 1]); + symbol->width = 151 - (2 * AztecOffset[layers - 1]); + } + + return err_code; } -int aztec_runes(struct zint_symbol *symbol, unsigned char source[], int length) -{ - int input_value, error_number, i, y, x; - char binary_string[28]; - unsigned char data_codewords[3], ecc_codewords[6]; - - error_number = 0; - input_value = 0; - if(length > 3) { - strcpy(symbol->errtxt, "Input too large"); - return ZINT_ERROR_INVALID_DATA; - } - error_number = is_sane(NEON, source, length); - if(error_number != 0) { - strcpy(symbol->errtxt, "Invalid characters in input"); - return ZINT_ERROR_INVALID_DATA; - } - switch(length) { - case 3: input_value = 100 * ctoi(source[0]); - input_value += 10 * ctoi(source[1]); - input_value += ctoi(source[2]); - break; - case 2: input_value = 10 * ctoi(source[0]); - input_value += ctoi(source[1]); - break; - case 1: input_value = ctoi(source[0]); - break; - } +/* Encodes Aztec runes as specified in ISO/IEC 24778:2008 Annex A */ +int aztec_runes(struct zint_symbol *symbol, unsigned char source[], int length) { + int input_value, error_number, i, y, x; + char binary_string[28]; + unsigned char data_codewords[3], ecc_codewords[6]; - if(input_value > 255) { - strcpy(symbol->errtxt, "Input too large"); - return ZINT_ERROR_INVALID_DATA; - } + error_number = 0; + input_value = 0; + if (length > 3) { + strcpy(symbol->errtxt, "Input too large"); + return ZINT_ERROR_INVALID_DATA; + } + error_number = is_sane(NEON, source, length); + if (error_number != 0) { + strcpy(symbol->errtxt, "Invalid characters in input"); + return ZINT_ERROR_INVALID_DATA; + } + switch (length) { + case 3: input_value = 100 * ctoi(source[0]); + input_value += 10 * ctoi(source[1]); + input_value += ctoi(source[2]); + break; + case 2: input_value = 10 * ctoi(source[0]); + input_value += ctoi(source[1]); + break; + case 1: input_value = ctoi(source[0]); + break; + } - strcpy(binary_string, ""); - if(input_value & 0x80) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(input_value & 0x40) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(input_value & 0x20) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(input_value & 0x10) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(input_value & 0x08) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(input_value & 0x04) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(input_value & 0x02) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(input_value & 0x01) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - - data_codewords[0] = 0; - data_codewords[1] = 0; - - for(i = 0; i < 2; i++) { - if(binary_string[i * 4] == '1') { data_codewords[i] += 8; } - if(binary_string[(i * 4) + 1] == '1') { data_codewords[i] += 4; } - if(binary_string[(i * 4) + 2] == '1') { data_codewords[i] += 2; } - if(binary_string[(i * 4) + 3] == '1') { data_codewords[i] += 1; } - } + if (input_value > 255) { + strcpy(symbol->errtxt, "Input too large"); + return ZINT_ERROR_INVALID_DATA; + } - rs_init_gf(0x13); - rs_init_code(5, 1); - rs_encode(2, data_codewords, ecc_codewords); - rs_free(); + strcpy(binary_string, ""); + for (int p = 0; p < 8; p++) { + if (input_value & (0x80 >> p)) { + concat(binary_string, "1"); + } else { + concat(binary_string, "0"); + } + } - strcpy(binary_string, ""); - - for(i = 0; i < 5; i++) { - if(ecc_codewords[4 - i] & 0x08) { binary_string[(i * 4) + 8] = '1'; } else { binary_string[(i * 4) + 8] = '0'; } - if(ecc_codewords[4 - i] & 0x04) { binary_string[(i * 4) + 9] = '1'; } else { binary_string[(i * 4) + 9] = '0'; } - if(ecc_codewords[4 - i] & 0x02) { binary_string[(i * 4) + 10] = '1'; } else { binary_string[(i * 4) + 10] = '0'; } - if(ecc_codewords[4 - i] & 0x01) { binary_string[(i * 4) + 11] = '1'; } else { binary_string[(i * 4) + 11] = '0'; } - } - - for(i = 0; i < 28; i += 2) { - if(binary_string[i] == '1') { binary_string[i] = '0'; } else { binary_string[i] = '1'; } - } - - for(y = 8; y < 19; y++) { - for(x = 8; x < 19; x++) { - if(CompactAztecMap[(y * 27) + x] == 1) { - set_module(symbol, y - 8, x - 8); - } - if(CompactAztecMap[(y * 27) + x] >= 2) { - if(binary_string[CompactAztecMap[(y * 27) + x] - 2000] == '1') { - set_module(symbol, y - 8, x - 8); - } - } - } - symbol->row_height[y - 8] = 1; - } - symbol->rows = 11; - symbol->width = 11; + data_codewords[0] = 0; + data_codewords[1] = 0; - return 0; + for (i = 0; i < 2; i++) { + if (binary_string[i * 4] == '1') { + data_codewords[i] += 8; + } + if (binary_string[(i * 4) + 1] == '1') { + data_codewords[i] += 4; + } + if (binary_string[(i * 4) + 2] == '1') { + data_codewords[i] += 2; + } + if (binary_string[(i * 4) + 3] == '1') { + data_codewords[i] += 1; + } + } + + rs_init_gf(0x13); + rs_init_code(5, 1); + rs_encode(2, data_codewords, ecc_codewords); + rs_free(); + + strcpy(binary_string, ""); + + for (i = 0; i < 5; i++) { + if (ecc_codewords[4 - i] & 0x08) { + binary_string[(i * 4) + 8] = '1'; + } else { + binary_string[(i * 4) + 8] = '0'; + } + if (ecc_codewords[4 - i] & 0x04) { + binary_string[(i * 4) + 9] = '1'; + } else { + binary_string[(i * 4) + 9] = '0'; + } + if (ecc_codewords[4 - i] & 0x02) { + binary_string[(i * 4) + 10] = '1'; + } else { + binary_string[(i * 4) + 10] = '0'; + } + if (ecc_codewords[4 - i] & 0x01) { + binary_string[(i * 4) + 11] = '1'; + } else { + binary_string[(i * 4) + 11] = '0'; + } + } + + for (i = 0; i < 28; i += 2) { + if (binary_string[i] == '1') { + binary_string[i] = '0'; + } else { + binary_string[i] = '1'; + } + } + + for (y = 8; y < 19; y++) { + for (x = 8; x < 19; x++) { + if (CompactAztecMap[(y * 27) + x] == 1) { + set_module(symbol, y - 8, x - 8); + } + if (CompactAztecMap[(y * 27) + x] >= 2) { + if (binary_string[CompactAztecMap[(y * 27) + x] - 2000] == '1') { + set_module(symbol, y - 8, x - 8); + } + } + } + symbol->row_height[y - 8] = 1; + } + symbol->rows = 11; + symbol->width = 11; + + return 0; } \ No newline at end of file diff --git a/backend/aztec.h b/backend/aztec.h index e406bd34..2088410a 100644 --- a/backend/aztec.h +++ b/backend/aztec.h @@ -2,20 +2,20 @@ /* libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart + Copyright (C) 2008-2016 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. + notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. 3. Neither the name of the project nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. + may be used to endorse or promote products derived from this software + without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -28,7 +28,7 @@ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + */ #define UPPER 1 #define LOWER 2 @@ -39,112 +39,139 @@ static int AztecMap[22801]; -static const int CompactAztecMap[] = { /* 27 x 27 data grid */ - 609,608,411,413,415,417,419,421,423,425,427,429,431,433,435,437,439,441,443,445,447,449,451,453,455,457,459, - 607,606,410,412,414,416,418,420,422,424,426,428,430,432,434,436,438,440,442,444,446,448,450,452,454,456,458, - 605,604,409,408,243,245,247,249,251,253,255,257,259,261,263,265,267,269,271,273,275,277,279,281,283,460,461, - 603,602,407,406,242,244,246,248,250,252,254,256,258,260,262,264,266,268,270,272,274,276,278,280,282,462,463, - 601,600,405,404,241,240,107,109,111,113,115,117,119,121,123,125,127,129,131,133,135,137,139,284,285,464,465, - 599,598,403,402,239,238,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,286,287,466,467, - 597,596,401,400,237,236,105,104,3,5,7,9,11,13,15,17,19,21,23,25,27,140,141,288,289,468,469, - 595,594,399,398,235,234,103,102,2,4,6,8,10,12,14,16,18,20,22,24,26,142,143,290,291,470,471, - 593,592,397,396,233,232,101,100,1,1,2000,2001,2002,2003,2004,2005,2006,0,1,28,29,144,145,292,293,472,473, - 591,590,395,394,231,230,99,98,1,1,1,1,1,1,1,1,1,1,1,30,31,146,147,294,295,474,475, - 589,588,393,392,229,228,97,96,2027,1,0,0,0,0,0,0,0,1,2007,32,33,148,149,296,297,476,477, - 587,586,391,390,227,226,95,94,2026,1,0,1,1,1,1,1,0,1,2008,34,35,150,151,298,299,478,479, - 585,584,389,388,225,224,93,92,2025,1,0,1,0,0,0,1,0,1,2009,36,37,152,153,300,301,480,481, - 583,582,387,386,223,222,91,90,2024,1,0,1,0,1,0,1,0,1,2010,38,39,154,155,302,303,482,483, - 581,580,385,384,221,220,89,88,2023,1,0,1,0,0,0,1,0,1,2011,40,41,156,157,304,305,484,485, - 579,578,383,382,219,218,87,86,2022,1,0,1,1,1,1,1,0,1,2012,42,43,158,159,306,307,486,487, - 577,576,381,380,217,216,85,84,2021,1,0,0,0,0,0,0,0,1,2013,44,45,160,161,308,309,488,489, - 575,574,379,378,215,214,83,82,0,1,1,1,1,1,1,1,1,1,1,46,47,162,163,310,311,490,491, - 573,572,377,376,213,212,81,80,0,0,2020,2019,2018,2017,2016,2015,2014,0,0,48,49,164,165,312,313,492,493, - 571,570,375,374,211,210,78,76,74,72,70,68,66,64,62,60,58,56,54,50,51,166,167,314,315,494,495, - 569,568,373,372,209,208,79,77,75,73,71,69,67,65,63,61,59,57,55,52,53,168,169,316,317,496,497, - 567,566,371,370,206,204,202,200,198,196,194,192,190,188,186,184,182,180,178,176,174,170,171,318,319,498,499, - 565,564,369,368,207,205,203,201,199,197,195,193,191,189,187,185,183,181,179,177,175,172,173,320,321,500,501, - 563,562,366,364,362,360,358,356,354,352,350,348,346,344,342,340,338,336,334,332,330,328,326,322,323,502,503, - 561,560,367,365,363,361,359,357,355,353,351,349,347,345,343,341,339,337,335,333,331,329,327,324,325,504,505, - 558,556,554,552,550,548,546,544,542,540,538,536,534,532,530,528,526,524,522,520,518,516,514,512,510,506,507, - 559,557,555,553,551,549,547,545,543,541,539,537,535,533,531,529,527,525,523,521,519,517,515,513,511,508,509 +static const int CompactAztecMap[] = { + /* 27 x 27 data grid */ + 609, 608, 411, 413, 415, 417, 419, 421, 423, 425, 427, 429, 431, 433, 435, 437, 439, 441, 443, 445, 447, 449, 451, 453, 455, 457, 459, + 607, 606, 410, 412, 414, 416, 418, 420, 422, 424, 426, 428, 430, 432, 434, 436, 438, 440, 442, 444, 446, 448, 450, 452, 454, 456, 458, + 605, 604, 409, 408, 243, 245, 247, 249, 251, 253, 255, 257, 259, 261, 263, 265, 267, 269, 271, 273, 275, 277, 279, 281, 283, 460, 461, + 603, 602, 407, 406, 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 462, 463, + 601, 600, 405, 404, 241, 240, 107, 109, 111, 113, 115, 117, 119, 121, 123, 125, 127, 129, 131, 133, 135, 137, 139, 284, 285, 464, 465, + 599, 598, 403, 402, 239, 238, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 286, 287, 466, 467, + 597, 596, 401, 400, 237, 236, 105, 104, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 140, 141, 288, 289, 468, 469, + 595, 594, 399, 398, 235, 234, 103, 102, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 142, 143, 290, 291, 470, 471, + 593, 592, 397, 396, 233, 232, 101, 100, 1, 1, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 0, 1, 28, 29, 144, 145, 292, 293, 472, 473, + 591, 590, 395, 394, 231, 230, 99, 98, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 30, 31, 146, 147, 294, 295, 474, 475, + 589, 588, 393, 392, 229, 228, 97, 96, 2027, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2007, 32, 33, 148, 149, 296, 297, 476, 477, + 587, 586, 391, 390, 227, 226, 95, 94, 2026, 1, 0, 1, 1, 1, 1, 1, 0, 1, 2008, 34, 35, 150, 151, 298, 299, 478, 479, + 585, 584, 389, 388, 225, 224, 93, 92, 2025, 1, 0, 1, 0, 0, 0, 1, 0, 1, 2009, 36, 37, 152, 153, 300, 301, 480, 481, + 583, 582, 387, 386, 223, 222, 91, 90, 2024, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2010, 38, 39, 154, 155, 302, 303, 482, 483, + 581, 580, 385, 384, 221, 220, 89, 88, 2023, 1, 0, 1, 0, 0, 0, 1, 0, 1, 2011, 40, 41, 156, 157, 304, 305, 484, 485, + 579, 578, 383, 382, 219, 218, 87, 86, 2022, 1, 0, 1, 1, 1, 1, 1, 0, 1, 2012, 42, 43, 158, 159, 306, 307, 486, 487, + 577, 576, 381, 380, 217, 216, 85, 84, 2021, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2013, 44, 45, 160, 161, 308, 309, 488, 489, + 575, 574, 379, 378, 215, 214, 83, 82, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 46, 47, 162, 163, 310, 311, 490, 491, + 573, 572, 377, 376, 213, 212, 81, 80, 0, 0, 2020, 2019, 2018, 2017, 2016, 2015, 2014, 0, 0, 48, 49, 164, 165, 312, 313, 492, 493, + 571, 570, 375, 374, 211, 210, 78, 76, 74, 72, 70, 68, 66, 64, 62, 60, 58, 56, 54, 50, 51, 166, 167, 314, 315, 494, 495, + 569, 568, 373, 372, 209, 208, 79, 77, 75, 73, 71, 69, 67, 65, 63, 61, 59, 57, 55, 52, 53, 168, 169, 316, 317, 496, 497, + 567, 566, 371, 370, 206, 204, 202, 200, 198, 196, 194, 192, 190, 188, 186, 184, 182, 180, 178, 176, 174, 170, 171, 318, 319, 498, 499, + 565, 564, 369, 368, 207, 205, 203, 201, 199, 197, 195, 193, 191, 189, 187, 185, 183, 181, 179, 177, 175, 172, 173, 320, 321, 500, 501, + 563, 562, 366, 364, 362, 360, 358, 356, 354, 352, 350, 348, 346, 344, 342, 340, 338, 336, 334, 332, 330, 328, 326, 322, 323, 502, 503, + 561, 560, 367, 365, 363, 361, 359, 357, 355, 353, 351, 349, 347, 345, 343, 341, 339, 337, 335, 333, 331, 329, 327, 324, 325, 504, 505, + 558, 556, 554, 552, 550, 548, 546, 544, 542, 540, 538, 536, 534, 532, 530, 528, 526, 524, 522, 520, 518, 516, 514, 512, 510, 506, 507, + 559, 557, 555, 553, 551, 549, 547, 545, 543, 541, 539, 537, 535, 533, 531, 529, 527, 525, 523, 521, 519, 517, 515, 513, 511, 508, 509 }; -const int AztecCodeSet[128] = { /* From Table 2 */ - 32, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 12, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 4, 4, 4, 4, 4, 23, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 24, 8, 24, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 8, 8, - 8, 8, 8, 8, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 4, 8, 4, 4, 4, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 8, 4, 8, 4, 4 +const int AztecCodeSet[128] = { + /* From Table 2 */ + 32, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 12, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 4, 4, 4, 4, 4, 23, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 24, 8, 24, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 8, 8, + 8, 8, 8, 8, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 4, 8, 4, 4, 4, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 8, 4, 8, 4, 4 }; -const int AztecSymbolChar[128] = { /* From Table 2 */ - 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 300, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 15, 16, 17, 18, 19, 1, 6, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 301, 18, 302, 20, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 21, 22, - 23, 24, 25, 26, 20, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 27, 21, 28, 22, 23, 24, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 29, 25, 30, 26, 27 +const int AztecSymbolChar[128] = { + /* From Table 2 */ + 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 300, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 15, 16, 17, 18, 19, 1, 6, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 301, 18, 302, 20, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 21, 22, + 23, 24, 25, 26, 20, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 27, 21, 28, 22, 23, 24, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 29, 25, 30, 26, 27 }; /* Problem characters are: - 300: Carriage Return (ASCII 13) - 301: Comma (ASCII 44) - 302: Full Stop (ASCII 46) -*/ + 300: Carriage Return (ASCII 13) + 301: Comma (ASCII 44) + 302: Full Stop (ASCII 46) + */ -static const char *hexbit[32] = {"00000", "00001", "00010", "00011", "00100", "00101", "00110", "00111", "01000", "01001", - "01010", "01011", "01100", "01101", "01110", "01111", "10000", "10001", "10010", "10011", "10100", "10101", - "10110", "10111", "11000", "11001", "11010", "11011", "11100", "11101", "11110", "11111" +static const char *hexbit[32] = { + "00000", "00001", "00010", "00011", "00100", "00101", "00110", "00111", "01000", "01001", + "01010", "01011", "01100", "01101", "01110", "01111", "10000", "10001", "10010", "10011", "10100", "10101", + "10110", "10111", "11000", "11001", "11010", "11011", "11100", "11101", "11110", "11111" }; -static const char *pentbit[16] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", - "1010", "1011", "1100", "1101", "1110", "1111" +static const char *pentbit[16] = { + "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", + "1010", "1011", "1100", "1101", "1110", "1111" }; -static const char *tribit[8] = {"000", "001", "010", "011", "100", "101", "110", "111"}; - -static const int AztecSizes[32] = { /* Codewords per symbol */ - 21, 48, 60, 88, 120, 156, 196, 240, 230, 272, 316, 364, 416, 470, 528, 588, 652, 720, 790, - 864, 940, 1020, 920, 992, 1066, 1144, 1224, 1306, 1392, 1480, 1570, 1664 +static const char *tribit[8] = { + "000", "001", "010", "011", "100", "101", "110", "111" }; -static const int AztecCompactSizes[4] = { 17, 40, 51, 76 }; - -static const int Aztec10DataSizes[32] = { /* Data bits per symbol maximum with 10% error correction */ - 96, 246, 408, 616, 840, 1104, 1392, 1704, 2040, 2420, 2820, 3250, 3720, 4200, 4730, - 5270, 5840, 6450, 7080, 7750, 8430, 9150, 9900, 10680, 11484, 12324, 13188, 14076, - 15000, 15948, 16920, 17940 +static const int AztecSizes[32] = { + /* Codewords per symbol */ + 21, 48, 60, 88, 120, 156, 196, 240, 230, 272, 316, 364, 416, 470, 528, 588, 652, 720, 790, + 864, 940, 1020, 920, 992, 1066, 1144, 1224, 1306, 1392, 1480, 1570, 1664 }; -static const int Aztec23DataSizes[32] = { /* Data bits per symbol maximum with 23% error correction */ - 84, 204, 352, 520, 720, 944, 1184, 1456, 1750, 2070, 2410, 2780, 3180, 3590, 4040, - 4500, 5000, 5520, 6060, 6630, 7210, 7830, 8472, 9132, 9816, 10536, 11280, 12036, - 12828, 13644, 14472, 15348 +static const int AztecCompactSizes[4] = { + 17, 40, 51, 76 }; -static const int Aztec36DataSizes[32] = { /* Data bits per symbol maximum with 36% error correction */ - 66, 168, 288, 432, 592, 776, 984, 1208, 1450, 1720, 2000, 2300, 2640, 2980, 3350, - 3740, 4150, 4580, 5030, 5500, 5990, 6500, 7032, 7584, 8160, 8760, 9372, 9996, 10656, - 11340, 12024, 12744 +static const int Aztec10DataSizes[32] = { + /* Data bits per symbol maximum with 10% error correction */ + 96, 246, 408, 616, 840, 1104, 1392, 1704, 2040, 2420, 2820, 3250, 3720, 4200, 4730, + 5270, 5840, 6450, 7080, 7750, 8430, 9150, 9900, 10680, 11484, 12324, 13188, 14076, + 15000, 15948, 16920, 17940 }; -static const int Aztec50DataSizes[32] = { /* Data bits per symbol maximum with 50% error correction */ - 48, 126, 216, 328, 456, 600, 760, 936, 1120, 1330, 1550, 1790, 2050, 2320, 2610, - 2910, 3230, 3570, 3920, 4290, 4670, 5070, 5484, 5916, 6360, 6828, 7308, 7800, 8316, - 8844, 9384, 9948 +static const int Aztec23DataSizes[32] = { + /* Data bits per symbol maximum with 23% error correction */ + 84, 204, 352, 520, 720, 944, 1184, 1456, 1750, 2070, 2410, 2780, 3180, 3590, 4040, + 4500, 5000, 5520, 6060, 6630, 7210, 7830, 8472, 9132, 9816, 10536, 11280, 12036, + 12828, 13644, 14472, 15348 }; -static const int AztecCompact10DataSizes [4] = { 78, 198, 336, 520 }; -static const int AztecCompact23DataSizes [4] = { 66, 168, 288, 440 }; -static const int AztecCompact36DataSizes [4] = { 48, 138, 232, 360 }; -static const int AztecCompact50DataSizes [4] = { 36, 102, 176, 280 }; +static const int Aztec36DataSizes[32] = { + /* Data bits per symbol maximum with 36% error correction */ + 66, 168, 288, 432, 592, 776, 984, 1208, 1450, 1720, 2000, 2300, 2640, 2980, 3350, + 3740, 4150, 4580, 5030, 5500, 5990, 6500, 7032, 7584, 8160, 8760, 9372, 9996, 10656, + 11340, 12024, 12744 +}; + +static const int Aztec50DataSizes[32] = { + /* Data bits per symbol maximum with 50% error correction */ + 48, 126, 216, 328, 456, 600, 760, 936, 1120, 1330, 1550, 1790, 2050, 2320, 2610, + 2910, 3230, 3570, 3920, 4290, 4670, 5070, 5484, 5916, 6360, 6828, 7308, 7800, 8316, + 8844, 9384, 9948 +}; + +static const int AztecCompact10DataSizes [4] = { + 78, 198, 336, 520 +}; + +static const int AztecCompact23DataSizes [4] = { + 66, 168, 288, 440 +}; + +static const int AztecCompact36DataSizes [4] = { + 48, 138, 232, 360 +}; + +static const int AztecCompact50DataSizes [4] = { + 36, 102, 176, 280 +}; static const int AztecOffset[32] = { - 66, 64, 62, 60, 57, 55, 53, 51, 49, 47, 45, 42, 40, 38, 36, 34, 32, 30, 28, 25, 23, 21, - 19, 17, 15, 13, 10, 8, 6, 4, 2, 0 + 66, 64, 62, 60, 57, 55, 53, 51, 49, 47, 45, 42, 40, 38, 36, 34, 32, 30, 28, 25, 23, 21, + 19, 17, 15, 13, 10, 8, 6, 4, 2, 0 }; -static const int AztecCompactOffset[4] = { 6, 4, 2, 0 }; +static const int AztecCompactOffset[4] = { + 6, 4, 2, 0 +}; diff --git a/backend/code.c b/backend/code.c index 1a649f9b..a6c035b6 100644 --- a/backend/code.c +++ b/backend/code.c @@ -2,7 +2,7 @@ /* libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart + Copyright (C) 2008-2016 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -28,7 +28,7 @@ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + */ /* In version 0.5 this file was 1,553 lines long! */ @@ -40,49 +40,58 @@ #define SODIUM "0123456789-" #define SILVER "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%abcd" -static const char *C11Table[11] = {"111121", "211121", "121121", "221111", "112121", "212111", "122111", - "111221", "211211", "211111", "112111"}; - +static const char *C11Table[11] = { + "111121", "211121", "121121", "221111", "112121", "212111", "122111", + "111221", "211211", "211111", "112111" +}; /* Code 39 tables checked against ISO/IEC 16388:2007 */ /* Incorporates Table A1 */ -static const char *C39Table[43] = { "1112212111", "2112111121", "1122111121", "2122111111", "1112211121", - "2112211111", "1122211111", "1112112121", "2112112111", "1122112111", "2111121121", - "1121121121", "2121121111", "1111221121", "2111221111", "1121221111", "1111122121", - "2111122111", "1121122111", "1111222111", "2111111221", "1121111221", "2121111211", - "1111211221", "2111211211", "1121211211", "1111112221", "2111112211", "1121112211", - "1111212211", "2211111121", "1221111121", "2221111111", "1211211121", "2211211111", - "1221211111", "1211112121", "2211112111", "1221112111", "1212121111", "1212111211", - "1211121211", "1112121211"}; -/* Code 39 character assignments (Table 1) */ +static const char *C39Table[43] = { + /* Code 39 character assignments (Table 1) */ + "1112212111", "2112111121", "1122111121", "2122111111", "1112211121", + "2112211111", "1122211111", "1112112121", "2112112111", "1122112111", "2111121121", + "1121121121", "2121121111", "1111221121", "2111221111", "1121221111", "1111122121", + "2111122111", "1121122111", "1111222111", "2111111221", "1121111221", "2121111211", + "1111211221", "2111211211", "1121211211", "1111112221", "2111112211", "1121112211", + "1111212211", "2211111121", "1221111121", "2221111111", "1211211121", "2211211111", + "1221211111", "1211112121", "2211112111", "1221112111", "1212121111", "1212111211", + "1211121211", "1112121211" +}; -static const char *EC39Ctrl[128] = {"%U", "$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", - "%A", "%B", "%C", "%D", "%E", " ", "/A", "/B", "/C", "/D", "/E", "/F", "/G", "/H", "/I", "/J", - "/K", "/L", "-", ".", "/O", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "/Z", "%F", - "%G", "%H", "%I", "%J", "%V", "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", "%K", "%L", "%M", "%N", "%O", - "%W", "+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", "%P", "%Q", "%R", "%S", "%T"}; -/* Encoding the full ASCII character set in Code 39 (Table A2) */ +static const char *EC39Ctrl[128] = { + /* Encoding the full ASCII character set in Code 39 (Table A2) */ + "%U", "$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", + "%A", "%B", "%C", "%D", "%E", " ", "/A", "/B", "/C", "/D", "/E", "/F", "/G", "/H", "/I", "/J", + "/K", "/L", "-", ".", "/O", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "/Z", "%F", + "%G", "%H", "%I", "%J", "%V", "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", "%K", "%L", "%M", "%N", "%O", + "%W", "+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", "%P", "%Q", "%R", "%S", "%T" +}; -static const char *C93Ctrl[128] = {"bU", "aA", "aB", "aC", "aD", "aE", "aF", "aG", "aH", "aI", "aJ", "aK", - "aL", "aM", "aN", "aO", "aP", "aQ", "aR", "aS", "aT", "aU", "aV", "aW", "aX", "aY", "aZ", - "bA", "bB", "bC", "bD", "bE", " ", "cA", "cB", "cC", "$", "%", "cF", "cG", "cH", "cI", "cJ", - "+", "cL", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "cZ", "bF", - "bG", "bH", "bI", "bJ", "bV", "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", "bK", "bL", "bM", "bN", "bO", - "bW", "dA", "dB", "dC", "dD", "dE", "dF", "dG", "dH", "dI", "dJ", "dK", "dL", "dM", "dN", "dO", - "dP", "dQ", "dR", "dS", "dT", "dU", "dV", "dW", "dX", "dY", "dZ", "bP", "bQ", "bR", "bS", "bT"}; +static const char *C93Ctrl[128] = { + "bU", "aA", "aB", "aC", "aD", "aE", "aF", "aG", "aH", "aI", "aJ", "aK", + "aL", "aM", "aN", "aO", "aP", "aQ", "aR", "aS", "aT", "aU", "aV", "aW", "aX", "aY", "aZ", + "bA", "bB", "bC", "bD", "bE", " ", "cA", "cB", "cC", "$", "%", "cF", "cG", "cH", "cI", "cJ", + "+", "cL", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "cZ", "bF", + "bG", "bH", "bI", "bJ", "bV", "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", "bK", "bL", "bM", "bN", "bO", + "bW", "dA", "dB", "dC", "dD", "dE", "dF", "dG", "dH", "dI", "dJ", "dK", "dL", "dM", "dN", "dO", + "dP", "dQ", "dR", "dS", "dT", "dU", "dV", "dW", "dX", "dY", "dZ", "bP", "bQ", "bR", "bS", "bT" +}; -static const char *C93Table[47] = {"131112", "111213", "111312", "111411", "121113", "121212", "121311", - "111114", "131211", "141111", "211113", "211212", "211311", "221112", "221211", "231111", - "112113", "112212", "112311", "122112", "132111", "111123", "111222", "111321", "121122", - "131121", "212112", "212211", "211122", "211221", "221121", "222111", "112122", "112221", - "122121", "123111", "121131", "311112", "311211", "321111", "112131", "113121", "211131", - "121221", "312111", "311121", "122211"}; +static const char *C93Table[47] = { + "131112", "111213", "111312", "111411", "121113", "121212", "121311", + "111114", "131211", "141111", "211113", "211212", "211311", "221112", "221211", "231111", + "112113", "112212", "112311", "122112", "132111", "111123", "111222", "111321", "121122", + "131121", "212112", "212211", "211122", "211221", "221121", "222111", "112122", "112221", + "122121", "123111", "121131", "311112", "311211", "321111", "112131", "113121", "211131", + "121221", "312111", "311121", "122211" +}; /* Global Variables for Channel Code */ int S[11], B[11]; @@ -95,356 +104,364 @@ void NextS(int Chan, int i, int MaxS, int MaxB); void NextB(int Chan, int i, int MaxB, int MaxS); /* *********************** CODE 11 ******************** */ +int code_11(struct zint_symbol *symbol, unsigned char source[], int length) { /* Code 11 */ -int code_11(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Code 11 */ + unsigned int i; + int h, c_digit, c_weight, c_count, k_digit, k_weight, k_count; + int weight[128], error_number; + char dest[1024]; /* 6 + 121 * 6 + 2 * 6 + 5 + 1 ~ 1024*/ + char checkstr[3]; - unsigned int i; - int h, c_digit, c_weight, c_count, k_digit, k_weight, k_count; - int weight[128], error_number; - char dest[1024]; /* 6 + 121 * 6 + 2 * 6 + 5 + 1 ~ 1024*/ - char checkstr[3]; + error_number = 0; - error_number = 0; + if (length > 121) { + strcpy(symbol->errtxt, "Input too long"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(SODIUM, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Invalid characters in data"); + return error_number; + } + c_weight = 1; + c_count = 0; + k_weight = 1; + k_count = 0; - if(length > 121) { - strcpy(symbol->errtxt, "Input too long"); - return ZINT_ERROR_TOO_LONG; - } - error_number = is_sane(SODIUM, source, length); - if(error_number == ZINT_ERROR_INVALID_DATA) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - c_weight = 1; - c_count = 0; - k_weight = 1; - k_count = 0; + /* start character */ + strcpy(dest, "112211"); - /* start character */ - strcpy(dest, "112211"); + /* Draw main body of barcode */ + for (i = 0; i < length; i++) { + lookup(SODIUM, C11Table, source[i], dest); + if (source[i] == '-') + weight[i] = 10; + else + weight[i] = ctoi(source[i]); + } - /* Draw main body of barcode */ - for(i = 0; i < length; i++) { - lookup(SODIUM, C11Table, source[i], dest); - if(source[i] == '-') - weight[i] = 10; - else - weight[i] = ctoi(source[i]); - } + /* Calculate C checksum */ + for (h = length - 1; h >= 0; h--) { + c_count += (c_weight * weight[h]); + c_weight++; - /* Calculate C checksum */ - for(h = length - 1; h >= 0; h--) { - c_count += (c_weight * weight[h]); - c_weight++; + if (c_weight > 10) { + c_weight = 1; + } + } + c_digit = c_count % 11; - if(c_weight > 10) { - c_weight = 1; - } - } - c_digit = c_count % 11; + weight[length] = c_digit; - weight[length] = c_digit; + /* Calculate K checksum */ + for (h = length; h >= 0; h--) { + k_count += (k_weight * weight[h]); + k_weight++; - /* Calculate K checksum */ - for(h = length; h >= 0; h--) { - k_count += (k_weight * weight[h]); - k_weight++; + if (k_weight > 9) { + k_weight = 1; + } + } + k_digit = k_count % 11; - if(k_weight > 9) { - k_weight = 1; - } - } - k_digit = k_count % 11; + checkstr[0] = itoc(c_digit); + checkstr[1] = itoc(k_digit); + if (checkstr[0] == 'A') { + checkstr[0] = '-'; + } + if (checkstr[1] == 'A') { + checkstr[1] = '-'; + } + checkstr[2] = '\0'; + lookup(SODIUM, C11Table, checkstr[0], dest); + lookup(SODIUM, C11Table, checkstr[1], dest); - checkstr[0] = itoc(c_digit); - checkstr[1] = itoc(k_digit); - if(checkstr[0] == 'A') { checkstr[0] = '-'; } - if(checkstr[1] == 'A') { checkstr[1] = '-'; } - checkstr[2] = '\0'; - lookup(SODIUM, C11Table, checkstr[0], dest); - lookup(SODIUM, C11Table, checkstr[1], dest); + /* Stop character */ + concat(dest, "11221"); - /* Stop character */ - concat (dest, "11221"); + expand(symbol, dest); - expand(symbol, dest); - - ustrcpy(symbol->text, source); - uconcat(symbol->text, (unsigned char*)checkstr); - return error_number; + ustrcpy(symbol->text, source); + uconcat(symbol->text, (unsigned char*) checkstr); + return error_number; } -int c39(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Code 39 */ - unsigned int i; - unsigned int counter; - char check_digit; - int error_number; - char dest[775]; - char localstr[2] = { 0 }; +/* Code 39 */ +int c39(struct zint_symbol *symbol, unsigned char source[], int length) { + unsigned int i; + unsigned int counter; + char check_digit; + int error_number; + char dest[775]; + char localstr[2] = {0}; - error_number = 0; - counter = 0; + error_number = 0; + counter = 0; - if((symbol->option_2 < 0) || (symbol->option_2 > 1)) { - symbol->option_2 = 0; - } + if ((symbol->option_2 < 0) || (symbol->option_2 > 1)) { + symbol->option_2 = 0; + } - if((symbol->symbology == BARCODE_LOGMARS) && (length > 59)) { - strcpy(symbol->errtxt, "Input too long"); - return ZINT_ERROR_TOO_LONG; - } else if(length > 74) { - strcpy(symbol->errtxt, "Input too long"); - return ZINT_ERROR_TOO_LONG; - } - to_upper(source); - error_number = is_sane(SILVER , source, length); - if(error_number == ZINT_ERROR_INVALID_DATA) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } + if ((symbol->symbology == BARCODE_LOGMARS) && (length > 59)) { + strcpy(symbol->errtxt, "Input too long"); + return ZINT_ERROR_TOO_LONG; + } else if (length > 74) { + strcpy(symbol->errtxt, "Input too long"); + return ZINT_ERROR_TOO_LONG; + } + to_upper(source); + error_number = is_sane(SILVER, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Invalid characters in data"); + return error_number; + } - /* Start character */ - strcpy(dest, "1211212111"); + /* Start character */ + strcpy(dest, "1211212111"); - for(i = 0; i < length; i++) { - lookup(SILVER, C39Table, source[i], dest); - counter += posn(SILVER, source[i]); - } + for (i = 0; i < length; i++) { + lookup(SILVER, C39Table, source[i], dest); + counter += posn(SILVER, source[i]); + } - if((symbol->symbology == BARCODE_LOGMARS) || (symbol->option_2 == 1)) { + if ((symbol->symbology == BARCODE_LOGMARS) || (symbol->option_2 == 1)) { - counter = counter % 43; - if(counter < 10) { - check_digit = itoc(counter); - } else { - if(counter < 36) { - check_digit = (counter - 10) + 'A'; - } else { - switch(counter) { - case 36: check_digit = '-'; break; - case 37: check_digit = '.'; break; - case 38: check_digit = ' '; break; - case 39: check_digit = '$'; break; - case 40: check_digit = '/'; break; - case 41: check_digit = '+'; break; - case 42: check_digit = 37; break; - default: check_digit = ' '; break; /* Keep compiler happy */ - } - } - } - lookup(SILVER, C39Table, check_digit, dest); + counter = counter % 43; + if (counter < 10) { + check_digit = itoc(counter); + } else { + if (counter < 36) { + check_digit = (counter - 10) + 'A'; + } else { + switch (counter) { + case 36: check_digit = '-'; + break; + case 37: check_digit = '.'; + break; + case 38: check_digit = ' '; + break; + case 39: check_digit = '$'; + break; + case 40: check_digit = '/'; + break; + case 41: check_digit = '+'; + break; + case 42: check_digit = 37; + break; + default: check_digit = ' '; + break; /* Keep compiler happy */ + } + } + } + lookup(SILVER, C39Table, check_digit, dest); - /* Display a space check digit as _, otherwise it looks like an error */ - if(check_digit == ' ') { - check_digit = '_'; - } + /* Display a space check digit as _, otherwise it looks like an error */ + if (check_digit == ' ') { + check_digit = '_'; + } - localstr[0] = check_digit; - localstr[1] = '\0'; - } + localstr[0] = check_digit; + localstr[1] = '\0'; + } - /* Stop character */ - concat (dest, "121121211"); + /* Stop character */ + concat(dest, "121121211"); - if((symbol->symbology == BARCODE_LOGMARS) || (symbol->symbology == BARCODE_HIBC_39)) { - /* LOGMARS uses wider 'wide' bars than normal Code 39 */ - counter = strlen(dest); - for(i = 0; i < counter; i++) { - if(dest[i] == '2') { - dest[i] = '3'; - } - } - } + if ((symbol->symbology == BARCODE_LOGMARS) || (symbol->symbology == BARCODE_HIBC_39)) { + /* LOGMARS uses wider 'wide' bars than normal Code 39 */ + counter = strlen(dest); + for (i = 0; i < counter; i++) { + if (dest[i] == '2') { + dest[i] = '3'; + } + } + } - expand(symbol, dest); + expand(symbol, dest); - if(symbol->symbology == BARCODE_CODE39) { - ustrcpy(symbol->text, (unsigned char*)"*"); - uconcat(symbol->text, source); - uconcat(symbol->text, (unsigned char*)localstr); - uconcat(symbol->text, (unsigned char*)"*"); - } else { - ustrcpy(symbol->text, source); - uconcat(symbol->text, (unsigned char*)localstr); - } - return error_number; + if (symbol->symbology == BARCODE_CODE39) { + ustrcpy(symbol->text, (unsigned char*) "*"); + uconcat(symbol->text, source); + uconcat(symbol->text, (unsigned char*) localstr); + uconcat(symbol->text, (unsigned char*) "*"); + } else { + ustrcpy(symbol->text, source); + uconcat(symbol->text, (unsigned char*) localstr); + } + return error_number; } -int pharmazentral(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Pharmazentral Nummer (PZN) */ +/* Pharmazentral Nummer (PZN) */ +int pharmazentral(struct zint_symbol *symbol, unsigned char source[], int length) { - int i, error_number, zeroes; - unsigned int count, check_digit; - char localstr[10]; + int i, error_number, zeroes; + unsigned int count, check_digit; + char localstr[10]; - error_number = 0; + error_number = 0; - count = 0; - if(length > 6) { - strcpy(symbol->errtxt, "Input wrong length"); - return ZINT_ERROR_TOO_LONG; - } - error_number = is_sane(NEON, source, length); - if(error_number == ZINT_ERROR_INVALID_DATA) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } + count = 0; + if (length > 6) { + strcpy(symbol->errtxt, "Input wrong length"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Invalid characters in data"); + return error_number; + } - localstr[0] = '-'; - zeroes = 6 - length + 1; - for(i = 1; i < zeroes; i++) - localstr[i] = '0'; - strcpy(localstr + zeroes, (char *)source); + localstr[0] = '-'; + zeroes = 6 - length + 1; + for (i = 1; i < zeroes; i++) + localstr[i] = '0'; + strcpy(localstr + zeroes, (char *) source); - for (i = 1; i < 7; i++) { - count += (i + 1) * ctoi(localstr[i]); - } + for (i = 1; i < 7; i++) { + count += (i + 1) * ctoi(localstr[i]); + } - check_digit = count%11; - if (check_digit == 11) { check_digit = 0; } - localstr[7] = itoc(check_digit); - localstr[8] = '\0'; - if(localstr[7] == 'A') { - strcpy(symbol->errtxt, "Invalid PZN Data"); - return ZINT_ERROR_INVALID_DATA; - } - error_number = c39(symbol, (unsigned char *)localstr, strlen(localstr)); - ustrcpy(symbol->text, (unsigned char *)"PZN"); - uconcat(symbol->text, (unsigned char *)localstr); - return error_number; + check_digit = count % 11; + if (check_digit == 11) { + check_digit = 0; + } + localstr[7] = itoc(check_digit); + localstr[8] = '\0'; + if (localstr[7] == 'A') { + strcpy(symbol->errtxt, "Invalid PZN Data"); + return ZINT_ERROR_INVALID_DATA; + } + error_number = c39(symbol, (unsigned char *) localstr, strlen(localstr)); + ustrcpy(symbol->text, (unsigned char *) "PZN"); + uconcat(symbol->text, (unsigned char *) localstr); + return error_number; } +/* Extended Code 39 - ISO/IEC 16388:2007 Annex A */ +int ec39(struct zint_symbol *symbol, unsigned char source[], int length) { -/* ************** EXTENDED CODE 39 *************** */ + unsigned char buffer[150] = {0}; + unsigned int i; + int error_number; -int ec39(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Extended Code 39 - ISO/IEC 16388:2007 Annex A */ + error_number = 0; - unsigned char buffer[150] = { 0 }; - unsigned int i; - int error_number; + if (length > 74) { + strcpy(symbol->errtxt, "Input too long"); + return ZINT_ERROR_TOO_LONG; + } - error_number = 0; + /* Creates a buffer string and places control characters into it */ + for (i = 0; i < length; i++) { + if (source[i] > 127) { + /* Cannot encode extended ASCII */ + strcpy(symbol->errtxt, "Invalid characters in input data"); + return ZINT_ERROR_INVALID_DATA; + } + concat((char*) buffer, EC39Ctrl[source[i]]); + } - if(length > 74) { - strcpy(symbol->errtxt, "Input too long"); - return ZINT_ERROR_TOO_LONG; - } + /* Then sends the buffer to the C39 function */ + error_number = c39(symbol, buffer, ustrlen(buffer)); - /* Creates a buffer string and places control characters into it */ - for(i = 0; i < length; i++) { - if(source[i] > 127) { - /* Cannot encode extended ASCII */ - strcpy(symbol->errtxt, "Invalid characters in input data"); - return ZINT_ERROR_INVALID_DATA; - } - concat((char*)buffer, EC39Ctrl[source[i]]); - } + for (i = 0; i < length; i++) + symbol->text[i] = source[i] ? source[i] : ' '; + symbol->text[length] = '\0'; - /* Then sends the buffer to the C39 function */ - error_number = c39(symbol, buffer, ustrlen(buffer)); - - for(i = 0; i < length; i++) - symbol->text[i] = source[i] ? source[i] : ' '; - symbol->text[length] = '\0'; - - return error_number; + return error_number; } -/* ******************** CODE 93 ******************* */ +/* Code 93 is an advancement on Code 39 and the definition is a lot tighter */ +int c93(struct zint_symbol *symbol, unsigned char source[], int length) { -int c93(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Code 93 is an advancement on Code 39 and the definition is a lot tighter */ + /* SILVER includes the extra characters a, b, c and d to represent Code 93 specific + shift characters 1, 2, 3 and 4 respectively. These characters are never used by + c39() and ec39() */ - /* SILVER includes the extra characters a, b, c and d to represent Code 93 specific - shift characters 1, 2, 3 and 4 respectively. These characters are never used by - c39() and ec39() */ + int i; + int h, weight, c, k, values[128], error_number; + char buffer[220]; + char dest[670]; + char set_copy[] = SILVER; - int i; - int h, weight, c, k, values[128], error_number; - char buffer[220]; - char dest[670]; - char set_copy[] = SILVER; - - error_number = 0; + error_number = 0; strcpy(buffer, ""); - if(length > 107) { - strcpy(symbol->errtxt, "Input too long"); - return ZINT_ERROR_TOO_LONG; - } + if (length > 107) { + strcpy(symbol->errtxt, "Input too long"); + return ZINT_ERROR_TOO_LONG; + } - /* Message Content */ - for (i = 0; i < length; i++) { - if (source[i] > 127) { - /* Cannot encode extended ASCII */ - strcpy(symbol->errtxt, "Invalid characters in input data"); - return ZINT_ERROR_INVALID_DATA; - } - concat(buffer, C93Ctrl[source[i]]); - symbol->text[i] = source[i] ? source[i] : ' '; - } + /* Message Content */ + for (i = 0; i < length; i++) { + if (source[i] > 127) { + /* Cannot encode extended ASCII */ + strcpy(symbol->errtxt, "Invalid characters in input data"); + return ZINT_ERROR_INVALID_DATA; + } + concat(buffer, C93Ctrl[source[i]]); + symbol->text[i] = source[i] ? source[i] : ' '; + } - /* Now we can check the true length of the barcode */ - h = strlen(buffer); - if (h > 107) { - strcpy(symbol->errtxt, "Input too long"); - return ZINT_ERROR_TOO_LONG; - } + /* Now we can check the true length of the barcode */ + h = strlen(buffer); + if (h > 107) { + strcpy(symbol->errtxt, "Input too long"); + return ZINT_ERROR_TOO_LONG; + } - for (i = 0; i < h; i++) { - values[i] = posn(SILVER, buffer[i]); - } + for (i = 0; i < h; i++) { + values[i] = posn(SILVER, buffer[i]); + } - /* Putting the data into dest[] is not done until after check digits are calculated */ + /* Putting the data into dest[] is not done until after check digits are calculated */ - /* Check digit C */ - c = 0; - weight = 1; - for (i = h - 1; i >= 0; i--) { - c += values[i] * weight; - weight++; - if (weight == 21) - weight = 1; - } - c = c % 47; - values[h] = c; - buffer[h] = set_copy[c]; + /* Check digit C */ + c = 0; + weight = 1; + for (i = h - 1; i >= 0; i--) { + c += values[i] * weight; + weight++; + if (weight == 21) + weight = 1; + } + c = c % 47; + values[h] = c; + buffer[h] = set_copy[c]; - /* Check digit K */ - k = 0; - weight = 1; - for (i = h; i >= 0; i--) { - k += values[i] * weight; - weight++; - if(weight == 16) - weight = 1; - } - k = k % 47; - buffer[++h] = set_copy[k]; - buffer[++h] = '\0'; + /* Check digit K */ + k = 0; + weight = 1; + for (i = h; i >= 0; i--) { + k += values[i] * weight; + weight++; + if (weight == 16) + weight = 1; + } + k = k % 47; + buffer[++h] = set_copy[k]; + buffer[++h] = '\0'; - /* Start character */ - strcpy(dest, "111141"); + /* Start character */ + strcpy(dest, "111141"); - for(i = 0; i < h; i++) { - lookup(SILVER, C93Table, buffer[i], dest); - } + for (i = 0; i < h; i++) { + lookup(SILVER, C93Table, buffer[i], dest); + } - /* Stop character */ - concat(dest, "1111411"); - expand(symbol, dest); + /* Stop character */ + concat(dest, "1111411"); + expand(symbol, dest); - symbol->text[length] = set_copy[c]; - symbol->text[length + 1] = set_copy[k]; - symbol->text[length + 2] = '\0'; + symbol->text[length] = set_copy[c]; + symbol->text[length + 1] = set_copy[k]; + symbol->text[length + 2] = '\0'; - return error_number; + return error_number; } /* NextS() and NextB() are from ANSI/AIM BC12-1998 and are Copyright (c) AIM 1997 */ + /* Their are used here on the understanding that they form part of the specification for Channel Code and therefore their use is permitted under the following terms set out in that document: @@ -455,99 +472,127 @@ int c93(struct zint_symbol *symbol, unsigned char source[], int length) assume no liability for the use of this document." */ void CheckCharacter() { - int i; - char part[3]; + int i; + char part[3]; - if(value == target_value) { - /* Target reached - save the generated pattern */ - strcpy(pattern, "11110"); - for(i = 0; i < 11; i++) { - part[0] = itoc(S[i]); - part[1] = itoc(B[i]); - part[2] = '\0'; - concat(pattern, part); - } - } + if (value == target_value) { + /* Target reached - save the generated pattern */ + strcpy(pattern, "11110"); + for (i = 0; i < 11; i++) { + part[0] = itoc(S[i]); + part[1] = itoc(B[i]); + part[2] = '\0'; + concat(pattern, part); + } + } } void NextB(int Chan, int i, int MaxB, int MaxS) { - int b; + int b; - b = (S[i]+B[i-1]+S[i-1]+B[i-2] > 4)? 1:2; - if (i < Chan+2) { - for (; b <= MaxB; b++) { - B[i] = b; - NextS(Chan,i+1,MaxS,MaxB+1-b); - } - } else if (b <= MaxB) { - B[i] = MaxB; - CheckCharacter(); - value++; - } + b = (S[i] + B[i - 1] + S[i - 1] + B[i - 2] > 4) ? 1 : 2; + if (i < Chan + 2) { + for (; b <= MaxB; b++) { + B[i] = b; + NextS(Chan, i + 1, MaxS, MaxB + 1 - b); + } + } else if (b <= MaxB) { + B[i] = MaxB; + CheckCharacter(); + value++; + } } void NextS(int Chan, int i, int MaxS, int MaxB) { - int s; + int s; - for (s = (i 7) { + strcpy(symbol->errtxt, "Input too long"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Invalid characters in data"); + return error_number; + } - if(length > 7) { - strcpy(symbol->errtxt, "Input too long"); - return ZINT_ERROR_TOO_LONG; - } - error_number = is_sane(NEON, source, length); - if(error_number == ZINT_ERROR_INVALID_DATA) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } + if ((symbol->option_2 < 3) || (symbol->option_2 > 8)) { + channels = 0; + } else { + channels = symbol->option_2; + } + if (channels == 0) { + channels = length + 1; + } + if (channels == 2) { + channels = 3; + } - if((symbol->option_2 < 3) || (symbol->option_2 > 8)) { channels = 0; } else { channels = symbol->option_2; } - if(channels == 0) { channels = length + 1; } - if(channels == 2) { channels = 3; } + for (i = 0; i < length; i++) { + target_value *= 10; + target_value += ctoi((char) source[i]); + } - for(i = 0; i < length; i++) { - target_value *= 10; - target_value += ctoi((char) source[i]); - } + switch (channels) { + case 3: if (target_value > 26) { + range = 1; + } + break; + case 4: if (target_value > 292) { + range = 1; + } + break; + case 5: if (target_value > 3493) { + range = 1; + } + break; + case 6: if (target_value > 44072) { + range = 1; + } + break; + case 7: if (target_value > 576688) { + range = 1; + } + break; + case 8: if (target_value > 7742862) { + range = 1; + } + break; + } + if (range) { + strcpy(symbol->errtxt, "Value out of range"); + return ZINT_ERROR_INVALID_DATA; + } - switch(channels) { - case 3: if(target_value > 26) { range = 1; } break; - case 4: if(target_value > 292) { range = 1; } break; - case 5: if(target_value > 3493) { range = 1; } break; - case 6: if(target_value > 44072) { range = 1; } break; - case 7: if(target_value > 576688) { range = 1; } break; - case 8: if(target_value > 7742862) { range = 1; } break; - } - if(range) { - strcpy(symbol->errtxt, "Value out of range"); - return ZINT_ERROR_INVALID_DATA; - } + for (i = 0; i < 11; i++) { + B[i] = 0; + S[i] = 0; + } - for(i = 0; i < 11; i++) { B[i] = 0; S[i] = 0; } + B[0] = S[1] = B[1] = S[2] = B[2] = 1; + value = 0; + NextS(channels, 3, channels, channels); - B[0] = S[1] = B[1] = S[2] = B[2] = 1; - value = 0; - NextS(channels,3,channels,channels); + zeroes = channels - 1 - length; + memset(hrt, '0', zeroes); + strcpy(hrt + zeroes, (char *) source); + ustrcpy(symbol->text, (unsigned char *) hrt); - zeroes = channels - 1 - length; - memset(hrt, '0', zeroes); - strcpy(hrt + zeroes, (char *)source); - ustrcpy(symbol->text, (unsigned char *)hrt); + expand(symbol, pattern); - expand(symbol, pattern); - - return error_number; + return error_number; } diff --git a/backend/code1.c b/backend/code1.c index 64e87ba2..57072c81 100644 --- a/backend/code1.c +++ b/backend/code1.c @@ -2,7 +2,7 @@ /* libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart + Copyright (C) 2009-2016 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -28,7 +28,7 @@ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + */ #include "common.h" #include "code1.h" @@ -42,1485 +42,1861 @@ #include #endif -void horiz(struct zint_symbol *symbol, int row_no, int full) -{ - int i; - - if(full) { - for(i = 0; i < symbol->width; i++) { - set_module(symbol, row_no, i); - } - } else { - for(i = 1; i < symbol->width - 1; i++) { - set_module(symbol, row_no, i); - } - } +void horiz(struct zint_symbol *symbol, int row_no, int full) { + int i; + + if (full) { + for (i = 0; i < symbol->width; i++) { + set_module(symbol, row_no, i); + } + } else { + for (i = 1; i < symbol->width - 1; i++) { + set_module(symbol, row_no, i); + } + } } -void central_finder(struct zint_symbol *symbol, int start_row, int row_count, int full_rows) -{ - int i; +void central_finder(struct zint_symbol *symbol, int start_row, int row_count, int full_rows) { + int i; - for(i = 0; i < row_count; i++) { - if(i < full_rows) { - horiz(symbol, start_row + (i * 2), 1); - } else { - horiz(symbol, start_row + (i * 2), 0); - if(i != row_count - 1) { - set_module(symbol, start_row + (i * 2) + 1, 1); - set_module(symbol, start_row + (i * 2) + 1, symbol->width - 2); - } - } - } + for (i = 0; i < row_count; i++) { + if (i < full_rows) { + horiz(symbol, start_row + (i * 2), 1); + } else { + horiz(symbol, start_row + (i * 2), 0); + if (i != row_count - 1) { + set_module(symbol, start_row + (i * 2) + 1, 1); + set_module(symbol, start_row + (i * 2) + 1, symbol->width - 2); + } + } + } } -void vert(struct zint_symbol *symbol, int column, int height, int top) -{ - int i; - - if(top) { - for (i = 0; i < height; i++) { - set_module(symbol, i, column); - } - } else { - for (i = 0; i < height; i++) { - set_module(symbol, symbol->rows - i - 1, column); - } - } +void vert(struct zint_symbol *symbol, int column, int height, int top) { + int i; + + if (top) { + for (i = 0; i < height; i++) { + set_module(symbol, i, column); + } + } else { + for (i = 0; i < height; i++) { + set_module(symbol, symbol->rows - i - 1, column); + } + } } -void spigot(struct zint_symbol *symbol, int row_no) -{ - int i; - - for(i = symbol->width - 1; i > 0; i--) { - if(module_is_set(symbol, row_no, i - 1)) { - set_module(symbol, row_no, i); - } - } +void spigot(struct zint_symbol *symbol, int row_no) { + int i; + + for (i = symbol->width - 1; i > 0; i--) { + if (module_is_set(symbol, row_no, i - 1)) { + set_module(symbol, row_no, i); + } + } } -int isedi(unsigned char input) -{ - int result = 0; - - if(input == 13) { result = 1; } - if(input == '*') { result = 1; } - if(input == '>') { result = 1; } - if(input == ' ') { result = 1; } - if((input >= '0') && (input <= '9')) { result = 1; } - if((input >= 'A') && (input <= 'Z')) { result = 1; } - - return result; +int isedi(unsigned char input) { + int result = 0; + + if (input == 13) { + result = 1; + } + if (input == '*') { + result = 1; + } + if (input == '>') { + result = 1; + } + if (input == ' ') { + result = 1; + } + if ((input >= '0') && (input <= '9')) { + result = 1; + } + if ((input >= 'A') && (input <= 'Z')) { + result = 1; + } + + return result; } -int dq4bi(unsigned char source[], int sourcelen, int position) -{ - int i; +int dq4bi(unsigned char source[], int sourcelen, int position) { + int i; - for(i = position; isedi(source[position + i]) && ((position + i) < sourcelen); i++); + for (i = position; isedi(source[position + i]) && ((position + i) < sourcelen); i++); - if((position + i) == sourcelen) { - /* Reached end of input */ - return 0; - } + if ((position + i) == sourcelen) { + /* Reached end of input */ + return 0; + } - if (source[position + i - 1] == 13) { return 1; } - if (source[position + i - 1] == '*') { return 1; } - if (source[position + i - 1] == '>') { return 1; } + if (source[position + i - 1] == 13) { + return 1; + } + if (source[position + i - 1] == '*') { + return 1; + } + if (source[position + i - 1] == '>') { + return 1; + } - return 0; + return 0; } -int c1_look_ahead_test(unsigned char source[], int sourcelen, int position, int current_mode, int gs1) -{ - float ascii_count, c40_count, text_count, edi_count, byte_count; - char reduced_char; - int done, best_scheme, best_count, sp; +int c1_look_ahead_test(unsigned char source[], int sourcelen, int position, int current_mode, int gs1) { + float ascii_count, c40_count, text_count, edi_count, byte_count; + char reduced_char; + int done, best_scheme, best_count, sp; - /* Step J */ - if(current_mode == C1_ASCII) { - ascii_count = 0.0; - c40_count = 1.0; - text_count = 1.0; - edi_count = 1.0; - byte_count = 2.0; - } else { - ascii_count = 1.0; - c40_count = 2.0; - text_count = 2.0; - edi_count = 2.0; - byte_count = 3.0; - } + /* Step J */ + if (current_mode == C1_ASCII) { + ascii_count = 0.0; + c40_count = 1.0; + text_count = 1.0; + edi_count = 1.0; + byte_count = 2.0; + } else { + ascii_count = 1.0; + c40_count = 2.0; + text_count = 2.0; + edi_count = 2.0; + byte_count = 3.0; + } - switch(current_mode) { - case C1_C40: c40_count = 0.0; break; - case C1_TEXT: text_count = 0.0; break; - case C1_BYTE: byte_count = 0.0; break; - case C1_EDI: edi_count = 0.0; break; - } + switch (current_mode) { + case C1_C40: c40_count = 0.0; + break; + case C1_TEXT: text_count = 0.0; + break; + case C1_BYTE: byte_count = 0.0; + break; + case C1_EDI: edi_count = 0.0; + break; + } - for(sp = position; (sp < sourcelen) && (sp <= (position + 8)); sp++) { + for (sp = position; (sp < sourcelen) && (sp <= (position + 8)); sp++) { - if(source[sp] <= 127) { reduced_char = source[sp]; } else { reduced_char = source[sp] - 127; } + if (source[sp] <= 127) { + reduced_char = source[sp]; + } else { + reduced_char = source[sp] - 127; + } - /* Step L */ - if((source[sp] >= '0') && (source[sp] <= '9')) { - ascii_count += 0.5; - } else { - ascii_count = froundup(ascii_count); - if(source[sp] > 127) { - ascii_count += 2.0; - } else { - ascii_count += 1.0; - } - } + /* Step L */ + if ((source[sp] >= '0') && (source[sp] <= '9')) { + ascii_count += 0.5; + } else { + ascii_count = froundup(ascii_count); + if (source[sp] > 127) { + ascii_count += 2.0; + } else { + ascii_count += 1.0; + } + } - /* Step M */ - done = 0; - if(reduced_char == ' ') { c40_count += (2.0 / 3.0); done = 1; } - if((reduced_char >= '0') && (reduced_char <= '9')) { c40_count += (2.0 / 3.0); done = 1; } - if((reduced_char >= 'A') && (reduced_char <= 'Z')) { c40_count += (2.0 / 3.0); done = 1; } - if(source[sp] > 127) { c40_count += (4.0 / 3.0); } - if(done == 0) { c40_count += (4.0 / 3.0); } + /* Step M */ + done = 0; + if (reduced_char == ' ') { + c40_count += (2.0 / 3.0); + done = 1; + } + if ((reduced_char >= '0') && (reduced_char <= '9')) { + c40_count += (2.0 / 3.0); + done = 1; + } + if ((reduced_char >= 'A') && (reduced_char <= 'Z')) { + c40_count += (2.0 / 3.0); + done = 1; + } + if (source[sp] > 127) { + c40_count += (4.0 / 3.0); + } + if (done == 0) { + c40_count += (4.0 / 3.0); + } - /* Step N */ - done = 0; - if(reduced_char == ' ') { text_count += (2.0 / 3.0); done = 1; } - if((reduced_char >= '0') && (reduced_char <= '9')) { text_count += (2.0 / 3.0); done = 1; } - if((reduced_char >= 'a') && (reduced_char <= 'z')) { text_count += (2.0 / 3.0); done = 1; } - if(source[sp] > 127) { text_count += (4.0 / 3.0); } - if(done == 0) { text_count += (4.0 / 3.0); } + /* Step N */ + done = 0; + if (reduced_char == ' ') { + text_count += (2.0 / 3.0); + done = 1; + } + if ((reduced_char >= '0') && (reduced_char <= '9')) { + text_count += (2.0 / 3.0); + done = 1; + } + if ((reduced_char >= 'a') && (reduced_char <= 'z')) { + text_count += (2.0 / 3.0); + done = 1; + } + if (source[sp] > 127) { + text_count += (4.0 / 3.0); + } + if (done == 0) { + text_count += (4.0 / 3.0); + } - /* Step O */ - done = 0; - if(source[sp] == 13) { edi_count += (2.0 / 3.0); done = 1; } - if(source[sp] == '*') { edi_count += (2.0 / 3.0); done = 1; } - if(source[sp] == '>') { edi_count += (2.0 / 3.0); done = 1; } - if(source[sp] == ' ') { edi_count += (2.0 / 3.0); done = 1; } - if((source[sp] >= '0') && (source[sp] <= '9')) { edi_count += (2.0 / 3.0); done = 1; } - if((source[sp] >= 'A') && (source[sp] <= 'Z')) { edi_count += (2.0 / 3.0); done = 1; } - if(source[sp] > 127) { - edi_count += (13.0 / 3.0); - } else { - if(done == 0) { - edi_count += (10.0 / 3.0); - } - } + /* Step O */ + done = 0; + if (source[sp] == 13) { + edi_count += (2.0 / 3.0); + done = 1; + } + if (source[sp] == '*') { + edi_count += (2.0 / 3.0); + done = 1; + } + if (source[sp] == '>') { + edi_count += (2.0 / 3.0); + done = 1; + } + if (source[sp] == ' ') { + edi_count += (2.0 / 3.0); + done = 1; + } + if ((source[sp] >= '0') && (source[sp] <= '9')) { + edi_count += (2.0 / 3.0); + done = 1; + } + if ((source[sp] >= 'A') && (source[sp] <= 'Z')) { + edi_count += (2.0 / 3.0); + done = 1; + } + if (source[sp] > 127) { + edi_count += (13.0 / 3.0); + } else { + if (done == 0) { + edi_count += (10.0 / 3.0); + } + } - /* Step P */ - if(gs1 && (source[sp] == '[')) { byte_count += 3.0; } else { byte_count += 1.0; } + /* Step P */ + if (gs1 && (source[sp] == '[')) { + byte_count += 3.0; + } else { + byte_count += 1.0; + } - } + } - ascii_count = froundup(ascii_count); - c40_count = froundup(c40_count); - text_count = froundup(text_count); - edi_count = froundup(edi_count); - byte_count = froundup(byte_count); - best_scheme = C1_ASCII; + ascii_count = froundup(ascii_count); + c40_count = froundup(c40_count); + text_count = froundup(text_count); + edi_count = froundup(edi_count); + byte_count = froundup(byte_count); + best_scheme = C1_ASCII; - if(sp == sourcelen) { - /* Step K */ - best_count = edi_count; + if (sp == sourcelen) { + /* Step K */ + best_count = edi_count; - if(text_count <= best_count) { - best_count = text_count; - best_scheme = C1_TEXT; - } + if (text_count <= best_count) { + best_count = text_count; + best_scheme = C1_TEXT; + } - if(c40_count <= best_count) { - best_count = c40_count; - best_scheme = C1_C40; - } + if (c40_count <= best_count) { + best_count = c40_count; + best_scheme = C1_C40; + } - if(ascii_count <= best_count) { - best_count = ascii_count; - best_scheme = C1_ASCII; - } + if (ascii_count <= best_count) { + best_count = ascii_count; + best_scheme = C1_ASCII; + } - if(byte_count <= best_count) { - best_count = byte_count; - best_scheme = C1_BYTE; - } - } else { - /* Step Q */ + if (byte_count <= best_count) { + best_count = byte_count; + best_scheme = C1_BYTE; + } + } else { + /* Step Q */ - if(((edi_count + 1.0 <= ascii_count) && (edi_count + 1.0 <= c40_count)) && - ((edi_count + 1.0 <= byte_count) && (edi_count + 1.0 <= text_count))) { - best_scheme = C1_EDI; - } + if (((edi_count + 1.0 <= ascii_count) && (edi_count + 1.0 <= c40_count)) && + ((edi_count + 1.0 <= byte_count) && (edi_count + 1.0 <= text_count))) { + best_scheme = C1_EDI; + } - if((c40_count + 1.0 <= ascii_count) && (c40_count + 1.0 <= text_count)) { + if ((c40_count + 1.0 <= ascii_count) && (c40_count + 1.0 <= text_count)) { - if(c40_count < edi_count) { - best_scheme = C1_C40; - } else { - done = 0; - if(c40_count == edi_count) { - if(dq4bi(source, sourcelen, position)) { - best_scheme = C1_EDI; - } else { - best_scheme = C1_C40; - } - } - } - } + if (c40_count < edi_count) { + best_scheme = C1_C40; + } else { + done = 0; + if (c40_count == edi_count) { + if (dq4bi(source, sourcelen, position)) { + best_scheme = C1_EDI; + } else { + best_scheme = C1_C40; + } + } + } + } - if(((text_count + 1.0 <= ascii_count) && (text_count + 1.0 <= c40_count)) && - ((text_count + 1.0 <= byte_count) && (text_count + 1.0 <= edi_count))) { - best_scheme = C1_TEXT; - } + if (((text_count + 1.0 <= ascii_count) && (text_count + 1.0 <= c40_count)) && + ((text_count + 1.0 <= byte_count) && (text_count + 1.0 <= edi_count))) { + best_scheme = C1_TEXT; + } - if(((ascii_count + 1.0 <= byte_count) && (ascii_count + 1.0 <= c40_count)) && - ((ascii_count + 1.0 <= text_count) && (ascii_count + 1.0 <= edi_count))) { - best_scheme = C1_ASCII; - } + if (((ascii_count + 1.0 <= byte_count) && (ascii_count + 1.0 <= c40_count)) && + ((ascii_count + 1.0 <= text_count) && (ascii_count + 1.0 <= edi_count))) { + best_scheme = C1_ASCII; + } - if(((byte_count + 1.0 <= ascii_count) && (byte_count + 1.0 <= c40_count)) && - ((byte_count + 1.0 <= text_count) && (byte_count + 1.0 <= edi_count))) { - best_scheme = C1_BYTE; - } - } - - //printf("\n> scores: ASCII %.2f C40 %.2f TEXT %.2f EDI %.2f BYTE %.2f\n", ascii_count, c40_count, text_count, edi_count, byte_count); - - return best_scheme; + if (((byte_count + 1.0 <= ascii_count) && (byte_count + 1.0 <= c40_count)) && + ((byte_count + 1.0 <= text_count) && (byte_count + 1.0 <= edi_count))) { + best_scheme = C1_BYTE; + } + } + + return best_scheme; } -int c1_encode(struct zint_symbol *symbol, unsigned char source[], unsigned int target[], int length) -{ - int current_mode, next_mode; - int sp, tp, gs1, i, j, latch; - int c40_buffer[6], c40_p; - int text_buffer[6], text_p; - int edi_buffer[6], edi_p; - char decimal_binary[40]; - int byte_start = 0; +int c1_encode(struct zint_symbol *symbol, unsigned char source[], unsigned int target[], int length) { + int current_mode, next_mode; + int sp, tp, gs1, i, j, latch; + int c40_buffer[6], c40_p; + int text_buffer[6], text_p; + int edi_buffer[6], edi_p; + char decimal_binary[40]; + int byte_start = 0; - sp = 0; - tp = 0; - latch = 0; - memset(c40_buffer, 0, 6); - c40_p = 0; - memset(text_buffer, 0, 6); - text_p = 0; - memset(edi_buffer, 0, 6); - edi_p = 0; - strcpy(decimal_binary, ""); + sp = 0; + tp = 0; + latch = 0; + memset(c40_buffer, 0, 6); + c40_p = 0; + memset(text_buffer, 0, 6); + text_p = 0; + memset(edi_buffer, 0, 6); + edi_p = 0; + strcpy(decimal_binary, ""); - if(symbol->input_mode == GS1_MODE) { gs1 = 1; } else { gs1 = 0; } - if(gs1) { target[tp] = 232; tp++; } /* FNC1 */ + if (symbol->input_mode == GS1_MODE) { + gs1 = 1; + } else { + gs1 = 0; + } + if (gs1) { + /* FNC1 */ + target[tp] = 232; + tp++; + } - /* Step A */ - current_mode = C1_ASCII; - next_mode = C1_ASCII; + /* Step A */ + current_mode = C1_ASCII; + next_mode = C1_ASCII; - do { - if(current_mode != next_mode) { - /* Change mode */ - switch(next_mode) { - case C1_C40: target[tp] = 230; tp++; break; - case C1_TEXT: target[tp] = 239; tp++; break; - case C1_EDI: target[tp] = 238; tp++; break; - case C1_BYTE: target[tp] = 231; tp++; break; - } - } - - if((current_mode != C1_BYTE) && (next_mode == C1_BYTE)) { byte_start = tp; } - current_mode = next_mode; + do { + if (current_mode != next_mode) { + /* Change mode */ + switch (next_mode) { + case C1_C40: target[tp] = 230; + tp++; + break; + case C1_TEXT: target[tp] = 239; + tp++; + break; + case C1_EDI: target[tp] = 238; + tp++; + break; + case C1_BYTE: target[tp] = 231; + tp++; + break; + } + } - if(current_mode == C1_ASCII) { /* Step B - ASCII encodation */ - next_mode = C1_ASCII; - - if((length - sp) >= 21) { /* Step B1 */ - j = 0; - - for(i = 0; i < 21; i++) { - if((source[sp + i] >= '0') && (source[sp + i] <= '9')) { j++; } - } - - if (j == 21) { - next_mode = C1_DECIMAL; - strcpy(decimal_binary, "1111"); - } - } - - if((next_mode == C1_ASCII) && ((length - sp) >= 13)) { /* Step B2 */ - j = 0; - - for(i = 0; i < 13; i++) { - if((source[sp + i] >= '0') && (source[sp + i] <= '9')) { j++; } - } + if ((current_mode != C1_BYTE) && (next_mode == C1_BYTE)) { + byte_start = tp; + } + current_mode = next_mode; - if (j == 13) { - latch = 0; - for(i = sp + 13; i < length; i++) { - if(!((source[sp + i] >= '0') && (source[sp + i] <= '9'))) { latch = 1; } - } - - if(!(latch)) { - next_mode = C1_DECIMAL; - strcpy(decimal_binary, "1111"); - } - } - } + if (current_mode == C1_ASCII) { + /* Step B - ASCII encodation */ + next_mode = C1_ASCII; - if(next_mode == C1_ASCII) { /* Step B3 */ - if(istwodigits(source, sp) && ((sp + 1) != length)) { - target[tp] = (10 * ctoi(source[sp])) + ctoi(source[sp + 1]) + 130; - tp++; - sp += 2; - } else { - if((gs1) && (source[sp] == '[')) { - if((length - sp) >= 15) { /* Step B4 */ - j = 0; - - for(i = 0; i < 15; i++) { - if((source[sp + i] >= '0') && (source[sp + i] <= '9')) { j++; } - } - - if (j == 15) { - target[tp] = 236; /* FNC1 and change to Decimal */ - tp++; sp++; - next_mode = C1_DECIMAL; - } - } - - if((length - sp) >= 7) { /* Step B5 */ - j = 0; - - for(i = 0; i < 7; i++) { - if((source[sp + i] >= '0') && (source[sp + i] <= '9')) { j++; } - } + if ((length - sp) >= 21) { + /* Step B1 */ + j = 0; - if (j == 7) { - latch = 0; - for(i = sp + 7; i < length; i++) { - if(!((source[sp + i] >= '0') && (source[sp + i] <= '9'))) { latch = 1; } - } - - if(!(latch)) { - target[tp] = 236; /* FNC1 and change to Decimal */ - tp++; sp++; - next_mode = C1_DECIMAL; - } - } - } - } - - if(next_mode == C1_ASCII) { - - /* Step B6 */ - next_mode = c1_look_ahead_test(source, length, sp, current_mode, gs1); + for (i = 0; i < 21; i++) { + if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) { + j++; + } + } - if(next_mode == C1_ASCII) { - if(source[sp] > 127) { - /* Step B7 */ - target[tp] = 235; tp++; /* FNC4 */ - target[tp] = (source[sp] - 128) + 1; tp++; sp++; - } else { - /* Step B8 */ - if((gs1) && (source[sp] == '[')) { - target[tp] = 232; tp++; sp++; /* FNC1 */ - } else { - target[tp] = source[sp] + 1; tp++; sp++; - } - } - } - } - } - } - } + if (j == 21) { + next_mode = C1_DECIMAL; + strcpy(decimal_binary, "1111"); + } + } - if(current_mode == C1_C40) { /* Step C - C40 encodation */ - int shift_set, value, done = 0, latch = 0; + if ((next_mode == C1_ASCII) && ((length - sp) >= 13)) { + /* Step B2 */ + j = 0; - next_mode = C1_C40; - if(c40_p == 0) { - if((length - sp) >= 12) { - j = 0; - - for(i = 0; i < 12; i++) { - if((source[sp + i] >= '0') && (source[sp + i] <= '9')) { j++; } - } - - if (j == 12) { - next_mode = C1_ASCII; done = 1; - } - } - - if((length - sp) >= 8) { - j = 0; - - for(i = 0; i < 8; i++) { - if((source[sp + i] >= '0') && (source[sp + i] <= '9')) { j++; } - } - - if((length - sp) == 8) { - latch = 1; - } else { - latch = 1; - for(j = sp + 8; j < length; j++) { - if((source[j] <= '0') || (source[j] >= '9')) { latch = 0; } - } - } - - if ((j == 8) && latch) { - next_mode = C1_ASCII; done = 1; - } - } + for (i = 0; i < 13; i++) { + if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) { + j++; + } + } - if(!(done)) { - next_mode = c1_look_ahead_test(source, length, sp, current_mode, gs1); - } - } + if (j == 13) { + latch = 0; + for (i = sp + 13; i < length; i++) { + if (!((source[sp + i] >= '0') && (source[sp + i] <= '9'))) { + latch = 1; + } + } - if(next_mode != C1_C40) { - target[tp] = 255; tp++; /* Unlatch */ - } else { - if(source[sp] > 127) { - c40_buffer[c40_p] = 1; c40_p++; - c40_buffer[c40_p] = 30; c40_p++; /* Upper Shift */ - shift_set = c40_shift[source[sp] - 128]; - value = c40_value[source[sp] - 128]; - } else { - shift_set = c40_shift[source[sp]]; - value = c40_value[source[sp]]; - } + if (!(latch)) { + next_mode = C1_DECIMAL; + strcpy(decimal_binary, "1111"); + } + } + } - if(gs1 && (source[sp] == '[')) { - shift_set = 2; - value = 27; /* FNC1 */ - } + if (next_mode == C1_ASCII) { /* Step B3 */ + if (istwodigits(source, sp) && ((sp + 1) != length)) { + target[tp] = (10 * ctoi(source[sp])) + ctoi(source[sp + 1]) + 130; + tp++; + sp += 2; + } else { + if ((gs1) && (source[sp] == '[')) { + if ((length - sp) >= 15) { + /* Step B4 */ + j = 0; - if(shift_set != 0) { - c40_buffer[c40_p] = shift_set - 1; c40_p++; - } - c40_buffer[c40_p] = value; c40_p++; + for (i = 0; i < 15; i++) { + if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) { + j++; + } + } - if(c40_p >= 3) { - int iv; + if (j == 15) { + target[tp] = 236; /* FNC1 and change to Decimal */ + tp++; + sp++; + next_mode = C1_DECIMAL; + } + } - iv = (1600 * c40_buffer[0]) + (40 * c40_buffer[1]) + (c40_buffer[2]) + 1; - target[tp] = iv / 256; tp++; - target[tp] = iv % 256; tp++; + if ((length - sp) >= 7) { /* Step B5 */ + j = 0; - c40_buffer[0] = c40_buffer[3]; - c40_buffer[1] = c40_buffer[4]; - c40_buffer[2] = c40_buffer[5]; - c40_buffer[3] = 0; - c40_buffer[4] = 0; - c40_buffer[5] = 0; - c40_p -= 3; - } - sp++; - } - } + for (i = 0; i < 7; i++) { + if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) { + j++; + } + } - if(current_mode == C1_TEXT) { /* Step D - Text encodation */ - int shift_set, value, done = 0, latch = 0; + if (j == 7) { + latch = 0; + for (i = sp + 7; i < length; i++) { + if (!((source[sp + i] >= '0') && (source[sp + i] <= '9'))) { + latch = 1; + } + } - next_mode = C1_TEXT; - if(text_p == 0) { - if((length - sp) >= 12) { - j = 0; - - for(i = 0; i < 12; i++) { - if((source[sp + i] >= '0') && (source[sp + i] <= '9')) { j++; } - } - - if (j == 12) { - next_mode = C1_ASCII; done = 1; - } - } - - if((length - sp) >= 8) { - j = 0; - - for(i = 0; i < 8; i++) { - if((source[sp + i] >= '0') && (source[sp + i] <= '9')) { j++; } - } - - if((length - sp) == 8) { - latch = 1; - } else { - latch = 1; - for(j = sp + 8; j < length; j++) { - if((source[j] <= '0') || (source[j] >= '9')) { latch = 0; } - } - } - - if ((j == 8) && latch) { - next_mode = C1_ASCII; done = 1; - } - } + if (!(latch)) { + target[tp] = 236; /* FNC1 and change to Decimal */ + tp++; + sp++; + next_mode = C1_DECIMAL; + } + } + } + } - if(!(done)) { - next_mode = c1_look_ahead_test(source, length, sp, current_mode, gs1); - } - } + if (next_mode == C1_ASCII) { - if(next_mode != C1_TEXT) { - target[tp] = 255; tp++; /* Unlatch */ - } else { - if(source[sp] > 127) { - text_buffer[text_p] = 1; text_p++; - text_buffer[text_p] = 30; text_p++; /* Upper Shift */ - shift_set = text_shift[source[sp] - 128]; - value = text_value[source[sp] - 128]; - } else { - shift_set = text_shift[source[sp]]; - value = text_value[source[sp]]; - } + /* Step B6 */ + next_mode = c1_look_ahead_test(source, length, sp, current_mode, gs1); - if(gs1 && (source[sp] == '[')) { - shift_set = 2; - value = 27; /* FNC1 */ - } + if (next_mode == C1_ASCII) { + if (source[sp] > 127) { + /* Step B7 */ + target[tp] = 235; /* FNC4 */ + tp++; + target[tp] = (source[sp] - 128) + 1; + tp++; + sp++; + } else { + /* Step B8 */ + if ((gs1) && (source[sp] == '[')) { + target[tp] = 232; /* FNC1 */ + tp++; + sp++; + } else { + target[tp] = source[sp] + 1; + tp++; + sp++; + } + } + } + } + } + } + } - if(shift_set != 0) { - text_buffer[text_p] = shift_set - 1; text_p++; - } - text_buffer[text_p] = value; text_p++; + if (current_mode == C1_C40) { + /* Step C - C40 encodation */ + int shift_set, value, done = 0, latch = 0; - if(text_p >= 3) { - int iv; + next_mode = C1_C40; + if (c40_p == 0) { + if ((length - sp) >= 12) { + j = 0; - iv = (1600 * text_buffer[0]) + (40 * text_buffer[1]) + (text_buffer[2]) + 1; - target[tp] = iv / 256; tp++; - target[tp] = iv % 256; tp++; + for (i = 0; i < 12; i++) { + if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) { + j++; + } + } - text_buffer[0] = text_buffer[3]; - text_buffer[1] = text_buffer[4]; - text_buffer[2] = text_buffer[5]; - text_buffer[3] = 0; - text_buffer[4] = 0; - text_buffer[5] = 0; - text_p -= 3; - } - sp++; - } - } + if (j == 12) { + next_mode = C1_ASCII; + done = 1; + } + } - if(current_mode == C1_EDI) { /* Step E - EDI Encodation */ - int value = 0,latch = 0; - - next_mode = C1_EDI; - if(edi_p == 0) { - if((length - sp) >= 12) { - j = 0; - - for(i = 0; i < 12; i++) { - if((source[sp + i] >= '0') && (source[sp + i] <= '9')) { j++; } - } - - if (j == 12) { - next_mode = C1_ASCII; - } - } - - if((length - sp) >= 8) { - j = 0; - - for(i = 0; i < 8; i++) { - if((source[sp + i] >= '0') && (source[sp + i] <= '9')) { j++; } - } - - if((length - sp) == 8) { - latch = 1; - } else { - latch = 1; - for(j = sp + 8; j < length; j++) { - if((source[j] <= '0') || (source[j] >= '9')) { latch = 0; } - } - } - - if ((j == 8) && latch) { - next_mode = C1_ASCII; - } - } + if ((length - sp) >= 8) { + j = 0; - if(!((isedi(source[sp]) && isedi(source[sp + 1])) && isedi(source[sp + 2]))) { - next_mode = C1_ASCII; - } - } + for (i = 0; i < 8; i++) { + if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) { + j++; + } + } - if(next_mode != C1_EDI) { - target[tp] = 255; tp++; /* Unlatch */ - } else { - if(source[sp] == 13) { value = 0; } - if(source[sp] == '*') { value = 1; } - if(source[sp] == '>') { value = 2; } - if(source[sp] == ' ') { value = 3; } - if((source[sp] >= '0') && (source[sp] <= '9')) { value = source[sp] - '0' + 4; } - if((source[sp] >= 'A') && (source[sp] <= 'Z')) { value = source[sp] - 'A' + 14; } + if ((length - sp) == 8) { + latch = 1; + } else { + latch = 1; + for (j = sp + 8; j < length; j++) { + if ((source[j] <= '0') || (source[j] >= '9')) { + latch = 0; + } + } + } - edi_buffer[edi_p] = value; edi_p++; + if ((j == 8) && latch) { + next_mode = C1_ASCII; + done = 1; + } + } - if(edi_p >= 3) { - int iv; + if (!(done)) { + next_mode = c1_look_ahead_test(source, length, sp, current_mode, gs1); + } + } - iv = (1600 * edi_buffer[0]) + (40 * edi_buffer[1]) + (edi_buffer[2]) + 1; - target[tp] = iv / 256; tp++; - target[tp] = iv % 256; tp++; + if (next_mode != C1_C40) { + target[tp] = 255; /* Unlatch */ + tp++; + } else { + if (source[sp] > 127) { + c40_buffer[c40_p] = 1; + c40_p++; + c40_buffer[c40_p] = 30; /* Upper Shift */ + c40_p++; + shift_set = c40_shift[source[sp] - 128]; + value = c40_value[source[sp] - 128]; + } else { + shift_set = c40_shift[source[sp]]; + value = c40_value[source[sp]]; + } - edi_buffer[0] = edi_buffer[3]; - edi_buffer[1] = edi_buffer[4]; - edi_buffer[2] = edi_buffer[5]; - edi_buffer[3] = 0; - edi_buffer[4] = 0; - edi_buffer[5] = 0; - edi_p -= 3; - } - sp++; - } - } + if (gs1 && (source[sp] == '[')) { + shift_set = 2; + value = 27; /* FNC1 */ + } - if(current_mode == C1_DECIMAL) { /* Step F - Decimal encodation */ - int value, decimal_count, data_left; + if (shift_set != 0) { + c40_buffer[c40_p] = shift_set - 1; + c40_p++; + } + c40_buffer[c40_p] = value; + c40_p++; - next_mode = C1_DECIMAL; + if (c40_p >= 3) { + int iv; - data_left = length - sp; - decimal_count = 0; - - if(data_left >= 1) { - if((source[sp] >= '0') && (source[sp] <= '9')) { decimal_count = 1; } - } - if(data_left >= 2) { - if((decimal_count == 1) && ((source[sp + 1] >= '0') && (source[sp + 1] <= '9'))) { decimal_count = 2; } - } - if(data_left >= 3) { - if((decimal_count == 2) && ((source[sp + 2] >= '0') && (source[sp + 2] <= '9'))) { decimal_count = 3; } - } - - if(decimal_count != 3) { - int bits_left_in_byte, target_count; - int sub_target; - /* Finish Decimal mode and go back to ASCII */ + iv = (1600 * c40_buffer[0]) + (40 * c40_buffer[1]) + (c40_buffer[2]) + 1; + target[tp] = iv / 256; + tp++; + target[tp] = iv % 256; + tp++; - concat(decimal_binary, "111111"); /* Unlatch */ + c40_buffer[0] = c40_buffer[3]; + c40_buffer[1] = c40_buffer[4]; + c40_buffer[2] = c40_buffer[5]; + c40_buffer[3] = 0; + c40_buffer[4] = 0; + c40_buffer[5] = 0; + c40_p -= 3; + } + sp++; + } + } - target_count = 3; - if(strlen(decimal_binary) <= 16) { target_count = 2; } - if(strlen(decimal_binary) <= 8) { target_count = 1; } - bits_left_in_byte = (8 * target_count) - strlen(decimal_binary); - if(bits_left_in_byte == 8) { bits_left_in_byte = 0; } - - if(bits_left_in_byte == 2) { - concat(decimal_binary, "01"); - } - - if((bits_left_in_byte == 4) || (bits_left_in_byte == 6)) { - if(decimal_count >= 1) { - int sub_value = ctoi(source[sp]) + 1; - - if(sub_value & 0x08) { concat(decimal_binary, "1"); } else { concat(decimal_binary, "0"); } - if(sub_value & 0x04) { concat(decimal_binary, "1"); } else { concat(decimal_binary, "0"); } - if(sub_value & 0x02) { concat(decimal_binary, "1"); } else { concat(decimal_binary, "0"); } - if(sub_value & 0x01) { concat(decimal_binary, "1"); } else { concat(decimal_binary, "0"); } - sp++; - } else { - concat(decimal_binary, "1111"); - } - } + if (current_mode == C1_TEXT) { + /* Step D - Text encodation */ + int shift_set, value, done = 0, latch = 0; - if(bits_left_in_byte == 6) { - concat(decimal_binary, "01"); - } + next_mode = C1_TEXT; + if (text_p == 0) { + if ((length - sp) >= 12) { + j = 0; - /* Binary buffer is full - transfer to target */ - if(target_count >= 1) { - sub_target = 0; - if(decimal_binary[0] == '1') { sub_target += 128; } - if(decimal_binary[1] == '1') { sub_target += 64; } - if(decimal_binary[2] == '1') { sub_target += 32; } - if(decimal_binary[3] == '1') { sub_target += 16; } - if(decimal_binary[4] == '1') { sub_target += 8; } - if(decimal_binary[5] == '1') { sub_target += 4; } - if(decimal_binary[6] == '1') { sub_target += 2; } - if(decimal_binary[7] == '1') { sub_target += 1; } - target[tp] = sub_target; tp++; - } - if(target_count >= 2) { - sub_target = 0; - if(decimal_binary[8] == '1') { sub_target += 128; } - if(decimal_binary[9] == '1') { sub_target += 64; } - if(decimal_binary[10] == '1') { sub_target += 32; } - if(decimal_binary[11] == '1') { sub_target += 16; } - if(decimal_binary[12] == '1') { sub_target += 8; } - if(decimal_binary[13] == '1') { sub_target += 4; } - if(decimal_binary[14] == '1') { sub_target += 2; } - if(decimal_binary[15] == '1') { sub_target += 1; } - target[tp] = sub_target; tp++; - } - if(target_count == 3) { - sub_target = 0; - if(decimal_binary[16] == '1') { sub_target += 128; } - if(decimal_binary[17] == '1') { sub_target += 64; } - if(decimal_binary[18] == '1') { sub_target += 32; } - if(decimal_binary[19] == '1') { sub_target += 16; } - if(decimal_binary[20] == '1') { sub_target += 8; } - if(decimal_binary[21] == '1') { sub_target += 4; } - if(decimal_binary[22] == '1') { sub_target += 2; } - if(decimal_binary[23] == '1') { sub_target += 1; } - target[tp] = sub_target; tp++; - } + for (i = 0; i < 12; i++) { + if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) { + j++; + } + } - next_mode = C1_ASCII; - } else { - /* There are three digits - convert the value to binary */ - value = (100 * ctoi(source[sp])) + (10 * ctoi(source[sp + 1])) + ctoi(source[sp + 2]) + 1; - - if(value & 0x200) { concat(decimal_binary, "1"); } else { concat(decimal_binary, "0"); } - if(value & 0x100) { concat(decimal_binary, "1"); } else { concat(decimal_binary, "0"); } - if(value & 0x80) { concat(decimal_binary, "1"); } else { concat(decimal_binary, "0"); } - if(value & 0x40) { concat(decimal_binary, "1"); } else { concat(decimal_binary, "0"); } - if(value & 0x20) { concat(decimal_binary, "1"); } else { concat(decimal_binary, "0"); } - if(value & 0x10) { concat(decimal_binary, "1"); } else { concat(decimal_binary, "0"); } - if(value & 0x08) { concat(decimal_binary, "1"); } else { concat(decimal_binary, "0"); } - if(value & 0x04) { concat(decimal_binary, "1"); } else { concat(decimal_binary, "0"); } - if(value & 0x02) { concat(decimal_binary, "1"); } else { concat(decimal_binary, "0"); } - if(value & 0x01) { concat(decimal_binary, "1"); } else { concat(decimal_binary, "0"); } - - sp+= 3; - } + if (j == 12) { + next_mode = C1_ASCII; + done = 1; + } + } - if(strlen(decimal_binary) >= 24) { - int target1 = 0, target2 = 0, target3 = 0; - char temp_binary[40]; + if ((length - sp) >= 8) { + j = 0; - /* Binary buffer is full - transfer to target */ - if(decimal_binary[0] == '1') { target1 += 128; } - if(decimal_binary[1] == '1') { target1 += 64; } - if(decimal_binary[2] == '1') { target1 += 32; } - if(decimal_binary[3] == '1') { target1 += 16; } - if(decimal_binary[4] == '1') { target1 += 8; } - if(decimal_binary[5] == '1') { target1 += 4; } - if(decimal_binary[6] == '1') { target1 += 2; } - if(decimal_binary[7] == '1') { target1 += 1; } - if(decimal_binary[8] == '1') { target2 += 128; } - if(decimal_binary[9] == '1') { target2 += 64; } - if(decimal_binary[10] == '1') { target2 += 32; } - if(decimal_binary[11] == '1') { target2 += 16; } - if(decimal_binary[12] == '1') { target2 += 8; } - if(decimal_binary[13] == '1') { target2 += 4; } - if(decimal_binary[14] == '1') { target2 += 2; } - if(decimal_binary[15] == '1') { target2 += 1; } - if(decimal_binary[16] == '1') { target3 += 128; } - if(decimal_binary[17] == '1') { target3 += 64; } - if(decimal_binary[18] == '1') { target3 += 32; } - if(decimal_binary[19] == '1') { target3 += 16; } - if(decimal_binary[20] == '1') { target3 += 8; } - if(decimal_binary[21] == '1') { target3 += 4; } - if(decimal_binary[22] == '1') { target3 += 2; } - if(decimal_binary[23] == '1') { target3 += 1; } - target[tp] = target1; tp++; - target[tp] = target2; tp++; - target[tp] = target3; tp++; + for (i = 0; i < 8; i++) { + if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) { + j++; + } + } - strcpy(temp_binary, ""); - if(strlen(decimal_binary) > 24) { - for(i = 0; i <= (strlen(decimal_binary) - 24); i++) { - temp_binary[i] = decimal_binary[i + 24]; - } - strcpy(decimal_binary, temp_binary); - } - } - } + if ((length - sp) == 8) { + latch = 1; + } else { + latch = 1; + for (j = sp + 8; j < length; j++) { + if ((source[j] <= '0') || (source[j] >= '9')) { + latch = 0; + } + } + } - if(current_mode == C1_BYTE) { - next_mode = C1_BYTE; + if ((j == 8) && latch) { + next_mode = C1_ASCII; + done = 1; + } + } - if(gs1 && (source[sp] == '[')) { - next_mode = C1_ASCII; - } else { - if(source[sp] <= 127) { - next_mode = c1_look_ahead_test(source, length, sp, current_mode, gs1); - } - } + if (!(done)) { + next_mode = c1_look_ahead_test(source, length, sp, current_mode, gs1); + } + } - if(next_mode != C1_BYTE) { - /* Insert byte field length */ - if((tp - byte_start) <= 249) { - for(i = tp; i >= byte_start; i--) { - target[i + 1] = target[i]; - } - target[byte_start] = (tp - byte_start); - tp++; - } else { - for(i = tp; i >= byte_start; i--) { - target[i + 2] = target[i]; - } - target[byte_start] = 249 + ((tp - byte_start) / 250); - target[byte_start + 1] = ((tp - byte_start) % 250); - tp += 2; - } - } else { - target[tp] = source[sp]; - tp++; - sp++; - } - } + if (next_mode != C1_TEXT) { + target[tp] = 255; + tp++; /* Unlatch */ + } else { + if (source[sp] > 127) { + text_buffer[text_p] = 1; + text_p++; + text_buffer[text_p] = 30; + text_p++; /* Upper Shift */ + shift_set = text_shift[source[sp] - 128]; + value = text_value[source[sp] - 128]; + } else { + shift_set = text_shift[source[sp]]; + value = text_value[source[sp]]; + } - if(tp > 1480) { - /* Data is too large for symbol */ - strcpy(symbol->errtxt, "Input data too long"); - return 0; - } - } while (sp < length); + if (gs1 && (source[sp] == '[')) { + shift_set = 2; + value = 27; /* FNC1 */ + } - /* Empty buffers */ - if(c40_p == 2) { - int iv; + if (shift_set != 0) { + text_buffer[text_p] = shift_set - 1; + text_p++; + } + text_buffer[text_p] = value; + text_p++; - c40_buffer[2] = 1; - iv = (1600 * c40_buffer[0]) + (40 * c40_buffer[1]) + (c40_buffer[2]) + 1; - target[tp] = iv / 256; tp++; - target[tp] = iv % 256; tp++; - target[tp] = 255; tp++; /* Unlatch */ - } - if(c40_p == 1) { - int iv; + if (text_p >= 3) { + int iv; - c40_buffer[1] = 1; - c40_buffer[2] = 31; /* Pad */ - iv = (1600 * c40_buffer[0]) + (40 * c40_buffer[1]) + (c40_buffer[2]) + 1; - target[tp] = iv / 256; tp++; - target[tp] = iv % 256; tp++; - target[tp] = 255; tp++; /* Unlatch */ - } - if(text_p == 2) { - int iv; + iv = (1600 * text_buffer[0]) + (40 * text_buffer[1]) + (text_buffer[2]) + 1; + target[tp] = iv / 256; + tp++; + target[tp] = iv % 256; + tp++; - text_buffer[2] = 1; - iv = (1600 * text_buffer[0]) + (40 * text_buffer[1]) + (text_buffer[2]) + 1; - target[tp] = iv / 256; tp++; - target[tp] = iv % 256; tp++; - target[tp] = 255; tp++; /* Unlatch */ - } - if(text_p == 1) { - int iv; + text_buffer[0] = text_buffer[3]; + text_buffer[1] = text_buffer[4]; + text_buffer[2] = text_buffer[5]; + text_buffer[3] = 0; + text_buffer[4] = 0; + text_buffer[5] = 0; + text_p -= 3; + } + sp++; + } + } - text_buffer[1] = 1; - text_buffer[2] = 31; /* Pad */ - iv = (1600 * text_buffer[0]) + (40 * text_buffer[1]) + (text_buffer[2]) + 1; - target[tp] = iv / 256; tp++; - target[tp] = iv % 256; tp++; - target[tp] = 255; tp++; /* Unlatch */ - } + if (current_mode == C1_EDI) { + /* Step E - EDI Encodation */ + int value = 0, latch = 0; - if(current_mode == C1_DECIMAL) { - int bits_left_in_byte, target_count; - int sub_target; - /* Finish Decimal mode and go back to ASCII */ + next_mode = C1_EDI; + if (edi_p == 0) { + if ((length - sp) >= 12) { + j = 0; - concat(decimal_binary, "111111"); /* Unlatch */ + for (i = 0; i < 12; i++) { + if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) { + j++; + } + } - target_count = 3; - if(strlen(decimal_binary) <= 16) { target_count = 2; } - if(strlen(decimal_binary) <= 8) { target_count = 1; } - bits_left_in_byte = (8 * target_count) - strlen(decimal_binary); - if(bits_left_in_byte == 8) { bits_left_in_byte = 0; } + if (j == 12) { + next_mode = C1_ASCII; + } + } - if(bits_left_in_byte == 2) { - concat(decimal_binary, "01"); - } + if ((length - sp) >= 8) { + j = 0; - if((bits_left_in_byte == 4) || (bits_left_in_byte == 6)) { - concat(decimal_binary, "1111"); - } + for (i = 0; i < 8; i++) { + if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) { + j++; + } + } - if(bits_left_in_byte == 6) { - concat(decimal_binary, "01"); - } + if ((length - sp) == 8) { + latch = 1; + } else { + latch = 1; + for (j = sp + 8; j < length; j++) { + if ((source[j] <= '0') || (source[j] >= '9')) { + latch = 0; + } + } + } - /* Binary buffer is full - transfer to target */ - if(target_count >= 1) { - sub_target = 0; - if(decimal_binary[0] == '1') { sub_target += 128; } - if(decimal_binary[1] == '1') { sub_target += 64; } - if(decimal_binary[2] == '1') { sub_target += 32; } - if(decimal_binary[3] == '1') { sub_target += 16; } - if(decimal_binary[4] == '1') { sub_target += 8; } - if(decimal_binary[5] == '1') { sub_target += 4; } - if(decimal_binary[6] == '1') { sub_target += 2; } - if(decimal_binary[7] == '1') { sub_target += 1; } - target[tp] = sub_target; tp++; - } - if(target_count >= 2) { - sub_target = 0; - if(decimal_binary[8] == '1') { sub_target += 128; } - if(decimal_binary[9] == '1') { sub_target += 64; } - if(decimal_binary[10] == '1') { sub_target += 32; } - if(decimal_binary[11] == '1') { sub_target += 16; } - if(decimal_binary[12] == '1') { sub_target += 8; } - if(decimal_binary[13] == '1') { sub_target += 4; } - if(decimal_binary[14] == '1') { sub_target += 2; } - if(decimal_binary[15] == '1') { sub_target += 1; } - target[tp] = sub_target; tp++; - } - if(target_count == 3) { - sub_target = 0; - if(decimal_binary[16] == '1') { sub_target += 128; } - if(decimal_binary[17] == '1') { sub_target += 64; } - if(decimal_binary[18] == '1') { sub_target += 32; } - if(decimal_binary[19] == '1') { sub_target += 16; } - if(decimal_binary[20] == '1') { sub_target += 8; } - if(decimal_binary[21] == '1') { sub_target += 4; } - if(decimal_binary[22] == '1') { sub_target += 2; } - if(decimal_binary[23] == '1') { sub_target += 1; } - target[tp] = sub_target; tp++; - } - } + if ((j == 8) && latch) { + next_mode = C1_ASCII; + } + } - if(current_mode == C1_BYTE) { - /* Insert byte field length */ - if((tp - byte_start) <= 249) { - for(i = tp; i >= byte_start; i--) { - target[i + 1] = target[i]; - } - target[byte_start] = (tp - byte_start); - tp++; - } else { - for(i = tp; i >= byte_start; i--) { - target[i + 2] = target[i]; - } - target[byte_start] = 249 + ((tp - byte_start) / 250); - target[byte_start + 1] = ((tp - byte_start) % 250); - tp += 2; - } - } + if (!((isedi(source[sp]) && isedi(source[sp + 1])) && isedi(source[sp + 2]))) { + next_mode = C1_ASCII; + } + } - /* Re-check length of data */ - if(tp > 1480) { - /* Data is too large for symbol */ - strcpy(symbol->errtxt, "Input data too long"); - return 0; - } - /* - printf("targets:\n"); - for(i = 0; i < tp; i++) { - printf("[%d]", target[i]); - } - printf("\n"); - */ - return tp; + if (next_mode != C1_EDI) { + target[tp] = 255; /* Unlatch */ + tp++; + } else { + if (source[sp] == 13) { + value = 0; + } + if (source[sp] == '*') { + value = 1; + } + if (source[sp] == '>') { + value = 2; + } + if (source[sp] == ' ') { + value = 3; + } + if ((source[sp] >= '0') && (source[sp] <= '9')) { + value = source[sp] - '0' + 4; + } + if ((source[sp] >= 'A') && (source[sp] <= 'Z')) { + value = source[sp] - 'A' + 14; + } + + edi_buffer[edi_p] = value; + edi_p++; + + if (edi_p >= 3) { + int iv; + + iv = (1600 * edi_buffer[0]) + (40 * edi_buffer[1]) + (edi_buffer[2]) + 1; + target[tp] = iv / 256; + tp++; + target[tp] = iv % 256; + tp++; + + edi_buffer[0] = edi_buffer[3]; + edi_buffer[1] = edi_buffer[4]; + edi_buffer[2] = edi_buffer[5]; + edi_buffer[3] = 0; + edi_buffer[4] = 0; + edi_buffer[5] = 0; + edi_p -= 3; + } + sp++; + } + } + + if (current_mode == C1_DECIMAL) { + /* Step F - Decimal encodation */ + int value, decimal_count, data_left; + + next_mode = C1_DECIMAL; + + data_left = length - sp; + decimal_count = 0; + + if (data_left >= 1) { + if ((source[sp] >= '0') && (source[sp] <= '9')) { + decimal_count = 1; + } + } + if (data_left >= 2) { + if ((decimal_count == 1) && ((source[sp + 1] >= '0') && (source[sp + 1] <= '9'))) { + decimal_count = 2; + } + } + if (data_left >= 3) { + if ((decimal_count == 2) && ((source[sp + 2] >= '0') && (source[sp + 2] <= '9'))) { + decimal_count = 3; + } + } + + if (decimal_count != 3) { + int bits_left_in_byte, target_count; + int sub_target; + /* Finish Decimal mode and go back to ASCII */ + + concat(decimal_binary, "111111"); /* Unlatch */ + + target_count = 3; + if (strlen(decimal_binary) <= 16) { + target_count = 2; + } + if (strlen(decimal_binary) <= 8) { + target_count = 1; + } + bits_left_in_byte = (8 * target_count) - strlen(decimal_binary); + if (bits_left_in_byte == 8) { + bits_left_in_byte = 0; + } + + if (bits_left_in_byte == 2) { + concat(decimal_binary, "01"); + } + + if ((bits_left_in_byte == 4) || (bits_left_in_byte == 6)) { + if (decimal_count >= 1) { + int sub_value = ctoi(source[sp]) + 1; + + if (sub_value & 0x08) { + concat(decimal_binary, "1"); + } else { + concat(decimal_binary, "0"); + } + if (sub_value & 0x04) { + concat(decimal_binary, "1"); + } else { + concat(decimal_binary, "0"); + } + if (sub_value & 0x02) { + concat(decimal_binary, "1"); + } else { + concat(decimal_binary, "0"); + } + if (sub_value & 0x01) { + concat(decimal_binary, "1"); + } else { + concat(decimal_binary, "0"); + } + sp++; + } else { + concat(decimal_binary, "1111"); + } + } + + if (bits_left_in_byte == 6) { + concat(decimal_binary, "01"); + } + + /* Binary buffer is full - transfer to target */ + if (target_count >= 1) { + sub_target = 0; + if (decimal_binary[0] == '1') { + sub_target += 128; + } + if (decimal_binary[1] == '1') { + sub_target += 64; + } + if (decimal_binary[2] == '1') { + sub_target += 32; + } + if (decimal_binary[3] == '1') { + sub_target += 16; + } + if (decimal_binary[4] == '1') { + sub_target += 8; + } + if (decimal_binary[5] == '1') { + sub_target += 4; + } + if (decimal_binary[6] == '1') { + sub_target += 2; + } + if (decimal_binary[7] == '1') { + sub_target += 1; + } + target[tp] = sub_target; + tp++; + } + if (target_count >= 2) { + sub_target = 0; + if (decimal_binary[8] == '1') { + sub_target += 128; + } + if (decimal_binary[9] == '1') { + sub_target += 64; + } + if (decimal_binary[10] == '1') { + sub_target += 32; + } + if (decimal_binary[11] == '1') { + sub_target += 16; + } + if (decimal_binary[12] == '1') { + sub_target += 8; + } + if (decimal_binary[13] == '1') { + sub_target += 4; + } + if (decimal_binary[14] == '1') { + sub_target += 2; + } + if (decimal_binary[15] == '1') { + sub_target += 1; + } + target[tp] = sub_target; + tp++; + } + if (target_count == 3) { + sub_target = 0; + if (decimal_binary[16] == '1') { + sub_target += 128; + } + if (decimal_binary[17] == '1') { + sub_target += 64; + } + if (decimal_binary[18] == '1') { + sub_target += 32; + } + if (decimal_binary[19] == '1') { + sub_target += 16; + } + if (decimal_binary[20] == '1') { + sub_target += 8; + } + if (decimal_binary[21] == '1') { + sub_target += 4; + } + if (decimal_binary[22] == '1') { + sub_target += 2; + } + if (decimal_binary[23] == '1') { + sub_target += 1; + } + target[tp] = sub_target; + tp++; + } + + next_mode = C1_ASCII; + } else { + /* There are three digits - convert the value to binary */ + value = (100 * ctoi(source[sp])) + (10 * ctoi(source[sp + 1])) + ctoi(source[sp + 2]) + 1; + + for (int p = 0; p < 10; p++) { + if (value & (0x200 >> p)) { + concat(decimal_binary, "1"); + } else { + concat(decimal_binary, "0"); + } + } + + sp += 3; + } + + if (strlen(decimal_binary) >= 24) { + int target1 = 0, target2 = 0, target3 = 0; + char temp_binary[40]; + + /* Binary buffer is full - transfer to target */ + + for (int p = 0; p < 8; p++) { + if (decimal_binary[p] == '1') { + target1 += (0x80 >> p); + } + if (decimal_binary[p + 8] == '1') { + target2 += (0x80 >> p); + } + if (decimal_binary[p + 16] == '1') { + target3 += (0x80 >> p); + } + } + target[tp] = target1; + tp++; + target[tp] = target2; + tp++; + target[tp] = target3; + tp++; + + strcpy(temp_binary, ""); + if (strlen(decimal_binary) > 24) { + for (i = 0; i <= (strlen(decimal_binary) - 24); i++) { + temp_binary[i] = decimal_binary[i + 24]; + } + strcpy(decimal_binary, temp_binary); + } + } + } + + if (current_mode == C1_BYTE) { + next_mode = C1_BYTE; + + if (gs1 && (source[sp] == '[')) { + next_mode = C1_ASCII; + } else { + if (source[sp] <= 127) { + next_mode = c1_look_ahead_test(source, length, sp, current_mode, gs1); + } + } + + if (next_mode != C1_BYTE) { + /* Insert byte field length */ + if ((tp - byte_start) <= 249) { + for (i = tp; i >= byte_start; i--) { + target[i + 1] = target[i]; + } + target[byte_start] = (tp - byte_start); + tp++; + } else { + for (i = tp; i >= byte_start; i--) { + target[i + 2] = target[i]; + } + target[byte_start] = 249 + ((tp - byte_start) / 250); + target[byte_start + 1] = ((tp - byte_start) % 250); + tp += 2; + } + } else { + target[tp] = source[sp]; + tp++; + sp++; + } + } + + if (tp > 1480) { + /* Data is too large for symbol */ + strcpy(symbol->errtxt, "Input data too long"); + return 0; + } + } while (sp < length); + + /* Empty buffers */ + if (c40_p == 2) { + int iv; + + c40_buffer[2] = 1; + iv = (1600 * c40_buffer[0]) + (40 * c40_buffer[1]) + (c40_buffer[2]) + 1; + target[tp] = iv / 256; + tp++; + target[tp] = iv % 256; + tp++; + target[tp] = 255; + tp++; /* Unlatch */ + } + if (c40_p == 1) { + int iv; + + c40_buffer[1] = 1; + c40_buffer[2] = 31; /* Pad */ + iv = (1600 * c40_buffer[0]) + (40 * c40_buffer[1]) + (c40_buffer[2]) + 1; + target[tp] = iv / 256; + tp++; + target[tp] = iv % 256; + tp++; + target[tp] = 255; + tp++; /* Unlatch */ + } + if (text_p == 2) { + int iv; + + text_buffer[2] = 1; + iv = (1600 * text_buffer[0]) + (40 * text_buffer[1]) + (text_buffer[2]) + 1; + target[tp] = iv / 256; + tp++; + target[tp] = iv % 256; + tp++; + target[tp] = 255; + tp++; /* Unlatch */ + } + if (text_p == 1) { + int iv; + + text_buffer[1] = 1; + text_buffer[2] = 31; /* Pad */ + iv = (1600 * text_buffer[0]) + (40 * text_buffer[1]) + (text_buffer[2]) + 1; + target[tp] = iv / 256; + tp++; + target[tp] = iv % 256; + tp++; + target[tp] = 255; + tp++; /* Unlatch */ + } + + if (current_mode == C1_DECIMAL) { + int bits_left_in_byte, target_count; + int sub_target; + /* Finish Decimal mode and go back to ASCII */ + + concat(decimal_binary, "111111"); /* Unlatch */ + + target_count = 3; + if (strlen(decimal_binary) <= 16) { + target_count = 2; + } + if (strlen(decimal_binary) <= 8) { + target_count = 1; + } + bits_left_in_byte = (8 * target_count) - strlen(decimal_binary); + if (bits_left_in_byte == 8) { + bits_left_in_byte = 0; + } + + if (bits_left_in_byte == 2) { + concat(decimal_binary, "01"); + } + + if ((bits_left_in_byte == 4) || (bits_left_in_byte == 6)) { + concat(decimal_binary, "1111"); + } + + if (bits_left_in_byte == 6) { + concat(decimal_binary, "01"); + } + + /* Binary buffer is full - transfer to target */ + if (target_count >= 1) { + sub_target = 0; + if (decimal_binary[0] == '1') { + sub_target += 128; + } + if (decimal_binary[1] == '1') { + sub_target += 64; + } + if (decimal_binary[2] == '1') { + sub_target += 32; + } + if (decimal_binary[3] == '1') { + sub_target += 16; + } + if (decimal_binary[4] == '1') { + sub_target += 8; + } + if (decimal_binary[5] == '1') { + sub_target += 4; + } + if (decimal_binary[6] == '1') { + sub_target += 2; + } + if (decimal_binary[7] == '1') { + sub_target += 1; + } + target[tp] = sub_target; + tp++; + } + if (target_count >= 2) { + sub_target = 0; + if (decimal_binary[8] == '1') { + sub_target += 128; + } + if (decimal_binary[9] == '1') { + sub_target += 64; + } + if (decimal_binary[10] == '1') { + sub_target += 32; + } + if (decimal_binary[11] == '1') { + sub_target += 16; + } + if (decimal_binary[12] == '1') { + sub_target += 8; + } + if (decimal_binary[13] == '1') { + sub_target += 4; + } + if (decimal_binary[14] == '1') { + sub_target += 2; + } + if (decimal_binary[15] == '1') { + sub_target += 1; + } + target[tp] = sub_target; + tp++; + } + if (target_count == 3) { + sub_target = 0; + if (decimal_binary[16] == '1') { + sub_target += 128; + } + if (decimal_binary[17] == '1') { + sub_target += 64; + } + if (decimal_binary[18] == '1') { + sub_target += 32; + } + if (decimal_binary[19] == '1') { + sub_target += 16; + } + if (decimal_binary[20] == '1') { + sub_target += 8; + } + if (decimal_binary[21] == '1') { + sub_target += 4; + } + if (decimal_binary[22] == '1') { + sub_target += 2; + } + if (decimal_binary[23] == '1') { + sub_target += 1; + } + target[tp] = sub_target; + tp++; + } + } + + if (current_mode == C1_BYTE) { + /* Insert byte field length */ + if ((tp - byte_start) <= 249) { + for (i = tp; i >= byte_start; i--) { + target[i + 1] = target[i]; + } + target[byte_start] = (tp - byte_start); + tp++; + } else { + for (i = tp; i >= byte_start; i--) { + target[i + 2] = target[i]; + } + target[byte_start] = 249 + ((tp - byte_start) / 250); + target[byte_start + 1] = ((tp - byte_start) % 250); + tp += 2; + } + } + + /* Re-check length of data */ + if (tp > 1480) { + /* Data is too large for symbol */ + strcpy(symbol->errtxt, "Input data too long"); + return 0; + } + /* + printf("targets:\n"); + for(i = 0; i < tp; i++) { + printf("[%d]", target[i]); + } + printf("\n"); + */ + return tp; } void block_copy(struct zint_symbol *symbol, char grid[][120], int start_row, int start_col, int height, int width, int row_offset, int col_offset) { - int i, j; - - for(i = start_row; i < (start_row + height); i++) { - for(j = start_col; j < (start_col + width); j++) { - if(grid[i][j] == '1') { - set_module(symbol, i + row_offset, j + col_offset); - } - } - } + int i, j; + + for (i = start_row; i < (start_row + height); i++) { + for (j = start_col; j < (start_col + width); j++) { + if (grid[i][j] == '1') { + set_module(symbol, i + row_offset, j + col_offset); + } + } + } } -int code_one(struct zint_symbol *symbol, unsigned char source[], int length) -{ - int size = 1, i, j, data_blocks; +int code_one(struct zint_symbol *symbol, unsigned char source[], int length) { + int size = 1, i, j, data_blocks; - char datagrid[136][120]; - int row, col; - int sub_version = 0; + char datagrid[136][120]; + int row, col; + int sub_version = 0; - if((symbol->option_2 < 0) || (symbol->option_2 > 10)) { - strcpy(symbol->errtxt, "Invalid symbol size"); - return ZINT_ERROR_INVALID_OPTION; - } + if ((symbol->option_2 < 0) || (symbol->option_2 > 10)) { + strcpy(symbol->errtxt, "Invalid symbol size"); + return ZINT_ERROR_INVALID_OPTION; + } - if(symbol->option_2 == 9) { - /* Version S */ - int codewords; - short int elreg[112]; - unsigned int data[15], ecc[15]; - int stream[30]; - int block_width; + if (symbol->option_2 == 9) { + /* Version S */ + int codewords; + short int elreg[112]; + unsigned int data[15], ecc[15]; + int stream[30]; + int block_width; - if(length > 18) { - strcpy(symbol->errtxt, "Input data too long"); - return ZINT_ERROR_TOO_LONG; - } - if(is_sane(NEON, source, length) == ZINT_ERROR_INVALID_DATA) { - strcpy(symbol->errtxt, "Invalid input data (Version S encodes numeric input only)"); - return ZINT_ERROR_INVALID_DATA; - } + if (length > 18) { + strcpy(symbol->errtxt, "Input data too long"); + return ZINT_ERROR_TOO_LONG; + } + if (is_sane(NEON, source, length) == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Invalid input data (Version S encodes numeric input only)"); + return ZINT_ERROR_INVALID_DATA; + } - sub_version = 3; codewords = 12; block_width = 6; /* Version S-30 */ - if(length <= 12) { sub_version = 2; codewords = 8; block_width = 4; } /* Version S-20 */ - if(length <= 6) { sub_version = 1; codewords = 4; block_width = 2; } /* Version S-10 */ + sub_version = 3; + codewords = 12; + block_width = 6; /* Version S-30 */ + if (length <= 12) { + /* Version S-20 */ + sub_version = 2; + codewords = 8; + block_width = 4; + } + if (length <= 6) { + /* Version S-10 */ + sub_version = 1; + codewords = 4; + block_width = 2; + } - binary_load(elreg, (char *)source, length); - hex_dump(elreg); - - for(i = 0; i < 15; i++) { - data[i] = 0; - ecc[i] = 0; - } - - for(i = 0; i < codewords; i++) { - data[codewords - i - 1] += 1 * elreg[(i * 5)]; - data[codewords - i - 1] += 2 * elreg[(i * 5) + 1]; - data[codewords - i - 1] += 4 * elreg[(i * 5) + 2]; - data[codewords - i - 1] += 8 * elreg[(i * 5) + 3]; - data[codewords - i - 1] += 16 * elreg[(i * 5) + 4]; - } + binary_load(elreg, (char *) source, length); + hex_dump(elreg); - rs_init_gf(0x25); - rs_init_code(codewords, 1); - rs_encode_long(codewords, data, ecc); - rs_free(); - - for(i = 0; i < codewords; i++) { - stream[i] = data[i]; - stream[i + codewords] = ecc[codewords - i - 1]; - } - - for(i = 0; i < 136; i++) { - for(j = 0; j < 120; j++) { - datagrid[i][j] = '0'; - } - } - - i = 0; - for(row = 0; row < 2; row++) { - for(col = 0; col < block_width; col++) { - if(stream[i] & 0x10) { datagrid[row * 2][col * 5] = '1'; } - if(stream[i] & 0x08) { datagrid[row * 2][(col * 5) + 1] = '1'; } - if(stream[i] & 0x04) { datagrid[row * 2][(col * 5) + 2] = '1'; } - if(stream[i] & 0x02) { datagrid[(row * 2) + 1][col * 5] = '1'; } - if(stream[i] & 0x01) { datagrid[(row * 2) + 1][(col * 5) + 1] = '1'; } - if(stream[i + 1] & 0x10) { datagrid[row * 2][(col * 5) + 3] = '1'; } - if(stream[i + 1] & 0x08) { datagrid[row * 2][(col * 5) + 4] = '1'; } - if(stream[i + 1] & 0x04) { datagrid[(row * 2) + 1][(col * 5) + 2] = '1'; } - if(stream[i + 1] & 0x02) { datagrid[(row * 2) + 1][(col * 5) + 3] = '1'; } - if(stream[i + 1] & 0x01) { datagrid[(row * 2) + 1][(col * 5) + 4] = '1'; } - i += 2; - } - } - - size = 9; - symbol->rows = 8; - symbol->width = 10 * sub_version + 1; - } + for (i = 0; i < 15; i++) { + data[i] = 0; + ecc[i] = 0; + } - if(symbol->option_2 == 10) { - /* Version T */ - unsigned int data[40], ecc[25]; - unsigned int stream[65]; - int data_length; - int data_cw, ecc_cw, block_width; - - for(i = 0; i < 40; i++) { data[i] = 0; } - data_length = c1_encode(symbol, source, data, length); + for (i = 0; i < codewords; i++) { + data[codewords - i - 1] += 1 * elreg[(i * 5)]; + data[codewords - i - 1] += 2 * elreg[(i * 5) + 1]; + data[codewords - i - 1] += 4 * elreg[(i * 5) + 2]; + data[codewords - i - 1] += 8 * elreg[(i * 5) + 3]; + data[codewords - i - 1] += 16 * elreg[(i * 5) + 4]; + } - if(data_length == 0) { - return ZINT_ERROR_TOO_LONG; - } + rs_init_gf(0x25); + rs_init_code(codewords, 1); + rs_encode_long(codewords, data, ecc); + rs_free(); - if(data_length > 38) { - strcpy(symbol->errtxt, "Input data too long"); - return ZINT_ERROR_TOO_LONG; - } + for (i = 0; i < codewords; i++) { + stream[i] = data[i]; + stream[i + codewords] = ecc[codewords - i - 1]; + } - size = 10; - sub_version = 3; data_cw = 38; ecc_cw = 22; block_width = 12; - if(data_length <= 24) { sub_version = 2; data_cw = 24; ecc_cw = 16; block_width = 8; } - if(data_length <= 10) { sub_version = 1; data_cw = 10; ecc_cw = 10; block_width = 4; } - - for(i = data_length; i < data_cw; i++) { - data[i] = 129; /* Pad */ - } + for (i = 0; i < 136; i++) { + for (j = 0; j < 120; j++) { + datagrid[i][j] = '0'; + } + } - /* Calculate error correction data */ - rs_init_gf(0x12d); - rs_init_code(ecc_cw, 1); - rs_encode_long(data_cw, data, ecc); - rs_free(); + i = 0; + for (row = 0; row < 2; row++) { + for (col = 0; col < block_width; col++) { + if (stream[i] & 0x10) { + datagrid[row * 2][col * 5] = '1'; + } + if (stream[i] & 0x08) { + datagrid[row * 2][(col * 5) + 1] = '1'; + } + if (stream[i] & 0x04) { + datagrid[row * 2][(col * 5) + 2] = '1'; + } + if (stream[i] & 0x02) { + datagrid[(row * 2) + 1][col * 5] = '1'; + } + if (stream[i] & 0x01) { + datagrid[(row * 2) + 1][(col * 5) + 1] = '1'; + } + if (stream[i + 1] & 0x10) { + datagrid[row * 2][(col * 5) + 3] = '1'; + } + if (stream[i + 1] & 0x08) { + datagrid[row * 2][(col * 5) + 4] = '1'; + } + if (stream[i + 1] & 0x04) { + datagrid[(row * 2) + 1][(col * 5) + 2] = '1'; + } + if (stream[i + 1] & 0x02) { + datagrid[(row * 2) + 1][(col * 5) + 3] = '1'; + } + if (stream[i + 1] & 0x01) { + datagrid[(row * 2) + 1][(col * 5) + 4] = '1'; + } + i += 2; + } + } - /* "Stream" combines data and error correction data */ - for(i = 0; i < data_cw; i++) { - stream[i] = data[i]; - } - for(i = 0; i < ecc_cw; i++) { - stream[data_cw + i] = ecc[ecc_cw - i - 1]; - } - - for(i = 0; i < 136; i++) { - for(j = 0; j < 120; j++) { - datagrid[i][j] = '0'; - } - } - - i = 0; - for(row = 0; row < 5; row++) { - for(col = 0; col < block_width; col++) { - if(stream[i] & 0x80) { datagrid[row * 2][col * 4] = '1'; } - if(stream[i] & 0x40) { datagrid[row * 2][(col * 4) + 1] = '1'; } - if(stream[i] & 0x20) { datagrid[row * 2][(col * 4) + 2] = '1'; } - if(stream[i] & 0x10) { datagrid[row * 2][(col * 4) + 3] = '1'; } - if(stream[i] & 0x08) { datagrid[(row * 2) + 1][col * 4] = '1'; } - if(stream[i] & 0x04) { datagrid[(row * 2) + 1][(col * 4) + 1] = '1'; } - if(stream[i] & 0x02) { datagrid[(row * 2) + 1][(col * 4) + 2] = '1'; } - if(stream[i] & 0x01) { datagrid[(row * 2) + 1][(col * 4) + 3] = '1'; } - i++; - } - } + size = 9; + symbol->rows = 8; + symbol->width = 10 * sub_version + 1; + } - symbol->rows = 16; - symbol->width = (sub_version * 16) + 1; - } + if (symbol->option_2 == 10) { + /* Version T */ + unsigned int data[40], ecc[25]; + unsigned int stream[65]; + int data_length; + int data_cw, ecc_cw, block_width; - if((symbol->option_2 != 9) && (symbol->option_2 != 10)) { - /* Version A to H */ - unsigned int data[1500], ecc[600]; - unsigned int sub_data[190], sub_ecc[75]; - unsigned int stream[2100]; - int data_length; - - for(i = 0; i < 1500; i++) { data[i] = 0; } - data_length = c1_encode(symbol, source, data, length); - - if(data_length == 0) { - return ZINT_ERROR_TOO_LONG; - } - - for(i = 7; i >= 0; i--) { - if(c1_data_length[i] >= data_length) { - size = i + 1; - } - } - - if(symbol->option_2 > size) { - size = symbol->option_2; - } - - for(i = data_length; i < c1_data_length[size - 1]; i++) { - data[i] = 129; /* Pad */ - } + for (i = 0; i < 40; i++) { + data[i] = 0; + } + data_length = c1_encode(symbol, source, data, length); - /* Calculate error correction data */ - data_length = c1_data_length[size - 1]; - for(i = 0; i < 190; i++) { sub_data[i] = 0; } - for(i = 0; i < 75; i++) { sub_ecc[i] = 0; } - - data_blocks = c1_blocks[size - 1]; + if (data_length == 0) { + return ZINT_ERROR_TOO_LONG; + } - rs_init_gf(0x12d); - rs_init_code(c1_ecc_blocks[size - 1], 0); - for(i = 0; i < data_blocks; i++) { - for(j = 0; j < c1_data_blocks[size - 1]; j++) { - - sub_data[j] = data[j * data_blocks + i]; - } - rs_encode_long(c1_data_blocks[size - 1], sub_data, sub_ecc); - for(j = 0; j < c1_ecc_blocks[size - 1]; j++) { - ecc[c1_ecc_length[size - 1] - (j * data_blocks + i) - 1] = sub_ecc[j]; - } - } - rs_free(); + if (data_length > 38) { + strcpy(symbol->errtxt, "Input data too long"); + return ZINT_ERROR_TOO_LONG; + } - /* "Stream" combines data and error correction data */ - for(i = 0; i < data_length; i++) { - stream[i] = data[i]; - } - for(i = 0; i < c1_ecc_length[size - 1]; i++) { - stream[data_length + i] = ecc[i]; - } - - for(i = 0; i < 136; i++) { - for(j = 0; j < 120; j++) { - datagrid[i][j] = '0'; - } - } - - i = 0; - for(row = 0; row < c1_grid_height[size - 1]; row++) { - for(col = 0; col < c1_grid_width[size - 1]; col++) { - if(stream[i] & 0x80) { datagrid[row * 2][col * 4] = '1'; } - if(stream[i] & 0x40) { datagrid[row * 2][(col * 4) + 1] = '1'; } - if(stream[i] & 0x20) { datagrid[row * 2][(col * 4) + 2] = '1'; } - if(stream[i] & 0x10) { datagrid[row * 2][(col * 4) + 3] = '1'; } - if(stream[i] & 0x08) { datagrid[(row * 2) + 1][col * 4] = '1'; } - if(stream[i] & 0x04) { datagrid[(row * 2) + 1][(col * 4) + 1] = '1'; } - if(stream[i] & 0x02) { datagrid[(row * 2) + 1][(col * 4) + 2] = '1'; } - if(stream[i] & 0x01) { datagrid[(row * 2) + 1][(col * 4) + 3] = '1'; } - i++; - } - } - - /* for(i = 0; i < (c1_grid_height[size - 1] * 2); i++) { - for(j = 0; j < (c1_grid_width[size - 1] * 4); j++) { - printf("%c", datagrid[i][j]); - } - printf("\n"); - } */ - - symbol->rows = c1_height[size - 1]; - symbol->width = c1_width[size - 1]; - } + size = 10; + sub_version = 3; + data_cw = 38; + ecc_cw = 22; + block_width = 12; + if (data_length <= 24) { + sub_version = 2; + data_cw = 24; + ecc_cw = 16; + block_width = 8; + } + if (data_length <= 10) { + sub_version = 1; + data_cw = 10; + ecc_cw = 10; + block_width = 4; + } - switch(size) { - case 1: /* Version A */ - central_finder(symbol, 6, 3, 1); - vert(symbol, 4, 6, 1); - vert(symbol, 12, 5, 0); - set_module(symbol, 5, 12); - spigot(symbol, 0); - spigot(symbol, 15); - block_copy(symbol, datagrid, 0, 0, 5, 4, 0, 0); - block_copy(symbol, datagrid, 0, 4, 5, 12, 0, 2); - block_copy(symbol, datagrid, 5, 0, 5, 12, 6, 0); - block_copy(symbol, datagrid, 5, 12, 5, 4, 6, 2); - break; - case 2: /* Version B */ - central_finder(symbol, 8, 4, 1); - vert(symbol, 4, 8, 1); - vert(symbol, 16, 7, 0); - set_module(symbol, 7, 16); - spigot(symbol, 0); - spigot(symbol, 21); - block_copy(symbol, datagrid, 0, 0, 7, 4, 0, 0); - block_copy(symbol, datagrid, 0, 4, 7, 16, 0, 2); - block_copy(symbol, datagrid, 7, 0, 7, 16, 8, 0); - block_copy(symbol, datagrid, 7, 16, 7, 4, 8, 2); - break; - case 3: /* Version C */ - central_finder(symbol, 11, 4, 2); - vert(symbol, 4, 11, 1); - vert(symbol, 26, 13, 1); - vert(symbol, 4, 10, 0); - vert(symbol, 26, 10, 0); - spigot(symbol, 0); - spigot(symbol, 27); - block_copy(symbol, datagrid, 0, 0, 10, 4, 0, 0); - block_copy(symbol, datagrid, 0, 4, 10, 20, 0, 2); - block_copy(symbol, datagrid, 0, 24, 10, 4, 0, 4); - block_copy(symbol, datagrid, 10, 0, 10, 4, 8, 0); - block_copy(symbol, datagrid, 10, 4, 10, 20, 8, 2); - block_copy(symbol, datagrid, 10, 24, 10, 4, 8, 4); - break; - case 4: /* Version D */ - central_finder(symbol, 16, 5, 1); - vert(symbol, 4, 16, 1); - vert(symbol, 20, 16, 1); - vert(symbol, 36, 16, 1); - vert(symbol, 4, 15, 0); - vert(symbol, 20, 15, 0); - vert(symbol, 36, 15, 0); - spigot(symbol, 0); - spigot(symbol, 12); - spigot(symbol, 27); - spigot(symbol, 39); - block_copy(symbol, datagrid, 0, 0, 15, 4, 0, 0); - block_copy(symbol, datagrid, 0, 4, 15, 14, 0, 2); - block_copy(symbol, datagrid, 0, 18, 15, 14, 0, 4); - block_copy(symbol, datagrid, 0, 32, 15, 4, 0, 6); - block_copy(symbol, datagrid, 15, 0, 15, 4, 10, 0); - block_copy(symbol, datagrid, 15, 4, 15, 14, 10, 2); - block_copy(symbol, datagrid, 15, 18, 15, 14, 10, 4); - block_copy(symbol, datagrid, 15, 32, 15, 4, 10, 6); - break; - case 5: /* Version E */ - central_finder(symbol, 22, 5, 2); - vert(symbol, 4, 22, 1); - vert(symbol, 26, 24, 1); - vert(symbol, 48, 22, 1); - vert(symbol, 4, 21, 0); - vert(symbol, 26, 21, 0); - vert(symbol, 48, 21, 0); - spigot(symbol, 0); - spigot(symbol, 12); - spigot(symbol, 39); - spigot(symbol, 51); - block_copy(symbol, datagrid, 0, 0, 21, 4, 0, 0); - block_copy(symbol, datagrid, 0, 4, 21, 20, 0, 2); - block_copy(symbol, datagrid, 0, 24, 21, 20, 0, 4); - block_copy(symbol, datagrid, 0, 44, 21, 4, 0, 6); - block_copy(symbol, datagrid, 21, 0, 21, 4, 10, 0); - block_copy(symbol, datagrid, 21, 4, 21, 20, 10, 2); - block_copy(symbol, datagrid, 21, 24, 21, 20, 10, 4); - block_copy(symbol, datagrid, 21, 44, 21, 4, 10, 6); - break; - case 6: /* Version F */ - central_finder(symbol, 31, 5, 3); - vert(symbol, 4, 31, 1); - vert(symbol, 26, 35, 1); - vert(symbol, 48, 31, 1); - vert(symbol, 70, 35, 1); - vert(symbol, 4, 30, 0); - vert(symbol, 26, 30, 0); - vert(symbol, 48, 30, 0); - vert(symbol, 70, 30, 0); - spigot(symbol, 0); - spigot(symbol, 12); - spigot(symbol, 24); - spigot(symbol, 45); - spigot(symbol, 57); - spigot(symbol, 69); - block_copy(symbol, datagrid, 0, 0, 30, 4, 0, 0); - block_copy(symbol, datagrid, 0, 4, 30, 20, 0, 2); - block_copy(symbol, datagrid, 0, 24, 30, 20, 0, 4); - block_copy(symbol, datagrid, 0, 44, 30, 20, 0, 6); - block_copy(symbol, datagrid, 0, 64, 30, 4, 0, 8); - block_copy(symbol, datagrid, 30, 0, 30, 4, 10, 0); - block_copy(symbol, datagrid, 30, 4, 30, 20, 10, 2); - block_copy(symbol, datagrid, 30, 24, 30, 20, 10, 4); - block_copy(symbol, datagrid, 30, 44, 30, 20, 10, 6); - block_copy(symbol, datagrid, 30, 64, 30, 4, 10, 8); - break; - case 7: /* Version G */ - central_finder(symbol, 47, 6, 2); - vert(symbol, 6, 47, 1); - vert(symbol, 27, 49, 1); - vert(symbol, 48, 47, 1); - vert(symbol, 69, 49, 1); - vert(symbol, 90, 47, 1); - vert(symbol, 6, 46, 0); - vert(symbol, 27, 46, 0); - vert(symbol, 48, 46, 0); - vert(symbol, 69, 46, 0); - vert(symbol, 90, 46, 0); - spigot(symbol, 0); - spigot(symbol, 12); - spigot(symbol, 24); - spigot(symbol, 36); - spigot(symbol, 67); - spigot(symbol, 79); - spigot(symbol, 91); - spigot(symbol, 103); - block_copy(symbol, datagrid, 0, 0, 46, 6, 0, 0); - block_copy(symbol, datagrid, 0, 6, 46, 19, 0, 2); - block_copy(symbol, datagrid, 0, 25, 46, 19, 0, 4); - block_copy(symbol, datagrid, 0, 44, 46, 19, 0, 6); - block_copy(symbol, datagrid, 0, 63, 46, 19, 0, 8); - block_copy(symbol, datagrid, 0, 82, 46, 6, 0, 10); - block_copy(symbol, datagrid, 46, 0, 46, 6, 12, 0); - block_copy(symbol, datagrid, 46, 6, 46, 19, 12, 2); - block_copy(symbol, datagrid, 46, 25, 46, 19, 12, 4); - block_copy(symbol, datagrid, 46, 44, 46, 19, 12, 6); - block_copy(symbol, datagrid, 46, 63, 46, 19, 12, 8); - block_copy(symbol, datagrid, 46, 82, 46, 6, 12, 10); - break; - case 8: /* Version H */ - central_finder(symbol, 69, 6, 3); - vert(symbol, 6, 69, 1); - vert(symbol, 26, 73, 1); - vert(symbol, 46, 69, 1); - vert(symbol, 66, 73, 1); - vert(symbol, 86, 69, 1); - vert(symbol, 106, 73, 1); - vert(symbol, 126, 69, 1); - vert(symbol, 6, 68, 0); - vert(symbol, 26, 68, 0); - vert(symbol, 46, 68, 0); - vert(symbol, 66, 68, 0); - vert(symbol, 86, 68, 0); - vert(symbol, 106, 68, 0); - vert(symbol, 126, 68, 0); - spigot(symbol, 0); - spigot(symbol, 12); - spigot(symbol, 24); - spigot(symbol, 36); - spigot(symbol, 48); - spigot(symbol, 60); - spigot(symbol, 87); - spigot(symbol, 99); - spigot(symbol, 111); - spigot(symbol, 123); - spigot(symbol, 135); - spigot(symbol, 147); - block_copy(symbol, datagrid, 0, 0, 68, 6, 0, 0); - block_copy(symbol, datagrid, 0, 6, 68, 18, 0, 2); - block_copy(symbol, datagrid, 0, 24, 68, 18, 0, 4); - block_copy(symbol, datagrid, 0, 42, 68, 18, 0, 6); - block_copy(symbol, datagrid, 0, 60, 68, 18, 0, 8); - block_copy(symbol, datagrid, 0, 78, 68, 18, 0, 10); - block_copy(symbol, datagrid, 0, 96, 68, 18, 0, 12); - block_copy(symbol, datagrid, 0, 114, 68, 6, 0, 14); - block_copy(symbol, datagrid, 68, 0, 68, 6, 12, 0); - block_copy(symbol, datagrid, 68, 6, 68, 18, 12, 2); - block_copy(symbol, datagrid, 68, 24, 68, 18, 12, 4); - block_copy(symbol, datagrid, 68, 42, 68, 18, 12, 6); - block_copy(symbol, datagrid, 68, 60, 68, 18, 12, 8); - block_copy(symbol, datagrid, 68, 78, 68, 18, 12, 10); - block_copy(symbol, datagrid, 68, 96, 68, 18, 12, 12); - block_copy(symbol, datagrid, 68, 114, 68, 6, 12, 14); - break; - case 9: /* Version S */ - horiz(symbol, 5, 1); - horiz(symbol, 7, 1); - set_module(symbol, 6, 0); - set_module(symbol, 6, symbol->width - 1); - unset_module(symbol, 7, 1); - unset_module(symbol, 7, symbol->width - 2); - switch(sub_version) { - case 1: /* Version S-10 */ - set_module(symbol, 0, 5); - block_copy(symbol, datagrid, 0, 0, 4, 5, 0, 0); - block_copy(symbol, datagrid, 0, 5, 4, 5, 0, 1); - break; - case 2: /* Version S-20 */ - set_module(symbol, 0, 10); - set_module(symbol, 4, 10); - block_copy(symbol, datagrid, 0, 0, 4, 10, 0, 0); - block_copy(symbol, datagrid, 0, 10, 4, 10, 0, 1); - break; - case 3: /* Version S-30 */ - set_module(symbol, 0, 15); - set_module(symbol, 4, 15); - set_module(symbol, 6, 15); - block_copy(symbol, datagrid, 0, 0, 4, 15, 0, 0); - block_copy(symbol, datagrid, 0, 15, 4, 15, 0, 1); - break; - } - break; - case 10: /* Version T */ - horiz(symbol, 11, 1); - horiz(symbol, 13, 1); - horiz(symbol, 15, 1); - set_module(symbol, 12, 0); - set_module(symbol, 12, symbol->width - 1); - set_module(symbol, 14, 0); - set_module(symbol, 14, symbol->width - 1); - unset_module(symbol, 13, 1); - unset_module(symbol, 13, symbol->width - 2); - unset_module(symbol, 15, 1); - unset_module(symbol, 15, symbol->width - 2); - switch(sub_version) { - case 1: /* Version T-16 */ - set_module(symbol, 0, 8); - set_module(symbol, 10, 8); - block_copy(symbol, datagrid, 0, 0, 10, 8, 0, 0); - block_copy(symbol, datagrid, 0, 8, 10, 8, 0, 1); - break; - case 2: /* Version T-32 */ - set_module(symbol, 0, 16); - set_module(symbol, 10, 16); - set_module(symbol, 12, 16); - block_copy(symbol, datagrid, 0, 0, 10, 16, 0, 0); - block_copy(symbol, datagrid, 0, 16, 10, 16, 0, 1); - break; - case 3: /* Verion T-48 */ - set_module(symbol, 0, 24); - set_module(symbol, 10, 24); - set_module(symbol, 12, 24); - set_module(symbol, 14, 24); - block_copy(symbol, datagrid, 0, 0, 10, 24, 0, 0); - block_copy(symbol, datagrid, 0, 24, 10, 24, 0, 1); - break; - } - break; - } - - for(i = 0; i < symbol->rows; i++) { - symbol->row_height[i] = 1; - } + for (i = data_length; i < data_cw; i++) { + data[i] = 129; /* Pad */ + } - return 0; + /* Calculate error correction data */ + rs_init_gf(0x12d); + rs_init_code(ecc_cw, 1); + rs_encode_long(data_cw, data, ecc); + rs_free(); + + /* "Stream" combines data and error correction data */ + for (i = 0; i < data_cw; i++) { + stream[i] = data[i]; + } + for (i = 0; i < ecc_cw; i++) { + stream[data_cw + i] = ecc[ecc_cw - i - 1]; + } + + for (i = 0; i < 136; i++) { + for (j = 0; j < 120; j++) { + datagrid[i][j] = '0'; + } + } + + i = 0; + for (row = 0; row < 5; row++) { + for (col = 0; col < block_width; col++) { + if (stream[i] & 0x80) { + datagrid[row * 2][col * 4] = '1'; + } + if (stream[i] & 0x40) { + datagrid[row * 2][(col * 4) + 1] = '1'; + } + if (stream[i] & 0x20) { + datagrid[row * 2][(col * 4) + 2] = '1'; + } + if (stream[i] & 0x10) { + datagrid[row * 2][(col * 4) + 3] = '1'; + } + if (stream[i] & 0x08) { + datagrid[(row * 2) + 1][col * 4] = '1'; + } + if (stream[i] & 0x04) { + datagrid[(row * 2) + 1][(col * 4) + 1] = '1'; + } + if (stream[i] & 0x02) { + datagrid[(row * 2) + 1][(col * 4) + 2] = '1'; + } + if (stream[i] & 0x01) { + datagrid[(row * 2) + 1][(col * 4) + 3] = '1'; + } + i++; + } + } + + symbol->rows = 16; + symbol->width = (sub_version * 16) + 1; + } + + if ((symbol->option_2 != 9) && (symbol->option_2 != 10)) { + /* Version A to H */ + unsigned int data[1500], ecc[600]; + unsigned int sub_data[190], sub_ecc[75]; + unsigned int stream[2100]; + int data_length; + + for (i = 0; i < 1500; i++) { + data[i] = 0; + } + data_length = c1_encode(symbol, source, data, length); + + if (data_length == 0) { + return ZINT_ERROR_TOO_LONG; + } + + for (i = 7; i >= 0; i--) { + if (c1_data_length[i] >= data_length) { + size = i + 1; + } + } + + if (symbol->option_2 > size) { + size = symbol->option_2; + } + + for (i = data_length; i < c1_data_length[size - 1]; i++) { + data[i] = 129; /* Pad */ + } + + /* Calculate error correction data */ + data_length = c1_data_length[size - 1]; + for (i = 0; i < 190; i++) { + sub_data[i] = 0; + } + for (i = 0; i < 75; i++) { + sub_ecc[i] = 0; + } + + data_blocks = c1_blocks[size - 1]; + + rs_init_gf(0x12d); + rs_init_code(c1_ecc_blocks[size - 1], 0); + for (i = 0; i < data_blocks; i++) { + for (j = 0; j < c1_data_blocks[size - 1]; j++) { + + sub_data[j] = data[j * data_blocks + i]; + } + rs_encode_long(c1_data_blocks[size - 1], sub_data, sub_ecc); + for (j = 0; j < c1_ecc_blocks[size - 1]; j++) { + ecc[c1_ecc_length[size - 1] - (j * data_blocks + i) - 1] = sub_ecc[j]; + } + } + rs_free(); + + /* "Stream" combines data and error correction data */ + for (i = 0; i < data_length; i++) { + stream[i] = data[i]; + } + for (i = 0; i < c1_ecc_length[size - 1]; i++) { + stream[data_length + i] = ecc[i]; + } + + for (i = 0; i < 136; i++) { + for (j = 0; j < 120; j++) { + datagrid[i][j] = '0'; + } + } + + i = 0; + for (row = 0; row < c1_grid_height[size - 1]; row++) { + for (col = 0; col < c1_grid_width[size - 1]; col++) { + if (stream[i] & 0x80) { + datagrid[row * 2][col * 4] = '1'; + } + if (stream[i] & 0x40) { + datagrid[row * 2][(col * 4) + 1] = '1'; + } + if (stream[i] & 0x20) { + datagrid[row * 2][(col * 4) + 2] = '1'; + } + if (stream[i] & 0x10) { + datagrid[row * 2][(col * 4) + 3] = '1'; + } + if (stream[i] & 0x08) { + datagrid[(row * 2) + 1][col * 4] = '1'; + } + if (stream[i] & 0x04) { + datagrid[(row * 2) + 1][(col * 4) + 1] = '1'; + } + if (stream[i] & 0x02) { + datagrid[(row * 2) + 1][(col * 4) + 2] = '1'; + } + if (stream[i] & 0x01) { + datagrid[(row * 2) + 1][(col * 4) + 3] = '1'; + } + i++; + } + } + + symbol->rows = c1_height[size - 1]; + symbol->width = c1_width[size - 1]; + } + + switch (size) { + case 1: /* Version A */ + central_finder(symbol, 6, 3, 1); + vert(symbol, 4, 6, 1); + vert(symbol, 12, 5, 0); + set_module(symbol, 5, 12); + spigot(symbol, 0); + spigot(symbol, 15); + block_copy(symbol, datagrid, 0, 0, 5, 4, 0, 0); + block_copy(symbol, datagrid, 0, 4, 5, 12, 0, 2); + block_copy(symbol, datagrid, 5, 0, 5, 12, 6, 0); + block_copy(symbol, datagrid, 5, 12, 5, 4, 6, 2); + break; + case 2: /* Version B */ + central_finder(symbol, 8, 4, 1); + vert(symbol, 4, 8, 1); + vert(symbol, 16, 7, 0); + set_module(symbol, 7, 16); + spigot(symbol, 0); + spigot(symbol, 21); + block_copy(symbol, datagrid, 0, 0, 7, 4, 0, 0); + block_copy(symbol, datagrid, 0, 4, 7, 16, 0, 2); + block_copy(symbol, datagrid, 7, 0, 7, 16, 8, 0); + block_copy(symbol, datagrid, 7, 16, 7, 4, 8, 2); + break; + case 3: /* Version C */ + central_finder(symbol, 11, 4, 2); + vert(symbol, 4, 11, 1); + vert(symbol, 26, 13, 1); + vert(symbol, 4, 10, 0); + vert(symbol, 26, 10, 0); + spigot(symbol, 0); + spigot(symbol, 27); + block_copy(symbol, datagrid, 0, 0, 10, 4, 0, 0); + block_copy(symbol, datagrid, 0, 4, 10, 20, 0, 2); + block_copy(symbol, datagrid, 0, 24, 10, 4, 0, 4); + block_copy(symbol, datagrid, 10, 0, 10, 4, 8, 0); + block_copy(symbol, datagrid, 10, 4, 10, 20, 8, 2); + block_copy(symbol, datagrid, 10, 24, 10, 4, 8, 4); + break; + case 4: /* Version D */ + central_finder(symbol, 16, 5, 1); + vert(symbol, 4, 16, 1); + vert(symbol, 20, 16, 1); + vert(symbol, 36, 16, 1); + vert(symbol, 4, 15, 0); + vert(symbol, 20, 15, 0); + vert(symbol, 36, 15, 0); + spigot(symbol, 0); + spigot(symbol, 12); + spigot(symbol, 27); + spigot(symbol, 39); + block_copy(symbol, datagrid, 0, 0, 15, 4, 0, 0); + block_copy(symbol, datagrid, 0, 4, 15, 14, 0, 2); + block_copy(symbol, datagrid, 0, 18, 15, 14, 0, 4); + block_copy(symbol, datagrid, 0, 32, 15, 4, 0, 6); + block_copy(symbol, datagrid, 15, 0, 15, 4, 10, 0); + block_copy(symbol, datagrid, 15, 4, 15, 14, 10, 2); + block_copy(symbol, datagrid, 15, 18, 15, 14, 10, 4); + block_copy(symbol, datagrid, 15, 32, 15, 4, 10, 6); + break; + case 5: /* Version E */ + central_finder(symbol, 22, 5, 2); + vert(symbol, 4, 22, 1); + vert(symbol, 26, 24, 1); + vert(symbol, 48, 22, 1); + vert(symbol, 4, 21, 0); + vert(symbol, 26, 21, 0); + vert(symbol, 48, 21, 0); + spigot(symbol, 0); + spigot(symbol, 12); + spigot(symbol, 39); + spigot(symbol, 51); + block_copy(symbol, datagrid, 0, 0, 21, 4, 0, 0); + block_copy(symbol, datagrid, 0, 4, 21, 20, 0, 2); + block_copy(symbol, datagrid, 0, 24, 21, 20, 0, 4); + block_copy(symbol, datagrid, 0, 44, 21, 4, 0, 6); + block_copy(symbol, datagrid, 21, 0, 21, 4, 10, 0); + block_copy(symbol, datagrid, 21, 4, 21, 20, 10, 2); + block_copy(symbol, datagrid, 21, 24, 21, 20, 10, 4); + block_copy(symbol, datagrid, 21, 44, 21, 4, 10, 6); + break; + case 6: /* Version F */ + central_finder(symbol, 31, 5, 3); + vert(symbol, 4, 31, 1); + vert(symbol, 26, 35, 1); + vert(symbol, 48, 31, 1); + vert(symbol, 70, 35, 1); + vert(symbol, 4, 30, 0); + vert(symbol, 26, 30, 0); + vert(symbol, 48, 30, 0); + vert(symbol, 70, 30, 0); + spigot(symbol, 0); + spigot(symbol, 12); + spigot(symbol, 24); + spigot(symbol, 45); + spigot(symbol, 57); + spigot(symbol, 69); + block_copy(symbol, datagrid, 0, 0, 30, 4, 0, 0); + block_copy(symbol, datagrid, 0, 4, 30, 20, 0, 2); + block_copy(symbol, datagrid, 0, 24, 30, 20, 0, 4); + block_copy(symbol, datagrid, 0, 44, 30, 20, 0, 6); + block_copy(symbol, datagrid, 0, 64, 30, 4, 0, 8); + block_copy(symbol, datagrid, 30, 0, 30, 4, 10, 0); + block_copy(symbol, datagrid, 30, 4, 30, 20, 10, 2); + block_copy(symbol, datagrid, 30, 24, 30, 20, 10, 4); + block_copy(symbol, datagrid, 30, 44, 30, 20, 10, 6); + block_copy(symbol, datagrid, 30, 64, 30, 4, 10, 8); + break; + case 7: /* Version G */ + central_finder(symbol, 47, 6, 2); + vert(symbol, 6, 47, 1); + vert(symbol, 27, 49, 1); + vert(symbol, 48, 47, 1); + vert(symbol, 69, 49, 1); + vert(symbol, 90, 47, 1); + vert(symbol, 6, 46, 0); + vert(symbol, 27, 46, 0); + vert(symbol, 48, 46, 0); + vert(symbol, 69, 46, 0); + vert(symbol, 90, 46, 0); + spigot(symbol, 0); + spigot(symbol, 12); + spigot(symbol, 24); + spigot(symbol, 36); + spigot(symbol, 67); + spigot(symbol, 79); + spigot(symbol, 91); + spigot(symbol, 103); + block_copy(symbol, datagrid, 0, 0, 46, 6, 0, 0); + block_copy(symbol, datagrid, 0, 6, 46, 19, 0, 2); + block_copy(symbol, datagrid, 0, 25, 46, 19, 0, 4); + block_copy(symbol, datagrid, 0, 44, 46, 19, 0, 6); + block_copy(symbol, datagrid, 0, 63, 46, 19, 0, 8); + block_copy(symbol, datagrid, 0, 82, 46, 6, 0, 10); + block_copy(symbol, datagrid, 46, 0, 46, 6, 12, 0); + block_copy(symbol, datagrid, 46, 6, 46, 19, 12, 2); + block_copy(symbol, datagrid, 46, 25, 46, 19, 12, 4); + block_copy(symbol, datagrid, 46, 44, 46, 19, 12, 6); + block_copy(symbol, datagrid, 46, 63, 46, 19, 12, 8); + block_copy(symbol, datagrid, 46, 82, 46, 6, 12, 10); + break; + case 8: /* Version H */ + central_finder(symbol, 69, 6, 3); + vert(symbol, 6, 69, 1); + vert(symbol, 26, 73, 1); + vert(symbol, 46, 69, 1); + vert(symbol, 66, 73, 1); + vert(symbol, 86, 69, 1); + vert(symbol, 106, 73, 1); + vert(symbol, 126, 69, 1); + vert(symbol, 6, 68, 0); + vert(symbol, 26, 68, 0); + vert(symbol, 46, 68, 0); + vert(symbol, 66, 68, 0); + vert(symbol, 86, 68, 0); + vert(symbol, 106, 68, 0); + vert(symbol, 126, 68, 0); + spigot(symbol, 0); + spigot(symbol, 12); + spigot(symbol, 24); + spigot(symbol, 36); + spigot(symbol, 48); + spigot(symbol, 60); + spigot(symbol, 87); + spigot(symbol, 99); + spigot(symbol, 111); + spigot(symbol, 123); + spigot(symbol, 135); + spigot(symbol, 147); + block_copy(symbol, datagrid, 0, 0, 68, 6, 0, 0); + block_copy(symbol, datagrid, 0, 6, 68, 18, 0, 2); + block_copy(symbol, datagrid, 0, 24, 68, 18, 0, 4); + block_copy(symbol, datagrid, 0, 42, 68, 18, 0, 6); + block_copy(symbol, datagrid, 0, 60, 68, 18, 0, 8); + block_copy(symbol, datagrid, 0, 78, 68, 18, 0, 10); + block_copy(symbol, datagrid, 0, 96, 68, 18, 0, 12); + block_copy(symbol, datagrid, 0, 114, 68, 6, 0, 14); + block_copy(symbol, datagrid, 68, 0, 68, 6, 12, 0); + block_copy(symbol, datagrid, 68, 6, 68, 18, 12, 2); + block_copy(symbol, datagrid, 68, 24, 68, 18, 12, 4); + block_copy(symbol, datagrid, 68, 42, 68, 18, 12, 6); + block_copy(symbol, datagrid, 68, 60, 68, 18, 12, 8); + block_copy(symbol, datagrid, 68, 78, 68, 18, 12, 10); + block_copy(symbol, datagrid, 68, 96, 68, 18, 12, 12); + block_copy(symbol, datagrid, 68, 114, 68, 6, 12, 14); + break; + case 9: /* Version S */ + horiz(symbol, 5, 1); + horiz(symbol, 7, 1); + set_module(symbol, 6, 0); + set_module(symbol, 6, symbol->width - 1); + unset_module(symbol, 7, 1); + unset_module(symbol, 7, symbol->width - 2); + switch (sub_version) { + case 1: /* Version S-10 */ + set_module(symbol, 0, 5); + block_copy(symbol, datagrid, 0, 0, 4, 5, 0, 0); + block_copy(symbol, datagrid, 0, 5, 4, 5, 0, 1); + break; + case 2: /* Version S-20 */ + set_module(symbol, 0, 10); + set_module(symbol, 4, 10); + block_copy(symbol, datagrid, 0, 0, 4, 10, 0, 0); + block_copy(symbol, datagrid, 0, 10, 4, 10, 0, 1); + break; + case 3: /* Version S-30 */ + set_module(symbol, 0, 15); + set_module(symbol, 4, 15); + set_module(symbol, 6, 15); + block_copy(symbol, datagrid, 0, 0, 4, 15, 0, 0); + block_copy(symbol, datagrid, 0, 15, 4, 15, 0, 1); + break; + } + break; + case 10: /* Version T */ + horiz(symbol, 11, 1); + horiz(symbol, 13, 1); + horiz(symbol, 15, 1); + set_module(symbol, 12, 0); + set_module(symbol, 12, symbol->width - 1); + set_module(symbol, 14, 0); + set_module(symbol, 14, symbol->width - 1); + unset_module(symbol, 13, 1); + unset_module(symbol, 13, symbol->width - 2); + unset_module(symbol, 15, 1); + unset_module(symbol, 15, symbol->width - 2); + switch (sub_version) { + case 1: /* Version T-16 */ + set_module(symbol, 0, 8); + set_module(symbol, 10, 8); + block_copy(symbol, datagrid, 0, 0, 10, 8, 0, 0); + block_copy(symbol, datagrid, 0, 8, 10, 8, 0, 1); + break; + case 2: /* Version T-32 */ + set_module(symbol, 0, 16); + set_module(symbol, 10, 16); + set_module(symbol, 12, 16); + block_copy(symbol, datagrid, 0, 0, 10, 16, 0, 0); + block_copy(symbol, datagrid, 0, 16, 10, 16, 0, 1); + break; + case 3: /* Verion T-48 */ + set_module(symbol, 0, 24); + set_module(symbol, 10, 24); + set_module(symbol, 12, 24); + set_module(symbol, 14, 24); + block_copy(symbol, datagrid, 0, 0, 10, 24, 0, 0); + block_copy(symbol, datagrid, 0, 24, 10, 24, 0, 1); + break; + } + break; + } + + for (i = 0; i < symbol->rows; i++) { + symbol->row_height[i] = 1; + } + + return 0; } diff --git a/backend/code1.h b/backend/code1.h index 860392b9..3bdc4f31 100644 --- a/backend/code1.h +++ b/backend/code1.h @@ -2,7 +2,7 @@ /* libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart + Copyright (C) 2009-2016 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -28,41 +28,71 @@ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + */ static const int c40_shift[] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 +}; static const int c40_value[] = { - 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, - 3,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,4,5,6,7,8,9,10,11,12,13, - 15,16,17,18,19,20,21,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39, - 22,23,24,25,26,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 }; + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 15, 16, 17, 18, 19, 20, 21, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 22, 23, 24, 25, 26, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 +}; static const int text_shift[] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 2, 2, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3 }; + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3 +}; static const int text_value[] = { - 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, - 3,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,4,5,6,7,8,9,10,11,12,13, - 15,16,17,18,19,20,21,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26, - 22,23,24,25,26,0,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,27,28,29,30,31 }; + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 15, 16, 17, 18, 19, 20, 21, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 22, 23, 24, 25, 26, 0, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 27, 28, 29, 30, 31 +}; -static const int c1_height[] = { 16, 22, 28, 40, 52, 70, 104, 148 }; -static const int c1_width[] = { 18, 22, 32, 42, 54, 76, 98, 134 }; -static const int c1_data_length[] = { 10, 19, 44, 91, 182, 370, 732, 1480 }; -static const int c1_ecc_length[] = { 10, 16, 26, 44, 70, 140, 280, 560 }; -static const int c1_blocks[] = { 1, 1, 1, 1, 1, 2, 4, 8 }; -static const int c1_data_blocks[] = { 10, 19, 44, 91, 182, 185, 183, 185 }; -static const int c1_ecc_blocks[] = { 10, 16, 26, 44, 70, 70, 70, 70 }; -static const int c1_grid_width[] = { 4, 5, 7, 9, 12, 17, 22, 30 }; -static const int c1_grid_height[] = { 5, 7, 10, 15, 21, 30, 46, 68 }; +static const int c1_height[] = { + 16, 22, 28, 40, 52, 70, 104, 148 +}; + +static const int c1_width[] = { + 18, 22, 32, 42, 54, 76, 98, 134 +}; + +static const int c1_data_length[] = { + 10, 19, 44, 91, 182, 370, 732, 1480 +}; + +static const int c1_ecc_length[] = { + 10, 16, 26, 44, 70, 140, 280, 560 +}; + +static const int c1_blocks[] = { + 1, 1, 1, 1, 1, 2, 4, 8 +}; + +static const int c1_data_blocks[] = { + 10, 19, 44, 91, 182, 185, 183, 185 +}; + +static const int c1_ecc_blocks[] = { + 10, 16, 26, 44, 70, 70, 70, 70 +}; + +static const int c1_grid_width[] = { + 4, 5, 7, 9, 12, 17, 22, 30 +}; + +static const int c1_grid_height[] = { + 5, 7, 10, 15, 21, 30, 46, 68 +}; #define C1_ASCII 1 #define C1_C40 2 diff --git a/backend/code128.c b/backend/code128.c index 2fd0be34..7db14441 100644 --- a/backend/code128.c +++ b/backend/code128.c @@ -2,7 +2,7 @@ /* libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart + Copyright (C) 2008-2016 Robin Stuart Bugfixes thanks to Christian Sakowski and BogDan Vatra Redistribution and use in source and binary forms, with or without @@ -29,7 +29,7 @@ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + */ #include #include @@ -57,105 +57,182 @@ static int list[2][170]; /* Code 128 tables checked against ISO/IEC 15417:2007 */ -static const char *C128Table[107] = {"212222", "222122", "222221", "121223", "121322", "131222", "122213", - "122312", "132212", "221213", "221312", "231212", "112232", "122132", "122231", "113222", - "123122", "123221", "223211", "221132", "221231", "213212", "223112", "312131", "311222", - "321122", "321221", "312212", "322112", "322211", "212123", "212321", "232121", "111323", - "131123", "131321", "112313", "132113", "132311", "211313", "231113", "231311", "112133", - "112331", "132131", "113123", "113321", "133121", "313121", "211331", "231131", "213113", - "213311", "213131", "311123", "311321", "331121", "312113", "312311", "332111", "314111", - "221411", "431111", "111224", "111422", "121124", "121421", "141122", "141221", "112214", - "112412", "122114", "122411", "142112", "142211", "241211", "221114", "413111", "241112", - "134111", "111242", "121142", "121241", "114212", "124112", "124211", "411212", "421112", - "421211", "212141", "214121", "412121", "111143", "111341", "131141", "114113", "114311", - "411113", "411311", "113141", "114131", "311141", "411131", "211412", "211214", "211232", - "2331112"}; -/* Code 128 character encodation - Table 1 */ +static const char *C128Table[107] = { + /* Code 128 character encodation - Table 1 */ + "212222", "222122", "222221", "121223", "121322", "131222", "122213", + "122312", "132212", "221213", "221312", "231212", "112232", "122132", "122231", "113222", + "123122", "123221", "223211", "221132", "221231", "213212", "223112", "312131", "311222", + "321122", "321221", "312212", "322112", "322211", "212123", "212321", "232121", "111323", + "131123", "131321", "112313", "132113", "132311", "211313", "231113", "231311", "112133", + "112331", "132131", "113123", "113321", "133121", "313121", "211331", "231131", "213113", + "213311", "213131", "311123", "311321", "331121", "312113", "312311", "332111", "314111", + "221411", "431111", "111224", "111422", "121124", "121421", "141122", "141221", "112214", + "112412", "122114", "122411", "142112", "142211", "241211", "221114", "413111", "241112", + "134111", "111242", "121142", "121241", "114212", "124112", "124211", "411212", "421112", + "421211", "212141", "214121", "412121", "111143", "111341", "131141", "114113", "114311", + "411113", "411311", "113141", "114131", "311141", "411131", "211412", "211214", "211232", + "2331112" +}; -int parunmodd(unsigned char llyth) -{ - int modd; - modd = 0; - - if(llyth <= 31) { modd = SHIFTA; } - else if((llyth >= 48) && (llyth <= 57)) { modd = ABORC; } - else if(llyth <= 95) { modd = AORB; } - else if(llyth <= 127) { modd = SHIFTB; } - else if(llyth <= 159) { modd = SHIFTA; } - else if(llyth <= 223) { modd = AORB; } - else { modd = SHIFTB; } - - return modd; +/* Determine appropriate mode for a given character */ +int parunmodd(unsigned char llyth) { + int modd; + modd = 0; + + if (llyth <= 31) { + modd = SHIFTA; + } else if ((llyth >= 48) && (llyth <= 57)) { + modd = ABORC; + } else if (llyth <= 95) { + modd = AORB; + } else if (llyth <= 127) { + modd = SHIFTB; + } else if (llyth <= 159) { + modd = SHIFTA; + } else if (llyth <= 223) { + modd = AORB; + } else { + modd = SHIFTB; + } + + return modd; } /** * bring together same type blocks */ -void grwp(int *indexliste) -{ - int i, j; - - /* bring together same type blocks */ - if(*(indexliste) > 1) { - i = 1; - while(i < *(indexliste)) { - if(list[1][i - 1] == list[1][i]) { - /* bring together */ - list[0][i - 1] = list[0][i - 1] + list[0][i]; - j = i + 1; - - /* decreace the list */ - while(j < *(indexliste)) { - list[0][j - 1] = list[0][j]; - list[1][j - 1] = list[1][j]; - j++; - } - *(indexliste) = *(indexliste) - 1; - i--; - } - i++; - } - } +void grwp(int *indexliste) { + int i, j; + + /* bring together same type blocks */ + if (*(indexliste) > 1) { + i = 1; + while (i < *(indexliste)) { + if (list[1][i - 1] == list[1][i]) { + /* bring together */ + list[0][i - 1] = list[0][i - 1] + list[0][i]; + j = i + 1; + + /* decreace the list */ + while (j < *(indexliste)) { + list[0][j - 1] = list[0][j]; + list[1][j - 1] = list[1][j]; + j++; + } + *(indexliste) = *(indexliste) - 1; + i--; + } + i++; + } + } } /** * Implements rules from ISO 15417 Annex E */ -void dxsmooth(int *indexliste) -{ /* Implements rules from ISO 15417 Annex E */ - int i, current, last, next, length; - - for(i = 0; i < *(indexliste); i++) { - current = list[1][i]; - length = list[0][i]; - if(i != 0) { last = list[1][i - 1]; } else { last = FALSE; } - if(i != *(indexliste) - 1) { next = list[1][i + 1]; } else { next = FALSE; } - - if(i == 0) { /* first block */ - if((*(indexliste) == 1) && ((length == 2) && (current == ABORC))) { /* Rule 1a */ list[1][i] = LATCHC; } - if(current == ABORC) { - if(length >= 4) {/* Rule 1b */ list[1][i] = LATCHC; } else { list[1][i] = AORB; current = AORB; } - } - if(current == SHIFTA) { /* Rule 1c */ list[1][i] = LATCHA; } - if((current == AORB) && (next == SHIFTA)) { /* Rule 1c */ list[1][i] = LATCHA; current = LATCHA; } - if(current == AORB) { /* Rule 1d */ list[1][i] = LATCHB; } - } else { - if((current == ABORC) && (length >= 4)) { /* Rule 3 */ list[1][i] = LATCHC; current = LATCHC; } - if(current == ABORC) { list[1][i] = AORB; current = AORB; } - if((current == AORB) && (last == LATCHA)) { list[1][i] = LATCHA; current = LATCHA; } - if((current == AORB) && (last == LATCHB)) { list[1][i] = LATCHB; current = LATCHB; } - if((current == AORB) && (next == SHIFTA)) { list[1][i] = LATCHA; current = LATCHA; } - if((current == AORB) && (next == SHIFTB)) { list[1][i] = LATCHB; current = LATCHB; } - if(current == AORB) { list[1][i] = LATCHB; current = LATCHB; } - if((current == SHIFTA) && (length > 1)) { /* Rule 4 */ list[1][i] = LATCHA; current = LATCHA; } - if((current == SHIFTB) && (length > 1)) { /* Rule 5 */ list[1][i] = LATCHB; current = LATCHB; } - if((current == SHIFTA) && (last == LATCHA)) { list[1][i] = LATCHA; current = LATCHA; } - if((current == SHIFTB) && (last == LATCHB)) { list[1][i] = LATCHB; current = LATCHB; } - if((current == SHIFTA) && (last == LATCHC)) { list[1][i] = LATCHA; current = LATCHA; } - if((current == SHIFTB) && (last == LATCHC)) { list[1][i] = LATCHB; current = LATCHB; } - } /* Rule 2 is implimented elsewhere, Rule 6 is implied */ - } - grwp(indexliste); +void dxsmooth(int *indexliste) { + int i, current, last, next, length; + + for (i = 0; i < *(indexliste); i++) { + current = list[1][i]; + length = list[0][i]; + if (i != 0) { + last = list[1][i - 1]; + } else { + last = FALSE; + } + if (i != *(indexliste) - 1) { + next = list[1][i + 1]; + } else { + next = FALSE; + } + + if (i == 0) { /* first block */ + if ((*(indexliste) == 1) && ((length == 2) && (current == ABORC))) { + /* Rule 1a */ + list[1][i] = LATCHC; + } + if (current == ABORC) { + if (length >= 4) { + /* Rule 1b */ + list[1][i] = LATCHC; + } else { + list[1][i] = AORB; + current = AORB; + } + } + if (current == SHIFTA) { + /* Rule 1c */ + list[1][i] = LATCHA; + } + if ((current == AORB) && (next == SHIFTA)) { + /* Rule 1c */ + list[1][i] = LATCHA; + current = LATCHA; + } + if (current == AORB) { + /* Rule 1d */ + list[1][i] = LATCHB; + } + } else { + if ((current == ABORC) && (length >= 4)) { + /* Rule 3 */ + list[1][i] = LATCHC; + current = LATCHC; + } + if (current == ABORC) { + list[1][i] = AORB; + current = AORB; + } + if ((current == AORB) && (last == LATCHA)) { + list[1][i] = LATCHA; + current = LATCHA; + } + if ((current == AORB) && (last == LATCHB)) { + list[1][i] = LATCHB; + current = LATCHB; + } + if ((current == AORB) && (next == SHIFTA)) { + list[1][i] = LATCHA; + current = LATCHA; + } + if ((current == AORB) && (next == SHIFTB)) { + list[1][i] = LATCHB; + current = LATCHB; + } + if (current == AORB) { + list[1][i] = LATCHB; + current = LATCHB; + } + if ((current == SHIFTA) && (length > 1)) { + /* Rule 4 */ + list[1][i] = LATCHA; + current = LATCHA; + } + if ((current == SHIFTB) && (length > 1)) { + /* Rule 5 */ + list[1][i] = LATCHB; + current = LATCHB; + } + if ((current == SHIFTA) && (last == LATCHA)) { + list[1][i] = LATCHA; + current = LATCHA; + } + if ((current == SHIFTB) && (last == LATCHB)) { + list[1][i] = LATCHB; + current = LATCHB; + } + if ((current == SHIFTA) && (last == LATCHC)) { + list[1][i] = LATCHA; + current = LATCHA; + } + if ((current == SHIFTB) && (last == LATCHC)) { + list[1][i] = LATCHB; + current = LATCHB; + } + } /* Rule 2 is implimented elsewhere, Rule 6 is implied */ + } + grwp(indexliste); } @@ -163,28 +240,26 @@ void dxsmooth(int *indexliste) * Translate Code 128 Set A characters into barcodes. * This set handles all control characters NULL to US. */ -void c128_set_a(unsigned char source, char dest[], int values[], int *bar_chars) -{ /* Translate Code 128 Set A characters into barcodes */ - /* This set handles all control characters NULL to US */ - - if(source > 127) { - if(source < 160) { - concat(dest, C128Table[(source - 128) + 64]); - values[(*bar_chars)] = (source - 128) + 64; - } else { - concat(dest, C128Table[(source - 128) - 32]); - values[(*bar_chars)] = (source - 128) - 32; - } - } else { - if(source < 32) { - concat(dest, C128Table[source + 64]); - values[(*bar_chars)] = source + 64; - } else { - concat(dest, C128Table[source - 32]); - values[(*bar_chars)] = source - 32; - } - } - (*bar_chars)++; +void c128_set_a(unsigned char source, char dest[], int values[], int *bar_chars) { + + if (source > 127) { + if (source < 160) { + concat(dest, C128Table[(source - 128) + 64]); + values[(*bar_chars)] = (source - 128) + 64; + } else { + concat(dest, C128Table[(source - 128) - 32]); + values[(*bar_chars)] = (source - 128) - 32; + } + } else { + if (source < 32) { + concat(dest, C128Table[source + 64]); + values[(*bar_chars)] = source + 64; + } else { + concat(dest, C128Table[source - 32]); + values[(*bar_chars)] = source - 32; + } + } + (*bar_chars)++; } /** @@ -192,822 +267,821 @@ void c128_set_a(unsigned char source, char dest[], int values[], int *bar_chars) * This set handles all characters which are not part of long numbers and not * control characters. */ -void c128_set_b(unsigned char source, char dest[], int values[], int *bar_chars) -{ - if(source > 127) { - concat(dest, C128Table[source - 32 - 128]); - values[(*bar_chars)] = source - 32 - 128; - } else { - concat(dest, C128Table[source - 32]); - values[(*bar_chars)] = source - 32; - } - (*bar_chars)++; +void c128_set_b(unsigned char source, char dest[], int values[], int *bar_chars) { + if (source > 127) { + concat(dest, C128Table[source - 32 - 128]); + values[(*bar_chars)] = source - 32 - 128; + } else { + concat(dest, C128Table[source - 32]); + values[(*bar_chars)] = source - 32; + } + (*bar_chars)++; } -void c128_set_c(unsigned char source_a, unsigned char source_b, char dest[], int values[], int *bar_chars) -{ /* Translate Code 128 Set C characters into barcodes */ - /* This set handles numbers in a compressed form */ - int weight; - - weight = (10 * ctoi(source_a)) + ctoi(source_b); - concat(dest, C128Table[weight]); - values[(*bar_chars)] = weight; - (*bar_chars)++; +/* Translate Code 128 Set C characters into barcodes + * This set handles numbers in a compressed form + */ +void c128_set_c(unsigned char source_a, unsigned char source_b, char dest[], int values[], int *bar_chars) { + int weight; + + weight = (10 * ctoi(source_a)) + ctoi(source_b); + concat(dest, C128Table[weight]); + values[(*bar_chars)] = weight; + (*bar_chars)++; } -int code_128(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Handle Code 128 and NVE-18 */ - int i, j, k,values[170] = { 0 }, bar_characters, read, total_sum; - int error_number, indexchaine, indexliste, sourcelen, f_state; - char set[170] = { ' ' }, fset[170] = { ' ' }, mode, last_set, current_set = ' '; - float glyph_count; - char dest[1000]; +/* Handle Code 128 and NVE-18 */ +int code_128(struct zint_symbol *symbol, unsigned char source[], int length) { + int i, j, k, values[170] = {0}, bar_characters, read, total_sum; + int error_number, indexchaine, indexliste, sourcelen, f_state; + char set[170] = {' '}, fset[170] = {' '}, mode, last_set, current_set = ' '; + float glyph_count; + char dest[1000]; - error_number = 0; - strcpy(dest, ""); + error_number = 0; + strcpy(dest, ""); - sourcelen = length; - - j = 0; - bar_characters = 0; - f_state = 0; + sourcelen = length; - if(sourcelen > 160) { - /* This only blocks rediculously long input - the actual length of the - resulting barcode depends on the type of data, so this is trapped later */ - strcpy(symbol->errtxt, "Input too long"); - return ZINT_ERROR_TOO_LONG; - } + j = 0; + bar_characters = 0; + f_state = 0; - /* Detect extended ASCII characters */ - for(i = 0; i < sourcelen; i++) { - if(source[i] >= 128) - fset[i] = 'f'; - } - fset[i] = '\0'; - - /* Decide when to latch to extended mode - Annex E note 3 */ - j = 0; - for(i = 0; i < sourcelen; i++) { - if(fset[i] == 'f') { - j++; - } else { - j = 0; - } + if (sourcelen > 160) { + /* This only blocks rediculously long input - the actual length of the + resulting barcode depends on the type of data, so this is trapped later */ + strcpy(symbol->errtxt, "Input too long"); + return ZINT_ERROR_TOO_LONG; + } - if(j >= 5) { - for(k = i; k > (i - 5); k--) { - fset[k] = 'F'; - } - } + /* Detect extended ASCII characters */ + for (i = 0; i < sourcelen; i++) { + if (source[i] >= 128) + fset[i] = 'f'; + } + fset[i] = '\0'; - if((j >= 3) && (i == (sourcelen - 1))) { - for(k = i; k > (i - 3); k--) { - fset[k] = 'F'; - } - } - } - - /* Decide if it is worth reverting to 646 encodation for a few characters as described in 4.3.4.2 (d) */ - for(i = 1; i < sourcelen; i++) { - if((fset[i - 1] == 'F') && (fset[i] == ' ')) { - /* Detected a change from 8859-1 to 646 - count how long for */ - for(j = 0; (fset[i + j] == ' ') && ((i + j) < sourcelen); j++); - if((j < 5) || ((j < 3) && ((i + j) == (sourcelen - 1)))) { - /* Uses the same figures recommended by Annex E note 3 */ - /* Change to shifting back rather than latching back */ - for(k = 0; k < j; k++) { - fset[i + k] = 'n'; - } - } - } - } + /* Decide when to latch to extended mode - Annex E note 3 */ + j = 0; + for (i = 0; i < sourcelen; i++) { + if (fset[i] == 'f') { + j++; + } else { + j = 0; + } - /* Decide on mode using same system as PDF417 and rules of ISO 15417 Annex E */ - indexliste = 0; - indexchaine = 0; + if (j >= 5) { + for (k = i; k > (i - 5); k--) { + fset[k] = 'F'; + } + } - mode = parunmodd(source[indexchaine]); - if((symbol->symbology == BARCODE_CODE128B) && (mode == ABORC)) { - mode = AORB; - } - - for(i = 0; i < 170; i++) { - list[0][i] = 0; - } + if ((j >= 3) && (i == (sourcelen - 1))) { + for (k = i; k > (i - 3); k--) { + fset[k] = 'F'; + } + } + } - do { - list[1][indexliste] = mode; - while ((list[1][indexliste] == mode) && (indexchaine < sourcelen)) { - list[0][indexliste]++; - indexchaine++; - mode = parunmodd(source[indexchaine]); - if((symbol->symbology == BARCODE_CODE128B) && (mode == ABORC)) { - mode = AORB; - } - } - indexliste++; - } while (indexchaine < sourcelen); + /* Decide if it is worth reverting to 646 encodation for a few characters as described in 4.3.4.2 (d) */ + for (i = 1; i < sourcelen; i++) { + if ((fset[i - 1] == 'F') && (fset[i] == ' ')) { + /* Detected a change from 8859-1 to 646 - count how long for */ + for (j = 0; (fset[i + j] == ' ') && ((i + j) < sourcelen); j++); + if ((j < 5) || ((j < 3) && ((i + j) == (sourcelen - 1)))) { + /* Uses the same figures recommended by Annex E note 3 */ + /* Change to shifting back rather than latching back */ + for (k = 0; k < j; k++) { + fset[i + k] = 'n'; + } + } + } + } - dxsmooth(&indexliste); + /* Decide on mode using same system as PDF417 and rules of ISO 15417 Annex E */ + indexliste = 0; + indexchaine = 0; - /* Resolve odd length LATCHC blocks */ - if((list[1][0] == LATCHC) && (list[0][0] & 1)) { - /* Rule 2 */ - list[0][1]++; - list[0][0]--; - if(indexliste == 1) { - list[0][1] = 1; - list[1][1] = LATCHB; - indexliste = 2; - } - } - if(indexliste > 1) { - for(i = 1; i < indexliste; i++) { - if((list[1][i] == LATCHC) && (list[0][i] & 1)) { - /* Rule 3b */ - list[0][i - 1]++; - list[0][i]--; - } - } - } + mode = parunmodd(source[indexchaine]); + if ((symbol->symbology == BARCODE_CODE128B) && (mode == ABORC)) { + mode = AORB; + } - /* Put set data into set[] */ + for (i = 0; i < 170; i++) { + list[0][i] = 0; + } - read = 0; - for(i = 0; i < indexliste; i++) { - for(j = 0; j < list[0][i]; j++) { - switch(list[1][i]) { - case SHIFTA: set[read] = 'a'; break; - case LATCHA: set[read] = 'A'; break; - case SHIFTB: set[read] = 'b'; break; - case LATCHB: set[read] = 'B'; break; - case LATCHC: set[read] = 'C'; break; - } - read++; - } - } + do { + list[1][indexliste] = mode; + while ((list[1][indexliste] == mode) && (indexchaine < sourcelen)) { + list[0][indexliste]++; + indexchaine++; + mode = parunmodd(source[indexchaine]); + if ((symbol->symbology == BARCODE_CODE128B) && (mode == ABORC)) { + mode = AORB; + } + } + indexliste++; + } while (indexchaine < sourcelen); - /* Adjust for strings which start with shift characters - make them latch instead */ - if(set[0] == 'a') { - i = 0; - do { - set[i] = 'A'; - i++; - } while (set[i] == 'a'); - } - - if(set[0] == 'b') { - i = 0; - do { - set[i] = 'B'; - i++; - } while (set[i] == 'b'); - } - - /* Now we can calculate how long the barcode is going to be - and stop it from - being too long */ - last_set = ' '; - glyph_count = 0.0; - for(i = 0; i < sourcelen; i++) { - if((set[i] == 'a') || (set[i] == 'b')) { - glyph_count = glyph_count + 1.0; - } - if((fset[i] == 'f') || (fset[i] == 'n')) { - glyph_count = glyph_count + 1.0; - } - if(((set[i] == 'A') || (set[i] == 'B')) || (set[i] == 'C')) { - if(set[i] != last_set) { - last_set = set[i]; - glyph_count = glyph_count + 1.0; - } - } - if(i == 0) { - if(fset[i] == 'F') { - glyph_count = glyph_count + 2.0; - } - } else { - if((fset[i] == 'F') && (fset[i - 1] != 'F')) { - glyph_count = glyph_count + 2.0; - } - if((fset[i] != 'F') && (fset[i - 1] == 'F')) { - glyph_count = glyph_count + 2.0; - } - } + dxsmooth(&indexliste); - if(set[i] == 'C') { - glyph_count = glyph_count + 0.5; - } else { - glyph_count = glyph_count + 1.0; - } - } - if(glyph_count > 80.0) { - strcpy(symbol->errtxt, "Input too long"); - return ZINT_ERROR_TOO_LONG; - } + /* Resolve odd length LATCHC blocks */ + if ((list[1][0] == LATCHC) && (list[0][0] & 1)) { + /* Rule 2 */ + list[0][1]++; + list[0][0]--; + if (indexliste == 1) { + list[0][1] = 1; + list[1][1] = LATCHB; + indexliste = 2; + } + } + if (indexliste > 1) { + for (i = 1; i < indexliste; i++) { + if ((list[1][i] == LATCHC) && (list[0][i] & 1)) { + /* Rule 3b */ + list[0][i - 1]++; + list[0][i]--; + } + } + } - /* So now we know what start character to use - we can get on with it! */ - if(symbol->output_options & READER_INIT) { - /* Reader Initialisation mode */ - switch(set[0]) { - case 'A': /* Start A */ - concat(dest, C128Table[103]); - values[0] = 103; - current_set = 'A'; - concat(dest, C128Table[96]); /* FNC3 */ - values[1] = 96; - bar_characters++; - break; - case 'B': /* Start B */ - concat(dest, C128Table[104]); - values[0] = 104; - current_set = 'B'; - concat(dest, C128Table[96]); /* FNC3 */ - values[1] = 96; - bar_characters++; - break; - case 'C': /* Start C */ - concat(dest, C128Table[104]); /* Start B */ - values[0] = 105; - concat(dest, C128Table[96]); /* FNC3 */ - values[1] = 96; - concat(dest, C128Table[99]); /* Code C */ - values[2] = 99; - bar_characters += 2; - current_set = 'C'; - break; - } - } else { - /* Normal mode */ - switch(set[0]) { - case 'A': /* Start A */ - concat(dest, C128Table[103]); - values[0] = 103; - current_set = 'A'; - break; - case 'B': /* Start B */ - concat(dest, C128Table[104]); - values[0] = 104; - current_set = 'B'; - break; - case 'C': /* Start C */ - concat(dest, C128Table[105]); - values[0] = 105; - current_set = 'C'; - break; - } - } - bar_characters++; - last_set = set[0]; + /* Put set data into set[] */ - if(fset[0] == 'F') { - switch(current_set) { - case 'A': - concat(dest, C128Table[101]); - concat(dest, C128Table[101]); - values[bar_characters] = 101; - values[bar_characters + 1] = 101; - break; - case 'B': - concat(dest, C128Table[100]); - concat(dest, C128Table[100]); - values[bar_characters] = 100; - values[bar_characters + 1] = 100; - break; - } - bar_characters += 2; - f_state = 1; - } + read = 0; + for (i = 0; i < indexliste; i++) { + for (j = 0; j < list[0][i]; j++) { + switch (list[1][i]) { + case SHIFTA: set[read] = 'a'; + break; + case LATCHA: set[read] = 'A'; + break; + case SHIFTB: set[read] = 'b'; + break; + case LATCHB: set[read] = 'B'; + break; + case LATCHC: set[read] = 'C'; + break; + } + read++; + } + } - /* Encode the data */ - read = 0; - do { + /* Adjust for strings which start with shift characters - make them latch instead */ + if (set[0] == 'a') { + i = 0; + do { + set[i] = 'A'; + i++; + } while (set[i] == 'a'); + } - if((read != 0) && (set[read] != current_set)) - { /* Latch different code set */ - switch(set[read]) - { - case 'A': concat(dest, C128Table[101]); - values[bar_characters] = 101; - bar_characters++; - current_set = 'A'; - break; - case 'B': concat(dest, C128Table[100]); - values[bar_characters] = 100; - bar_characters++; - current_set = 'B'; - break; - case 'C': concat(dest, C128Table[99]); - values[bar_characters] = 99; - bar_characters++; - current_set = 'C'; - break; - } - } + if (set[0] == 'b') { + i = 0; + do { + set[i] = 'B'; + i++; + } while (set[i] == 'b'); + } - if(read != 0) { - if((fset[read] == 'F') && (f_state == 0)) { - /* Latch beginning of extended mode */ - switch(current_set) { - case 'A': - concat(dest, C128Table[101]); - concat(dest, C128Table[101]); - values[bar_characters] = 101; - values[bar_characters + 1] = 101; - break; - case 'B': - concat(dest, C128Table[100]); - concat(dest, C128Table[100]); - values[bar_characters] = 100; - values[bar_characters + 1] = 100; - break; - } - bar_characters += 2; - f_state = 1; - } - if((fset[read] == ' ') && (f_state == 1)) { - /* Latch end of extended mode */ - switch(current_set) { - case 'A': - concat(dest, C128Table[101]); - concat(dest, C128Table[101]); - values[bar_characters] = 101; - values[bar_characters + 1] = 101; - break; - case 'B': - concat(dest, C128Table[100]); - concat(dest, C128Table[100]); - values[bar_characters] = 100; - values[bar_characters + 1] = 100; - break; - } - bar_characters += 2; - f_state = 0; - } - } + /* Now we can calculate how long the barcode is going to be - and stop it from + being too long */ + last_set = ' '; + glyph_count = 0.0; + for (i = 0; i < sourcelen; i++) { + if ((set[i] == 'a') || (set[i] == 'b')) { + glyph_count = glyph_count + 1.0; + } + if ((fset[i] == 'f') || (fset[i] == 'n')) { + glyph_count = glyph_count + 1.0; + } + if (((set[i] == 'A') || (set[i] == 'B')) || (set[i] == 'C')) { + if (set[i] != last_set) { + last_set = set[i]; + glyph_count = glyph_count + 1.0; + } + } + if (i == 0) { + if (fset[i] == 'F') { + glyph_count = glyph_count + 2.0; + } + } else { + if ((fset[i] == 'F') && (fset[i - 1] != 'F')) { + glyph_count = glyph_count + 2.0; + } + if ((fset[i] != 'F') && (fset[i - 1] == 'F')) { + glyph_count = glyph_count + 2.0; + } + } - if((fset[read] == 'f') || (fset[read] == 'n')) { - /* Shift to or from extended mode */ - switch(current_set) { - case 'A': - concat(dest, C128Table[101]); /* FNC 4 */ - values[bar_characters] = 101; - break; - case 'B': - concat(dest, C128Table[100]); /* FNC 4 */ - values[bar_characters] = 100; - break; - } - bar_characters++; - } + if (set[i] == 'C') { + glyph_count = glyph_count + 0.5; + } else { + glyph_count = glyph_count + 1.0; + } + } + if (glyph_count > 80.0) { + strcpy(symbol->errtxt, "Input too long"); + return ZINT_ERROR_TOO_LONG; + } - if((set[read] == 'a') || (set[read] == 'b')) { - /* Insert shift character */ - concat(dest, C128Table[98]); - values[bar_characters] = 98; - bar_characters++; - } + /* So now we know what start character to use - we can get on with it! */ + if (symbol->output_options & READER_INIT) { + /* Reader Initialisation mode */ + switch (set[0]) { + case 'A': /* Start A */ + concat(dest, C128Table[103]); + values[0] = 103; + current_set = 'A'; + concat(dest, C128Table[96]); /* FNC3 */ + values[1] = 96; + bar_characters++; + break; + case 'B': /* Start B */ + concat(dest, C128Table[104]); + values[0] = 104; + current_set = 'B'; + concat(dest, C128Table[96]); /* FNC3 */ + values[1] = 96; + bar_characters++; + break; + case 'C': /* Start C */ + concat(dest, C128Table[104]); /* Start B */ + values[0] = 105; + concat(dest, C128Table[96]); /* FNC3 */ + values[1] = 96; + concat(dest, C128Table[99]); /* Code C */ + values[2] = 99; + bar_characters += 2; + current_set = 'C'; + break; + } + } else { + /* Normal mode */ + switch (set[0]) { + case 'A': /* Start A */ + concat(dest, C128Table[103]); + values[0] = 103; + current_set = 'A'; + break; + case 'B': /* Start B */ + concat(dest, C128Table[104]); + values[0] = 104; + current_set = 'B'; + break; + case 'C': /* Start C */ + concat(dest, C128Table[105]); + values[0] = 105; + current_set = 'C'; + break; + } + } + bar_characters++; + last_set = set[0]; - switch(set[read]) - { /* Encode data characters */ - case 'a': - case 'A': c128_set_a(source[read], dest, values, &bar_characters); - read++; - break; - case 'b': - case 'B': c128_set_b(source[read], dest, values, &bar_characters); - read++; - break; - case 'C': c128_set_c(source[read], source[read + 1], dest, values, &bar_characters); - read += 2; - break; - } + if (fset[0] == 'F') { + switch (current_set) { + case 'A': + concat(dest, C128Table[101]); + concat(dest, C128Table[101]); + values[bar_characters] = 101; + values[bar_characters + 1] = 101; + break; + case 'B': + concat(dest, C128Table[100]); + concat(dest, C128Table[100]); + values[bar_characters] = 100; + values[bar_characters + 1] = 100; + break; + } + bar_characters += 2; + f_state = 1; + } - } while (read < sourcelen); + /* Encode the data */ + read = 0; + do { - /* check digit calculation */ - total_sum = 0; - /*for(i = 0; i < bar_characters; i++) { - printf("%d\n", values[i]); - }*/ - - for(i = 0; i < bar_characters; i++) - { - if(i > 0) - { - values[i] *= i; - } - total_sum += values[i]; - } - concat(dest, C128Table[total_sum%103]); - - /* Stop character */ - concat(dest, C128Table[106]); - expand(symbol, dest); - return error_number; + if ((read != 0) && (set[read] != current_set)) { + /* Latch different code set */ + switch (set[read]) { + case 'A': concat(dest, C128Table[101]); + values[bar_characters] = 101; + bar_characters++; + current_set = 'A'; + break; + case 'B': concat(dest, C128Table[100]); + values[bar_characters] = 100; + bar_characters++; + current_set = 'B'; + break; + case 'C': concat(dest, C128Table[99]); + values[bar_characters] = 99; + bar_characters++; + current_set = 'C'; + break; + } + } + + if (read != 0) { + if ((fset[read] == 'F') && (f_state == 0)) { + /* Latch beginning of extended mode */ + switch (current_set) { + case 'A': + concat(dest, C128Table[101]); + concat(dest, C128Table[101]); + values[bar_characters] = 101; + values[bar_characters + 1] = 101; + break; + case 'B': + concat(dest, C128Table[100]); + concat(dest, C128Table[100]); + values[bar_characters] = 100; + values[bar_characters + 1] = 100; + break; + } + bar_characters += 2; + f_state = 1; + } + if ((fset[read] == ' ') && (f_state == 1)) { + /* Latch end of extended mode */ + switch (current_set) { + case 'A': + concat(dest, C128Table[101]); + concat(dest, C128Table[101]); + values[bar_characters] = 101; + values[bar_characters + 1] = 101; + break; + case 'B': + concat(dest, C128Table[100]); + concat(dest, C128Table[100]); + values[bar_characters] = 100; + values[bar_characters + 1] = 100; + break; + } + bar_characters += 2; + f_state = 0; + } + } + + if ((fset[read] == 'f') || (fset[read] == 'n')) { + /* Shift to or from extended mode */ + switch (current_set) { + case 'A': + concat(dest, C128Table[101]); /* FNC 4 */ + values[bar_characters] = 101; + break; + case 'B': + concat(dest, C128Table[100]); /* FNC 4 */ + values[bar_characters] = 100; + break; + } + bar_characters++; + } + + if ((set[read] == 'a') || (set[read] == 'b')) { + /* Insert shift character */ + concat(dest, C128Table[98]); + values[bar_characters] = 98; + bar_characters++; + } + + switch (set[read]) { /* Encode data characters */ + case 'a': + case 'A': c128_set_a(source[read], dest, values, &bar_characters); + read++; + break; + case 'b': + case 'B': c128_set_b(source[read], dest, values, &bar_characters); + read++; + break; + case 'C': c128_set_c(source[read], source[read + 1], dest, values, &bar_characters); + read += 2; + break; + } + + } while (read < sourcelen); + + /* check digit calculation */ + total_sum = 0; + + for (i = 0; i < bar_characters; i++) { + if (i > 0) { + values[i] *= i; + } + total_sum += values[i]; + } + concat(dest, C128Table[total_sum % 103]); + + /* Stop character */ + concat(dest, C128Table[106]); + expand(symbol, dest); + return error_number; } -int ean_128(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Handle EAN-128 (Now known as GS1-128) */ - int i, j,values[170], bar_characters, read, total_sum; - int error_number, indexchaine, indexliste; - char set[170], mode, last_set; - float glyph_count; - char dest[1000]; - int separator_row, linkage_flag, c_count; +/* Handle EAN-128 (Now known as GS1-128) */ +int ean_128(struct zint_symbol *symbol, unsigned char source[], int length) { + int i, j, values[170], bar_characters, read, total_sum; + int error_number, indexchaine, indexliste; + char set[170], mode, last_set; + float glyph_count; + char dest[1000]; + int separator_row, linkage_flag, c_count; #ifndef _MSC_VER - char reduced[length + 1]; + char reduced[length + 1]; #else - char* reduced = (char*)_alloca(length + 1); + char* reduced = (char*) _alloca(length + 1); #endif - error_number = 0; - strcpy(dest, ""); - linkage_flag = 0; + error_number = 0; + strcpy(dest, ""); + linkage_flag = 0; - j = 0; - bar_characters = 0; - separator_row = 0; + j = 0; + bar_characters = 0; + separator_row = 0; - memset(values, 0, sizeof(values)); - memset(set, ' ', sizeof(set)); + memset(values, 0, sizeof (values)); + memset(set, ' ', sizeof (set)); - if(length > 160) { - /* This only blocks rediculously long input - the actual length of the - resulting barcode depends on the type of data, so this is trapped later */ - strcpy(symbol->errtxt, "Input too long"); - return ZINT_ERROR_TOO_LONG; - } - for(i = 0; i < length; i++) { - if(source[i] == '\0') { - /* Null characters not allowed! */ - strcpy(symbol->errtxt, "NULL character in input data"); - return ZINT_ERROR_INVALID_DATA; - } - } + if (length > 160) { + /* This only blocks rediculously long input - the actual length of the + resulting barcode depends on the type of data, so this is trapped later */ + strcpy(symbol->errtxt, "Input too long"); + return ZINT_ERROR_TOO_LONG; + } + for (i = 0; i < length; i++) { + if (source[i] == '\0') { + /* Null characters not allowed! */ + strcpy(symbol->errtxt, "NULL character in input data"); + return ZINT_ERROR_INVALID_DATA; + } + } - /* if part of a composite symbol make room for the separator pattern */ - if(symbol->symbology == BARCODE_EAN128_CC) { - separator_row = symbol->rows; - symbol->row_height[symbol->rows] = 1; - symbol->rows += 1; - } + /* if part of a composite symbol make room for the separator pattern */ + if (symbol->symbology == BARCODE_EAN128_CC) { + separator_row = symbol->rows; + symbol->row_height[symbol->rows] = 1; + symbol->rows += 1; + } - if(symbol->input_mode != GS1_MODE) { - /* GS1 data has not been checked yet */ - error_number = gs1_verify(symbol, source, length, reduced); - if(error_number != 0) { return error_number; } - } + if (symbol->input_mode != GS1_MODE) { + /* GS1 data has not been checked yet */ + error_number = gs1_verify(symbol, source, length, reduced); + if (error_number != 0) { + return error_number; + } + } - /* Decide on mode using same system as PDF417 and rules of ISO 15417 Annex E */ - indexliste = 0; - indexchaine = 0; + /* Decide on mode using same system as PDF417 and rules of ISO 15417 Annex E */ + indexliste = 0; + indexchaine = 0; - mode = parunmodd(reduced[indexchaine]); - if(reduced[indexchaine] == '[') { - mode = ABORC; - } - - for(i = 0; i < 170; i++) { - list[0][i] = 0; - } - - do { - list[1][indexliste] = mode; - while ((list[1][indexliste] == mode) && (indexchaine < strlen(reduced))) { - list[0][indexliste]++; - indexchaine++; - mode = parunmodd(reduced[indexchaine]); - if(reduced[indexchaine] == '[') { mode = ABORC; } - } - indexliste++; - } while (indexchaine < strlen(reduced)); + mode = parunmodd(reduced[indexchaine]); + if (reduced[indexchaine] == '[') { + mode = ABORC; + } - dxsmooth(&indexliste); + for (i = 0; i < 170; i++) { + list[0][i] = 0; + } - /* Put set data into set[] */ - read = 0; - for(i = 0; i < indexliste; i++) { - for(j = 0; j < list[0][i]; j++) { - switch(list[1][i]) { - case SHIFTA: set[read] = 'a'; break; - case LATCHA: set[read] = 'A'; break; - case SHIFTB: set[read] = 'b'; break; - case LATCHB: set[read] = 'B'; break; - case LATCHC: set[read] = 'C'; break; - } - read++; - } - } + do { + list[1][indexliste] = mode; + while ((list[1][indexliste] == mode) && (indexchaine < strlen(reduced))) { + list[0][indexliste]++; + indexchaine++; + mode = parunmodd(reduced[indexchaine]); + if (reduced[indexchaine] == '[') { + mode = ABORC; + } + } + indexliste++; + } while (indexchaine < strlen(reduced)); - /* Watch out for odd-length Mode C blocks */ - c_count = 0; - for(i = 0; i < read; i++) { - if(set[i] == 'C') { - if(reduced[i] == '[') { - if(c_count & 1) { - if((i - c_count) != 0) { - set[i - c_count] = 'B'; - } else { - set[i - 1] = 'B'; - } - } - c_count = 0; - } else { - c_count++; - } - } else { - if(c_count & 1) { - if((i - c_count) != 0) { - set[i - c_count] = 'B'; - } else { - set[i - 1] = 'B'; - } - } - c_count = 0; - } - } - if(c_count & 1) { - if((i - c_count) != 0) { - set[i - c_count] = 'B'; - } else { - set[i - 1] = 'B'; - } - } - for(i = 1; i < read - 1; i++) { - if((set[i] == 'C') && ((set[i - 1] == 'B') && (set[i + 1] == 'B'))) { - set[i] = 'B'; - } - } + dxsmooth(&indexliste); - /* for(i = 0; i < read; i++) { - printf("char %c mode %c\n", reduced[i], set[i]); - } */ - - /* Now we can calculate how long the barcode is going to be - and stop it from - being too long */ - last_set = ' '; - glyph_count = 0.0; - for(i = 0; i < strlen(reduced); i++) { - if((set[i] == 'a') || (set[i] == 'b')) { - glyph_count = glyph_count + 1.0; - } - if(((set[i] == 'A') || (set[i] == 'B')) || (set[i] == 'C')) { - if(set[i] != last_set) { - last_set = set[i]; - glyph_count = glyph_count + 1.0; - } - } + /* Put set data into set[] */ + read = 0; + for (i = 0; i < indexliste; i++) { + for (j = 0; j < list[0][i]; j++) { + switch (list[1][i]) { + case SHIFTA: set[read] = 'a'; + break; + case LATCHA: set[read] = 'A'; + break; + case SHIFTB: set[read] = 'b'; + break; + case LATCHB: set[read] = 'B'; + break; + case LATCHC: set[read] = 'C'; + break; + } + read++; + } + } - if((set[i] == 'C') && (reduced[i] != '[')) { - glyph_count = glyph_count + 0.5; - } else { - glyph_count = glyph_count + 1.0; - } - } - if(glyph_count > 80.0) { - strcpy(symbol->errtxt, "Input too long"); - return ZINT_ERROR_TOO_LONG; - } + /* Watch out for odd-length Mode C blocks */ + c_count = 0; + for (i = 0; i < read; i++) { + if (set[i] == 'C') { + if (reduced[i] == '[') { + if (c_count & 1) { + if ((i - c_count) != 0) { + set[i - c_count] = 'B'; + } else { + set[i - 1] = 'B'; + } + } + c_count = 0; + } else { + c_count++; + } + } else { + if (c_count & 1) { + if ((i - c_count) != 0) { + set[i - c_count] = 'B'; + } else { + set[i - 1] = 'B'; + } + } + c_count = 0; + } + } + if (c_count & 1) { + if ((i - c_count) != 0) { + set[i - c_count] = 'B'; + } else { + set[i - 1] = 'B'; + } + } + for (i = 1; i < read - 1; i++) { + if ((set[i] == 'C') && ((set[i - 1] == 'B') && (set[i + 1] == 'B'))) { + set[i] = 'B'; + } + } - /* So now we know what start character to use - we can get on with it! */ - switch(set[0]) - { - case 'A': /* Start A */ - concat(dest, C128Table[103]); - values[0] = 103; - break; - case 'B': /* Start B */ - concat(dest, C128Table[104]); - values[0] = 104; - break; - case 'C': /* Start C */ - concat(dest, C128Table[105]); - values[0] = 105; - break; - } - bar_characters++; + /* Now we can calculate how long the barcode is going to be - and stop it from + being too long */ + last_set = ' '; + glyph_count = 0.0; + for (i = 0; i < strlen(reduced); i++) { + if ((set[i] == 'a') || (set[i] == 'b')) { + glyph_count = glyph_count + 1.0; + } + if (((set[i] == 'A') || (set[i] == 'B')) || (set[i] == 'C')) { + if (set[i] != last_set) { + last_set = set[i]; + glyph_count = glyph_count + 1.0; + } + } - concat(dest, C128Table[102]); - values[1] = 102; - bar_characters++; + if ((set[i] == 'C') && (reduced[i] != '[')) { + glyph_count = glyph_count + 0.5; + } else { + glyph_count = glyph_count + 1.0; + } + } + if (glyph_count > 80.0) { + strcpy(symbol->errtxt, "Input too long"); + return ZINT_ERROR_TOO_LONG; + } - /* Encode the data */ - read = 0; - do { + /* So now we know what start character to use - we can get on with it! */ + switch (set[0]) { + case 'A': /* Start A */ + concat(dest, C128Table[103]); + values[0] = 103; + break; + case 'B': /* Start B */ + concat(dest, C128Table[104]); + values[0] = 104; + break; + case 'C': /* Start C */ + concat(dest, C128Table[105]); + values[0] = 105; + break; + } + bar_characters++; - if((read != 0) && (set[read] != set[read - 1])) - { /* Latch different code set */ - switch(set[read]) - { - case 'A': concat(dest, C128Table[101]); - values[bar_characters] = 101; - bar_characters++; - break; - case 'B': concat(dest, C128Table[100]); - values[bar_characters] = 100; - bar_characters++; - break; - case 'C': concat(dest, C128Table[99]); - values[bar_characters] = 99; - bar_characters++; - break; - } - } + concat(dest, C128Table[102]); + values[1] = 102; + bar_characters++; - if((set[read] == 'a') || (set[read] == 'b')) { - /* Insert shift character */ - concat(dest, C128Table[98]); - values[bar_characters] = 98; - bar_characters++; - } + /* Encode the data */ + read = 0; + do { - if(reduced[read] != '[') { - switch(set[read]) - { /* Encode data characters */ - case 'A': - case 'a': - c128_set_a(reduced[read], dest, values, &bar_characters); - read++; - break; - case 'B': - case 'b': - c128_set_b(reduced[read], dest, values, &bar_characters); - read++; - break; - case 'C': - c128_set_c(reduced[read], reduced[read + 1], dest, values, &bar_characters); - read += 2; - break; - } - } else { - concat(dest, C128Table[102]); - values[bar_characters] = 102; - bar_characters++; - read++; - } - } while (read < strlen(reduced)); + if ((read != 0) && (set[read] != set[read - 1])) { /* Latch different code set */ + switch (set[read]) { + case 'A': concat(dest, C128Table[101]); + values[bar_characters] = 101; + bar_characters++; + break; + case 'B': concat(dest, C128Table[100]); + values[bar_characters] = 100; + bar_characters++; + break; + case 'C': concat(dest, C128Table[99]); + values[bar_characters] = 99; + bar_characters++; + break; + } + } - /* "...note that the linkage flag is an extra code set character between - the last data character and the Symbol Check Character" (GS1 Specification) */ - - /* Linkage flags in GS1-128 are determined by ISO/IEC 24723 section 7.4 */ + if ((set[read] == 'a') || (set[read] == 'b')) { + /* Insert shift character */ + concat(dest, C128Table[98]); + values[bar_characters] = 98; + bar_characters++; + } - switch(symbol->option_1) { - case 1: - case 2: - /* CC-A or CC-B 2D component */ - switch(set[strlen(reduced) - 1]) { - case 'A': linkage_flag = 100; break; - case 'B': linkage_flag = 99; break; - case 'C': linkage_flag = 101; break; - } - break; - case 3: - /* CC-C 2D component */ - switch(set[strlen(reduced) - 1]) { - case 'A': linkage_flag = 99; break; - case 'B': linkage_flag = 101; break; - case 'C': linkage_flag = 100; break; - } - break; - } + if (reduced[read] != '[') { + switch (set[read]) { /* Encode data characters */ + case 'A': + case 'a': + c128_set_a(reduced[read], dest, values, &bar_characters); + read++; + break; + case 'B': + case 'b': + c128_set_b(reduced[read], dest, values, &bar_characters); + read++; + break; + case 'C': + c128_set_c(reduced[read], reduced[read + 1], dest, values, &bar_characters); + read += 2; + break; + } + } else { + concat(dest, C128Table[102]); + values[bar_characters] = 102; + bar_characters++; + read++; + } + } while (read < strlen(reduced)); - if(linkage_flag != 0) { - concat(dest, C128Table[linkage_flag]); - values[bar_characters] = linkage_flag; - bar_characters++; - } - - /*for(i = 0; i < bar_characters; i++) { - printf("[%d] ", values[i]); - } - printf("\n");*/ - - /* check digit calculation */ - total_sum = 0; - for(i = 0; i < bar_characters; i++) - { - if(i > 0) - { - values[i] *= i; + /* "...note that the linkage flag is an extra code set character between + the last data character and the Symbol Check Character" (GS1 Specification) */ - } - total_sum += values[i]; - } - concat(dest, C128Table[total_sum%103]); - values[bar_characters] = total_sum % 103; - bar_characters++; + /* Linkage flags in GS1-128 are determined by ISO/IEC 24723 section 7.4 */ - /* Stop character */ - concat(dest, C128Table[106]); - values[bar_characters] = 106; - bar_characters++; - expand(symbol, dest); + switch (symbol->option_1) { + case 1: + case 2: + /* CC-A or CC-B 2D component */ + switch (set[strlen(reduced) - 1]) { + case 'A': linkage_flag = 100; + break; + case 'B': linkage_flag = 99; + break; + case 'C': linkage_flag = 101; + break; + } + break; + case 3: + /* CC-C 2D component */ + switch (set[strlen(reduced) - 1]) { + case 'A': linkage_flag = 99; + break; + case 'B': linkage_flag = 101; + break; + case 'C': linkage_flag = 100; + break; + } + break; + } - /* Add the separator pattern for composite symbols */ - if(symbol->symbology == BARCODE_EAN128_CC) { - for(i = 0; i < symbol->width; i++) { - if(!(module_is_set(symbol, separator_row + 1, i))) { - set_module(symbol, separator_row, i); - } - } - } + if (linkage_flag != 0) { + concat(dest, C128Table[linkage_flag]); + values[bar_characters] = linkage_flag; + bar_characters++; + } - for(i = 0; i < length; i++) { - if((source[i] != '[') && (source[i] != ']')) { - symbol->text[i] = source[i]; - } - if(source[i] == '[') { - symbol->text[i] = '('; - } - if(source[i] == ']') { - symbol->text[i] = ')'; - } - } + /* check digit calculation */ + total_sum = 0; + for (i = 0; i < bar_characters; i++) { + if (i > 0) { + values[i] *= i; - return error_number; + } + total_sum += values[i]; + } + concat(dest, C128Table[total_sum % 103]); + values[bar_characters] = total_sum % 103; + bar_characters++; + + /* Stop character */ + concat(dest, C128Table[106]); + values[bar_characters] = 106; + bar_characters++; + expand(symbol, dest); + + /* Add the separator pattern for composite symbols */ + if (symbol->symbology == BARCODE_EAN128_CC) { + for (i = 0; i < symbol->width; i++) { + if (!(module_is_set(symbol, separator_row + 1, i))) { + set_module(symbol, separator_row, i); + } + } + } + + for (i = 0; i < length; i++) { + if ((source[i] != '[') && (source[i] != ']')) { + symbol->text[i] = source[i]; + } + if (source[i] == '[') { + symbol->text[i] = '('; + } + if (source[i] == ']') { + symbol->text[i] = ')'; + } + } + + return error_number; } -int nve_18(struct zint_symbol *symbol, unsigned char source[], int length) -{ - /* Add check digit if encoding an NVE18 symbol */ - int error_number, zeroes, i, nve_check, total_sum, sourcelen; - unsigned char ean128_equiv[25]; +/* Add check digit if encoding an NVE18 symbol */ +int nve_18(struct zint_symbol *symbol, unsigned char source[], int length) { + int error_number, zeroes, i, nve_check, total_sum, sourcelen; + unsigned char ean128_equiv[25]; - memset(ean128_equiv, 0, 25); - sourcelen = length; + memset(ean128_equiv, 0, 25); + sourcelen = length; - if(sourcelen > 17) { - strcpy(symbol->errtxt, "Input too long"); - return ZINT_ERROR_TOO_LONG; - } + if (sourcelen > 17) { + strcpy(symbol->errtxt, "Input too long"); + return ZINT_ERROR_TOO_LONG; + } - error_number = is_sane(NEON, source, length); - if(error_number == ZINT_ERROR_INVALID_DATA) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - zeroes = 17 - sourcelen; - strcpy((char *)ean128_equiv, "[00]"); - memset(ean128_equiv + 4, '0', zeroes); - strcpy((char*)ean128_equiv + 4 + zeroes, (char*)source); + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Invalid characters in data"); + return error_number; + } + zeroes = 17 - sourcelen; + strcpy((char *) ean128_equiv, "[00]"); + memset(ean128_equiv + 4, '0', zeroes); + strcpy((char*) ean128_equiv + 4 + zeroes, (char*) source); - total_sum = 0; - for(i = sourcelen - 1; i >= 0; i--) - { - total_sum += ctoi(source[i]); + total_sum = 0; + for (i = sourcelen - 1; i >= 0; i--) { + total_sum += ctoi(source[i]); - if(!(i & 1)) { - total_sum += 2 * ctoi(source[i]); - } - } - nve_check = 10 - total_sum % 10; - if(nve_check == 10) { nve_check = 0; } - ean128_equiv[21] = itoc(nve_check); - ean128_equiv[22] = '\0'; + if (!(i & 1)) { + total_sum += 2 * ctoi(source[i]); + } + } + nve_check = 10 - total_sum % 10; + if (nve_check == 10) { + nve_check = 0; + } + ean128_equiv[21] = itoc(nve_check); + ean128_equiv[22] = '\0'; - error_number = ean_128(symbol, ean128_equiv, ustrlen(ean128_equiv)); + error_number = ean_128(symbol, ean128_equiv, ustrlen(ean128_equiv)); - return error_number; + return error_number; } -int ean_14(struct zint_symbol *symbol, unsigned char source[], int length) -{ - /* EAN-14 - A version of EAN-128 */ - int i, count, check_digit; - int error_number, zeroes; - unsigned char ean128_equiv[20]; +/* EAN-14 - A version of EAN-128 */ +int ean_14(struct zint_symbol *symbol, unsigned char source[], int length) { + int i, count, check_digit; + int error_number, zeroes; + unsigned char ean128_equiv[20]; - if(length > 13) { - strcpy(symbol->errtxt, "Input wrong length"); - return ZINT_ERROR_TOO_LONG; - } + if (length > 13) { + strcpy(symbol->errtxt, "Input wrong length"); + return ZINT_ERROR_TOO_LONG; + } - error_number = is_sane(NEON, source, length); - if(error_number == ZINT_ERROR_INVALID_DATA) { - strcpy(symbol->errtxt, "Invalid character in data"); - return error_number; - } + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "Invalid character in data"); + return error_number; + } - zeroes = 13 - length; - strcpy((char*)ean128_equiv, "[01]"); - memset(ean128_equiv + 4, '0', zeroes); - ustrcpy(ean128_equiv + 4 + zeroes, source); + zeroes = 13 - length; + strcpy((char*) ean128_equiv, "[01]"); + memset(ean128_equiv + 4, '0', zeroes); + ustrcpy(ean128_equiv + 4 + zeroes, source); - count = 0; - for (i = length - 1; i >= 0; i--) { - count += ctoi(source[i]); + count = 0; + for (i = length - 1; i >= 0; i--) { + count += ctoi(source[i]); - if (!(i & 1)) { - count += 2 * ctoi(source[i]); - } - } - check_digit = 10 - (count % 10); - if (check_digit == 10) { check_digit = 0; } - ean128_equiv[17] = itoc(check_digit); - ean128_equiv[18] = '\0'; + if (!(i & 1)) { + count += 2 * ctoi(source[i]); + } + } + check_digit = 10 - (count % 10); + if (check_digit == 10) { + check_digit = 0; + } + ean128_equiv[17] = itoc(check_digit); + ean128_equiv[18] = '\0'; - error_number = ean_128(symbol, ean128_equiv, ustrlen(ean128_equiv)); + error_number = ean_128(symbol, ean128_equiv, ustrlen(ean128_equiv)); - return error_number; + return error_number; } diff --git a/backend/code16k.c b/backend/code16k.c index 89805575..5e1c923d 100644 --- a/backend/code16k.c +++ b/backend/code16k.c @@ -2,20 +2,20 @@ /* libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart + Copyright (C) 2008-2016 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. + documentation and/or other materials provided with the distribution. 3. Neither the name of the project nor the names of its contributors may be used to endorse or promote products derived from this software - without specific prior written permission. + without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -26,13 +26,13 @@ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + */ /* Updated to comply with BS EN 12323:2005 */ -/* up to 77 characters or 154 numbers */ +/* Code 16k can hold up to 77 characters or 154 numbers */ #include #include @@ -54,575 +54,678 @@ static int list[2][170]; -/* EN 12323 Table 1 - "Code 16K" character encodations */ -static const char *C16KTable[107] = {"212222", "222122", "222221", "121223", "121322", "131222", "122213", - "122312", "132212", "221213", "221312", "231212", "112232", "122132", "122231", "113222", - "123122", "123221", "223211", "221132", "221231", "213212", "223112", "312131", "311222", - "321122", "321221", "312212", "322112", "322211", "212123", "212321", "232121", "111323", - "131123", "131321", "112313", "132113", "132311", "211313", "231113", "231311", "112133", - "112331", "132131", "113123", "113321", "133121", "313121", "211331", "231131", "213113", - "213311", "213131", "311123", "311321", "331121", "312113", "312311", "332111", "314111", - "221411", "431111", "111224", "111422", "121124", "121421", "141122", "141221", "112214", - "112412", "122114", "122411", "142112", "142211", "241211", "221114", "413111", "241112", - "134111", "111242", "121142", "121241", "114212", "124112", "124211", "411212", "421112", - "421211", "212141", "214121", "412121", "111143", "111341", "131141", "114113", "114311", - "411113", "411311", "113141", "114131", "311141", "411131", "211412", "211214", "211232", - "211133"}; +static const char *C16KTable[107] = { + /* EN 12323 Table 1 - "Code 16K" character encodations */ + "212222", "222122", "222221", "121223", "121322", "131222", "122213", + "122312", "132212", "221213", "221312", "231212", "112232", "122132", "122231", "113222", + "123122", "123221", "223211", "221132", "221231", "213212", "223112", "312131", "311222", + "321122", "321221", "312212", "322112", "322211", "212123", "212321", "232121", "111323", + "131123", "131321", "112313", "132113", "132311", "211313", "231113", "231311", "112133", + "112331", "132131", "113123", "113321", "133121", "313121", "211331", "231131", "213113", + "213311", "213131", "311123", "311321", "331121", "312113", "312311", "332111", "314111", + "221411", "431111", "111224", "111422", "121124", "121421", "141122", "141221", "112214", + "112412", "122114", "122411", "142112", "142211", "241211", "221114", "413111", "241112", + "134111", "111242", "121142", "121241", "114212", "124112", "124211", "411212", "421112", + "421211", "212141", "214121", "412121", "111143", "111341", "131141", "114113", "114311", + "411113", "411311", "113141", "114131", "311141", "411131", "211412", "211214", "211232", + "211133" +}; -/* EN 12323 Table 3 and Table 4 - Start patterns and stop patterns */ -static const char *C16KStartStop[8] = {"3211", "2221", "2122", "1411", "1132", "1231", "1114", "3112"}; + +static const char *C16KStartStop[8] = { + /* EN 12323 Table 3 and Table 4 - Start patterns and stop patterns */ + "3211", "2221", "2122", "1411", "1132", "1231", "1114", "3112" +}; /* EN 12323 Table 5 - Start and stop values defining row numbers */ -static const int C16KStartValues[16] = {0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7}; -static const int C16KStopValues[16] = {0, 1, 2, 3, 4, 5, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3}; +static const int C16KStartValues[16] = { + 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7 +}; -void grwp16(int *indexliste) -{ - int i, j; - - /* bring together same type blocks */ - if(*(indexliste) > 1) { - i = 1; - while(i < *(indexliste)) { - if(list[1][i - 1] == list[1][i]) { - /* bring together */ - list[0][i - 1] = list[0][i - 1] + list[0][i]; - j = i + 1; - - /* decreace the list */ - while(j < *(indexliste)) { - list[0][j - 1] = list[0][j]; - list[1][j - 1] = list[1][j]; - j++; - } - *(indexliste) = *(indexliste) - 1; - i--; - } - i++; - } - } +static const int C16KStopValues[16] = { + 0, 1, 2, 3, 4, 5, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3 +}; + +void grwp16(int *indexliste) { + int i, j; + + /* bring together same type blocks */ + if (*(indexliste) > 1) { + i = 1; + while (i < *(indexliste)) { + if (list[1][i - 1] == list[1][i]) { + /* bring together */ + list[0][i - 1] = list[0][i - 1] + list[0][i]; + j = i + 1; + + /* decreace the list */ + while (j < *(indexliste)) { + list[0][j - 1] = list[0][j]; + list[1][j - 1] = list[1][j]; + j++; + } + *(indexliste) = *(indexliste) - 1; + i--; + } + i++; + } + } } -void dxsmooth16(int *indexliste) -{ /* Implements rules from ISO 15417 Annex E */ - int i, current, last, next, length; - - for(i = 0; i < *(indexliste); i++) { - current = list[1][i]; - length = list[0][i]; - if(i != 0) { last = list[1][i - 1]; } else { last = FALSE; } - if(i != *(indexliste) - 1) { next = list[1][i + 1]; } else { next = FALSE; } - - if(i == 0) { /* first block */ - if((*(indexliste) == 1) && ((length == 2) && (current == ABORC))) { /* Rule 1a */ list[1][i] = LATCHC; } - if(current == ABORC) { - if(length >= 4) {/* Rule 1b */ list[1][i] = LATCHC; } else { list[1][i] = AORB; current = AORB; } - } - if(current == SHIFTA) { /* Rule 1c */ list[1][i] = LATCHA; } - if((current == AORB) && (next == SHIFTA)) { /* Rule 1c */ list[1][i] = LATCHA; current = LATCHA; } - if(current == AORB) { /* Rule 1d */ list[1][i] = LATCHB; } - } else { - if((current == ABORC) && (length >= 4)) { /* Rule 3 */ list[1][i] = LATCHC; current = LATCHC; } - if(current == ABORC) { list[1][i] = AORB; current = AORB; } - if((current == AORB) && (last == LATCHA)) { list[1][i] = LATCHA; current = LATCHA; } - if((current == AORB) && (last == LATCHB)) { list[1][i] = LATCHB; current = LATCHB; } - if((current == AORB) && (next == SHIFTA)) { list[1][i] = LATCHA; current = LATCHA; } - if((current == AORB) && (next == SHIFTB)) { list[1][i] = LATCHB; current = LATCHB; } - if(current == AORB) { list[1][i] = LATCHB; current = LATCHB; } - if((current == SHIFTA) && (length > 1)) { /* Rule 4 */ list[1][i] = LATCHA; current = LATCHA; } - if((current == SHIFTB) && (length > 1)) { /* Rule 5 */ list[1][i] = LATCHB; current = LATCHB; } - if((current == SHIFTA) && (last == LATCHA)) { list[1][i] = LATCHA; current = LATCHA; } - if((current == SHIFTB) && (last == LATCHB)) { list[1][i] = LATCHB; current = LATCHB; } - if((current == SHIFTA) && (last == LATCHC)) { list[1][i] = LATCHA; current = LATCHA; } - if((current == SHIFTB) && (last == LATCHC)) { list[1][i] = LATCHB; current = LATCHB; } - } /* Rule 2 is implimented elsewhere, Rule 6 is implied */ - } - grwp16(indexliste); +/* Implements rules from ISO 15417 Annex E */ +void dxsmooth16(int *indexliste) { + int i, current, last, next, length; + + for (i = 0; i < *(indexliste); i++) { + current = list[1][i]; + length = list[0][i]; + if (i != 0) { + last = list[1][i - 1]; + } else { + last = FALSE; + } + if (i != *(indexliste) - 1) { + next = list[1][i + 1]; + } else { + next = FALSE; + } + + if (i == 0) { + /* first block */ + if ((*(indexliste) == 1) && ((length == 2) && (current == ABORC))) { + /* Rule 1a */ + list[1][i] = LATCHC; + } + if (current == ABORC) { + if (length >= 4) { + /* Rule 1b */ + list[1][i] = LATCHC; + } else { + list[1][i] = AORB; + current = AORB; + } + } + if (current == SHIFTA) { + /* Rule 1c */ + list[1][i] = LATCHA; + } + if ((current == AORB) && (next == SHIFTA)) { + /* Rule 1c */ + list[1][i] = LATCHA; + current = LATCHA; + } + if (current == AORB) { + /* Rule 1d */ + list[1][i] = LATCHB; + } + } else { + if ((current == ABORC) && (length >= 4)) { + /* Rule 3 */ + list[1][i] = LATCHC; + current = LATCHC; + } + if (current == ABORC) { + list[1][i] = AORB; + current = AORB; + } + if ((current == AORB) && (last == LATCHA)) { + list[1][i] = LATCHA; + current = LATCHA; + } + if ((current == AORB) && (last == LATCHB)) { + list[1][i] = LATCHB; + current = LATCHB; + } + if ((current == AORB) && (next == SHIFTA)) { + list[1][i] = LATCHA; + current = LATCHA; + } + if ((current == AORB) && (next == SHIFTB)) { + list[1][i] = LATCHB; + current = LATCHB; + } + if (current == AORB) { + list[1][i] = LATCHB; + current = LATCHB; + } + if ((current == SHIFTA) && (length > 1)) { + /* Rule 4 */ + list[1][i] = LATCHA; + current = LATCHA; + } + if ((current == SHIFTB) && (length > 1)) { + /* Rule 5 */ + list[1][i] = LATCHB; + current = LATCHB; + } + if ((current == SHIFTA) && (last == LATCHA)) { + list[1][i] = LATCHA; + current = LATCHA; + } + if ((current == SHIFTB) && (last == LATCHB)) { + list[1][i] = LATCHB; + current = LATCHB; + } + if ((current == SHIFTA) && (last == LATCHC)) { + list[1][i] = LATCHA; + current = LATCHA; + } + if ((current == SHIFTB) && (last == LATCHC)) { + list[1][i] = LATCHB; + current = LATCHB; + } + } /* Rule 2 is implimented elsewhere, Rule 6 is implied */ + } + grwp16(indexliste); } -void c16k_set_a(unsigned char source, unsigned int values[], unsigned int *bar_chars) -{ - if(source > 127) { - if(source < 160) { - values[(*bar_chars)] = source + 64 - 128; - } else { - values[(*bar_chars)] = source - 32 - 128; - } - } else { - if(source < 32) { - values[(*bar_chars)] = source + 64; - } else { - values[(*bar_chars)] = source - 32; - } - } - (*bar_chars)++; +void c16k_set_a(unsigned char source, unsigned int values[], unsigned int *bar_chars) { + if (source > 127) { + if (source < 160) { + values[(*bar_chars)] = source + 64 - 128; + } else { + values[(*bar_chars)] = source - 32 - 128; + } + } else { + if (source < 32) { + values[(*bar_chars)] = source + 64; + } else { + values[(*bar_chars)] = source - 32; + } + } + (*bar_chars)++; } -void c16k_set_b(unsigned char source, unsigned int values[], unsigned int *bar_chars) -{ - if(source > 127) { - values[(*bar_chars)] = source - 32 - 128; - } else { - values[(*bar_chars)] = source - 32; - } - (*bar_chars)++; +void c16k_set_b(unsigned char source, unsigned int values[], unsigned int *bar_chars) { + if (source > 127) { + values[(*bar_chars)] = source - 32 - 128; + } else { + values[(*bar_chars)] = source - 32; + } + (*bar_chars)++; } -void c16k_set_c(unsigned char source_a, unsigned char source_b, unsigned int values[], unsigned int *bar_chars) -{ - int weight; +void c16k_set_c(unsigned char source_a, unsigned char source_b, unsigned int values[], unsigned int *bar_chars) { + int weight; - weight = (10 * ctoi(source_a)) + ctoi(source_b); - values[(*bar_chars)] = weight; - (*bar_chars)++; + weight = (10 * ctoi(source_a)) + ctoi(source_b); + values[(*bar_chars)] = weight; + (*bar_chars)++; } -int code16k(struct zint_symbol *symbol, unsigned char source[], int length) -{ - char width_pattern[100]; - int current_row, rows_needed, flip_flop, looper, first_check, second_check; - int indexliste, indexchaine, pads_needed, f_state; - char set[160] = { ' ' }, fset[160] = { ' ' }, mode, last_set,current_set; - unsigned int i, j, k, m,read, mx_reader, writer; - unsigned int values[160] = { 0 }; - unsigned int bar_characters; - float glyph_count; - int errornum, first_sum, second_sum; - int input_length; - int gs1, c_count; +int code16k(struct zint_symbol *symbol, unsigned char source[], int length) { + char width_pattern[100]; + int current_row, rows_needed, flip_flop, looper, first_check, second_check; + int indexliste, indexchaine, pads_needed, f_state; + char set[160] = {' '}, fset[160] = {' '}, mode, last_set, current_set; + unsigned int i, j, k, m, read, mx_reader, writer; + unsigned int values[160] = {0}; + unsigned int bar_characters; + float glyph_count; + int errornum, first_sum, second_sum; + int input_length; + int gs1, c_count; - errornum = 0; - strcpy(width_pattern, ""); - input_length = length; + errornum = 0; + strcpy(width_pattern, ""); + input_length = length; - if(symbol->input_mode == GS1_MODE) { gs1 = 1; } else { gs1 = 0; } + if (symbol->input_mode == GS1_MODE) { + gs1 = 1; + } else { + gs1 = 0; + } - if(input_length > 157) { - strcpy(symbol->errtxt, "Input too long"); - return ZINT_ERROR_TOO_LONG; - } + if (input_length > 157) { + strcpy(symbol->errtxt, "Input too long"); + return ZINT_ERROR_TOO_LONG; + } - bar_characters = 0; + bar_characters = 0; - /* Detect extended ASCII characters */ - for(i = 0; i < input_length; i++) { - if(source[i] >=128) { - fset[i] = 'f'; - } - } - fset[i] = '\0'; + /* Detect extended ASCII characters */ + for (i = 0; i < input_length; i++) { + if (source[i] >= 128) { + fset[i] = 'f'; + } + } + fset[i] = '\0'; - /* Decide when to latch to extended mode */ - for(i = 0; i < input_length; i++) { - j = 0; - if(fset[i] == 'f') { - do { - j++; - } while(fset[i + j] == 'f'); - if((j >= 5) || ((j >= 3) && ((i + j) == (input_length - 1)))) { - for(k = 0; k <= j; k++) { - fset[i + k] = 'F'; - } - } - } - } + /* Decide when to latch to extended mode */ + for (i = 0; i < input_length; i++) { + j = 0; + if (fset[i] == 'f') { + do { + j++; + } while (fset[i + j] == 'f'); + if ((j >= 5) || ((j >= 3) && ((i + j) == (input_length - 1)))) { + for (k = 0; k <= j; k++) { + fset[i + k] = 'F'; + } + } + } + } - /* Decide if it is worth reverting to 646 encodation for a few characters */ - if(input_length > 1) { - for(i = 1; i < input_length; i++) { - if((fset[i - 1] == 'F') && (fset[i] == ' ')) { - /* Detected a change from 8859-1 to 646 - count how long for */ - for(j = 0; (fset[i + j] == ' ') && ((i + j) < input_length); j++); - if((j < 5) || ((j < 3) && ((i + j) == (input_length - 1)))) { - /* Change to shifting back rather than latching back */ - for(k = 0; k < j; k++) { - fset[i + k] = 'n'; - } - } - } - } - } - /* Detect mode A, B and C characters */ - indexliste = 0; - indexchaine = 0; + /* Decide if it is worth reverting to 646 encodation for a few characters */ + if (input_length > 1) { + for (i = 1; i < input_length; i++) { + if ((fset[i - 1] == 'F') && (fset[i] == ' ')) { + /* Detected a change from 8859-1 to 646 - count how long for */ + for (j = 0; (fset[i + j] == ' ') && ((i + j) < input_length); j++); + if ((j < 5) || ((j < 3) && ((i + j) == (input_length - 1)))) { + /* Change to shifting back rather than latching back */ + for (k = 0; k < j; k++) { + fset[i + k] = 'n'; + } + } + } + } + } + /* Detect mode A, B and C characters */ + indexliste = 0; + indexchaine = 0; - mode = parunmodd(source[indexchaine]); - if((gs1) && (source[indexchaine] == '[')) { mode = ABORC; } /* FNC1 */ + mode = parunmodd(source[indexchaine]); + if ((gs1) && (source[indexchaine] == '[')) { + mode = ABORC; + } /* FNC1 */ - for(i = 0; i < 160; i++) { - list[0][i] = 0; - } + for (i = 0; i < 160; i++) { + list[0][i] = 0; + } - do { - list[1][indexliste] = mode; - while ((list[1][indexliste] == mode) && (indexchaine < input_length)) { - list[0][indexliste]++; - indexchaine++; - mode = parunmodd(source[indexchaine]); - if((gs1) && (source[indexchaine] == '[')) { mode = ABORC; } /* FNC1 */ - } - indexliste++; - } while (indexchaine < input_length); + do { + list[1][indexliste] = mode; + while ((list[1][indexliste] == mode) && (indexchaine < input_length)) { + list[0][indexliste]++; + indexchaine++; + mode = parunmodd(source[indexchaine]); + if ((gs1) && (source[indexchaine] == '[')) { + mode = ABORC; + } /* FNC1 */ + } + indexliste++; + } while (indexchaine < input_length); - dxsmooth16(&indexliste); + dxsmooth16(&indexliste); - /* Put set data into set[] */ - read = 0; - for(i = 0; i < indexliste; i++) { - for(j = 0; j < list[0][i]; j++) { - switch(list[1][i]) { - case SHIFTA: set[read] = 'a'; break; - case LATCHA: set[read] = 'A'; break; - case SHIFTB: set[read] = 'b'; break; - case LATCHB: set[read] = 'B'; break; - case LATCHC: set[read] = 'C'; break; - } - read++; - } - } + /* Put set data into set[] */ + read = 0; + for (i = 0; i < indexliste; i++) { + for (j = 0; j < list[0][i]; j++) { + switch (list[1][i]) { + case SHIFTA: set[read] = 'a'; + break; + case LATCHA: set[read] = 'A'; + break; + case SHIFTB: set[read] = 'b'; + break; + case LATCHB: set[read] = 'B'; + break; + case LATCHC: set[read] = 'C'; + break; + } + read++; + } + } - /* Adjust for strings which start with shift characters - make them latch instead */ - if(set[0] == 'a') { - i = 0; - do { - set[i] = 'A'; - i++; - } while (set[i] == 'a'); - } + /* Adjust for strings which start with shift characters - make them latch instead */ + if (set[0] == 'a') { + i = 0; + do { + set[i] = 'A'; + i++; + } while (set[i] == 'a'); + } - if(set[0] == 'b') { - i = 0; - do { - set[i] = 'B'; - i++; - } while (set[i] == 'b'); - } + if (set[0] == 'b') { + i = 0; + do { + set[i] = 'B'; + i++; + } while (set[i] == 'b'); + } - /* Watch out for odd-length Mode C blocks */ - c_count = 0; - for(i = 0; i < read; i++) { - if(set[i] == 'C') { - if(source[i] == '[') { - if(c_count & 1) { - if((i - c_count) != 0) { - set[i - c_count] = 'B'; - } else { - set[i - 1] = 'B'; - } - } - c_count = 0; - } else { - c_count++; - } - } else { - if(c_count & 1) { - if((i - c_count) != 0) { - set[i - c_count] = 'B'; - } else { - set[i - 1] = 'B'; - } - } - c_count = 0; - } - } - if(c_count & 1) { - if((i - c_count) != 0) { - set[i - c_count] = 'B'; - } else { - set[i - 1] = 'B'; - } - } - for(i = 1; i < read - 1; i++) { - if((set[i] == 'C') && ((set[i - 1] == 'B') && (set[i + 1] == 'B'))) { - set[i] = 'B'; - } - } + /* Watch out for odd-length Mode C blocks */ + c_count = 0; + for (i = 0; i < read; i++) { + if (set[i] == 'C') { + if (source[i] == '[') { + if (c_count & 1) { + if ((i - c_count) != 0) { + set[i - c_count] = 'B'; + } else { + set[i - 1] = 'B'; + } + } + c_count = 0; + } else { + c_count++; + } + } else { + if (c_count & 1) { + if ((i - c_count) != 0) { + set[i - c_count] = 'B'; + } else { + set[i - 1] = 'B'; + } + } + c_count = 0; + } + } + if (c_count & 1) { + if ((i - c_count) != 0) { + set[i - c_count] = 'B'; + } else { + set[i - 1] = 'B'; + } + } + for (i = 1; i < read - 1; i++) { + if ((set[i] == 'C') && ((set[i - 1] == 'B') && (set[i + 1] == 'B'))) { + set[i] = 'B'; + } + } - /* Make sure the data will fit in the symbol */ - last_set = ' '; - glyph_count = 0.0; - for(i = 0; i < input_length; i++) { - if((set[i] == 'a') || (set[i] == 'b')) { - glyph_count = glyph_count + 1.0; - } - if((fset[i] == 'f') || (fset[i] == 'n')) { - glyph_count = glyph_count + 1.0; - } - if(((set[i] == 'A') || (set[i] == 'B')) || (set[i] == 'C')) { - if(set[i] != last_set) { - last_set = set[i]; - glyph_count = glyph_count + 1.0; - } - } - if(i == 0) { - if((set[i] == 'B') && (set[1] == 'C')) { - glyph_count = glyph_count - 1.0; - } - if((set[i] == 'B') && (set[1] == 'B')) { - if(set[2] == 'C') { - glyph_count = glyph_count - 1.0; - } - } - if(fset[i] == 'F') { - glyph_count = glyph_count + 2.0; - } - } else { - if((fset[i] == 'F') && (fset[i - 1] != 'F')) { - glyph_count = glyph_count + 2.0; - } - if((fset[i] != 'F') && (fset[i - 1] == 'F')) { - glyph_count = glyph_count + 2.0; - } - } + /* Make sure the data will fit in the symbol */ + last_set = ' '; + glyph_count = 0.0; + for (i = 0; i < input_length; i++) { + if ((set[i] == 'a') || (set[i] == 'b')) { + glyph_count = glyph_count + 1.0; + } + if ((fset[i] == 'f') || (fset[i] == 'n')) { + glyph_count = glyph_count + 1.0; + } + if (((set[i] == 'A') || (set[i] == 'B')) || (set[i] == 'C')) { + if (set[i] != last_set) { + last_set = set[i]; + glyph_count = glyph_count + 1.0; + } + } + if (i == 0) { + if ((set[i] == 'B') && (set[1] == 'C')) { + glyph_count = glyph_count - 1.0; + } + if ((set[i] == 'B') && (set[1] == 'B')) { + if (set[2] == 'C') { + glyph_count = glyph_count - 1.0; + } + } + if (fset[i] == 'F') { + glyph_count = glyph_count + 2.0; + } + } else { + if ((fset[i] == 'F') && (fset[i - 1] != 'F')) { + glyph_count = glyph_count + 2.0; + } + if ((fset[i] != 'F') && (fset[i - 1] == 'F')) { + glyph_count = glyph_count + 2.0; + } + } - if((set[i] == 'C') && (!((gs1) && (source[i] == '[')))) { - glyph_count = glyph_count + 0.5; - } else { - glyph_count = glyph_count + 1.0; - } - } + if ((set[i] == 'C') && (!((gs1) && (source[i] == '[')))) { + glyph_count = glyph_count + 0.5; + } else { + glyph_count = glyph_count + 1.0; + } + } - if((gs1) && (set[0] != 'A')) { - /* FNC1 can be integrated with mode character */ - glyph_count--; - } + if ((gs1) && (set[0] != 'A')) { + /* FNC1 can be integrated with mode character */ + glyph_count--; + } - if(glyph_count > 77.0) { - strcpy(symbol->errtxt, "Input too long"); - return ZINT_ERROR_TOO_LONG; - } + if (glyph_count > 77.0) { + strcpy(symbol->errtxt, "Input too long"); + return ZINT_ERROR_TOO_LONG; + } - /* Calculate how tall the symbol will be */ - glyph_count = glyph_count + 2.0; - i = glyph_count; - rows_needed = (i/5); - if(i%5 > 0) { rows_needed++; } + /* Calculate how tall the symbol will be */ + glyph_count = glyph_count + 2.0; + i = glyph_count; + rows_needed = (i / 5); + if (i % 5 > 0) { + rows_needed++; + } - if(rows_needed == 1) { - rows_needed = 2; - } + if (rows_needed == 1) { + rows_needed = 2; + } - /* start with the mode character - Table 2 */ - m = 0; - switch(set[0]) { - case 'A': m = 0; break; - case 'B': m = 1; break; - case 'C': m = 2; break; - } + /* start with the mode character - Table 2 */ + m = 0; + switch (set[0]) { + case 'A': m = 0; + break; + case 'B': m = 1; + break; + case 'C': m = 2; + break; + } - if(symbol->output_options & READER_INIT) { - if(m == 2) { m = 5; } - if(gs1) { - strcpy(symbol->errtxt, "Cannot use both GS1 mode and Reader Initialisation"); - return ZINT_ERROR_INVALID_OPTION; - } else { - if((set[0] == 'B') && (set[1] == 'C')) { m = 6; } - } - values[bar_characters] = (7 * (rows_needed - 2)) + m; /* see 4.3.4.2 */ - values[bar_characters + 1] = 96; /* FNC3 */ - bar_characters += 2; - } else { - if(gs1) { - /* Integrate FNC1 */ - switch(set[0]) { - case 'B': m = 3; break; - case 'C': m = 4; break; - } - } else { - if((set[0] == 'B') && (set[1] == 'C')) { m = 5; } - if(((set[0] == 'B') && (set[1] == 'B')) && (set[2] == 'C')) { m = 6; } - } - values[bar_characters] = (7 * (rows_needed - 2)) + m; /* see 4.3.4.2 */ - bar_characters++; - } + if (symbol->output_options & READER_INIT) { + if (m == 2) { + m = 5; + } + if (gs1) { + strcpy(symbol->errtxt, "Cannot use both GS1 mode and Reader Initialisation"); + return ZINT_ERROR_INVALID_OPTION; + } else { + if ((set[0] == 'B') && (set[1] == 'C')) { + m = 6; + } + } + values[bar_characters] = (7 * (rows_needed - 2)) + m; /* see 4.3.4.2 */ + values[bar_characters + 1] = 96; /* FNC3 */ + bar_characters += 2; + } else { + if (gs1) { + /* Integrate FNC1 */ + switch (set[0]) { + case 'B': m = 3; + break; + case 'C': m = 4; + break; + } + } else { + if ((set[0] == 'B') && (set[1] == 'C')) { + m = 5; + } + if (((set[0] == 'B') && (set[1] == 'B')) && (set[2] == 'C')) { + m = 6; + } + } + values[bar_characters] = (7 * (rows_needed - 2)) + m; /* see 4.3.4.2 */ + bar_characters++; + } - current_set = set[0]; - f_state = 0; /* f_state remembers if we are in Extended ASCII mode (value 1) or + current_set = set[0]; + f_state = 0; + /* f_state remembers if we are in Extended ASCII mode (value 1) or in ISO/IEC 646 mode (value 0) */ - if(fset[0] == 'F') { - switch(current_set) { - case 'A': - values[bar_characters] = 101; - values[bar_characters + 1] = 101; - break; - case 'B': - values[bar_characters] = 100; - values[bar_characters + 1] = 100; - break; - } - bar_characters += 2; - f_state = 1; - } + if (fset[0] == 'F') { + switch (current_set) { + case 'A': + values[bar_characters] = 101; + values[bar_characters + 1] = 101; + break; + case 'B': + values[bar_characters] = 100; + values[bar_characters + 1] = 100; + break; + } + bar_characters += 2; + f_state = 1; + } - read = 0; + read = 0; - /* Encode the data */ - do { + /* Encode the data */ + do { - if((read != 0) && (set[read] != set[read - 1])) - { /* Latch different code set */ - switch(set[read]) - { - case 'A': - values[bar_characters] = 101; - bar_characters++; - current_set = 'A'; - break; - case 'B': - values[bar_characters] = 100; - bar_characters++; - current_set = 'B'; - break; - case 'C': - if(!((read == 1) && (set[0] == 'B'))) { /* Not Mode C/Shift B */ - if(!((read == 2) && ((set[0] == 'B') && (set[1] == 'B')))) { - /* Not Mode C/Double Shift B */ - values[bar_characters] = 99; - bar_characters++; - } - } - current_set = 'C'; - break; - } - } - /* printf("tp8\n"); */ - if(read != 0) { - if((fset[read] == 'F') && (f_state == 0)) { - /* Latch beginning of extended mode */ - switch(current_set) { - case 'A': - values[bar_characters] = 101; - values[bar_characters + 1] = 101; - break; - case 'B': - values[bar_characters] = 100; - values[bar_characters + 1] = 100; - break; - } - bar_characters += 2; - f_state = 1; - } - if((fset[read] == ' ') && (f_state == 1)) { - /* Latch end of extended mode */ - switch(current_set) { - case 'A': - values[bar_characters] = 101; - values[bar_characters + 1] = 101; - break; - case 'B': - values[bar_characters] = 100; - values[bar_characters + 1] = 100; - break; - } - bar_characters += 2; - f_state = 0; - } - } + if ((read != 0) && (set[read] != set[read - 1])) { + /* Latch different code set */ + switch (set[read]) { + case 'A': + values[bar_characters] = 101; + bar_characters++; + current_set = 'A'; + break; + case 'B': + values[bar_characters] = 100; + bar_characters++; + current_set = 'B'; + break; + case 'C': + if (!((read == 1) && (set[0] == 'B'))) { + /* Not Mode C/Shift B */ + if (!((read == 2) && ((set[0] == 'B') && (set[1] == 'B')))) { + /* Not Mode C/Double Shift B */ + values[bar_characters] = 99; + bar_characters++; + } + } + current_set = 'C'; + break; + } + } - if((fset[i] == 'f') || (fset[i] == 'n')) { - /* Shift extended mode */ - switch(current_set) { - case 'A': - values[bar_characters] = 101; /* FNC 4 */ - break; - case 'B': - values[bar_characters] = 100; /* FNC 4 */ - break; - } - bar_characters++; - } + if (read != 0) { + if ((fset[read] == 'F') && (f_state == 0)) { + /* Latch beginning of extended mode */ + switch (current_set) { + case 'A': + values[bar_characters] = 101; + values[bar_characters + 1] = 101; + break; + case 'B': + values[bar_characters] = 100; + values[bar_characters + 1] = 100; + break; + } + bar_characters += 2; + f_state = 1; + } + if ((fset[read] == ' ') && (f_state == 1)) { + /* Latch end of extended mode */ + switch (current_set) { + case 'A': + values[bar_characters] = 101; + values[bar_characters + 1] = 101; + break; + case 'B': + values[bar_characters] = 100; + values[bar_characters + 1] = 100; + break; + } + bar_characters += 2; + f_state = 0; + } + } - if((set[i] == 'a') || (set[i] == 'b')) { - /* Insert shift character */ - values[bar_characters] = 98; - bar_characters++; - } + if ((fset[i] == 'f') || (fset[i] == 'n')) { + /* Shift extended mode */ + switch (current_set) { + case 'A': + values[bar_characters] = 101; /* FNC 4 */ + break; + case 'B': + values[bar_characters] = 100; /* FNC 4 */ + break; + } + bar_characters++; + } - if(!((gs1) && (source[read] == '['))) { - switch(set[read]) - { /* Encode data characters */ - case 'A': - case 'a': - c16k_set_a(source[read], values, &bar_characters); - read++; - break; - case 'B': - case 'b': - c16k_set_b(source[read], values, &bar_characters); - read++; - break; - case 'C': c16k_set_c(source[read], source[read + 1], values, &bar_characters); - read += 2; - break; - } - } else { - values[bar_characters] = 102; - bar_characters++; - read++; - } - /* printf("tp9 read=%d surrent set=%c\n", read, set[read]); */ - } while (read < ustrlen(source)); + if ((set[i] == 'a') || (set[i] == 'b')) { + /* Insert shift character */ + values[bar_characters] = 98; + bar_characters++; + } - pads_needed = 5 - ((bar_characters + 2) % 5); - if(pads_needed == 5) { - pads_needed = 0; - } - if((bar_characters + pads_needed) < 8) { - pads_needed += 8 - (bar_characters + pads_needed); - } - for(i = 0; i < pads_needed; i++) { - values[bar_characters] = 106; - bar_characters++; - } + if (!((gs1) && (source[read] == '['))) { + switch (set[read]) { /* Encode data characters */ + case 'A': + case 'a': + c16k_set_a(source[read], values, &bar_characters); + read++; + break; + case 'B': + case 'b': + c16k_set_b(source[read], values, &bar_characters); + read++; + break; + case 'C': c16k_set_c(source[read], source[read + 1], values, &bar_characters); + read += 2; + break; + } + } else { + values[bar_characters] = 102; + bar_characters++; + read++; + } + } while (read < ustrlen(source)); - /* Calculate check digits */ - first_sum = 0; - second_sum = 0; - for(i = 0; i < bar_characters; i++) - { - first_sum += (i+2) * values[i]; - second_sum += (i+1) * values[i]; - } - first_check = first_sum % 107; - second_sum += first_check * (bar_characters + 1); - second_check = second_sum % 107; - values[bar_characters] = first_check; - values[bar_characters + 1] = second_check; - bar_characters += 2; + pads_needed = 5 - ((bar_characters + 2) % 5); + if (pads_needed == 5) { + pads_needed = 0; + } + if ((bar_characters + pads_needed) < 8) { + pads_needed += 8 - (bar_characters + pads_needed); + } + for (i = 0; i < pads_needed; i++) { + values[bar_characters] = 106; + bar_characters++; + } - for(current_row = 0; current_row < rows_needed; current_row++) { + /* Calculate check digits */ + first_sum = 0; + second_sum = 0; + for (i = 0; i < bar_characters; i++) { + first_sum += (i + 2) * values[i]; + second_sum += (i + 1) * values[i]; + } + first_check = first_sum % 107; + second_sum += first_check * (bar_characters + 1); + second_check = second_sum % 107; + values[bar_characters] = first_check; + values[bar_characters + 1] = second_check; + bar_characters += 2; - strcpy(width_pattern, ""); - concat(width_pattern, C16KStartStop[C16KStartValues[current_row]]); - concat(width_pattern, "1"); - for(i = 0; i < 5; i++) { - concat(width_pattern, C16KTable[values[(current_row * 5) + i]]); - /* printf("[%d] ", values[(current_row * 5) + i]); */ + for (current_row = 0; current_row < rows_needed; current_row++) { - } - concat(width_pattern, C16KStartStop[C16KStopValues[current_row]]); - /* printf("\n"); */ + strcpy(width_pattern, ""); + concat(width_pattern, C16KStartStop[C16KStartValues[current_row]]); + concat(width_pattern, "1"); + for (i = 0; i < 5; i++) { + concat(width_pattern, C16KTable[values[(current_row * 5) + i]]); + } + concat(width_pattern, C16KStartStop[C16KStopValues[current_row]]); - /* Write the information into the symbol */ - writer = 0; - flip_flop = 1; - for (mx_reader = 0; mx_reader < strlen(width_pattern); mx_reader++) { - for(looper = 0; looper < ctoi(width_pattern[mx_reader]); looper++) { - if(flip_flop == 1) { - set_module(symbol, current_row, writer); - writer++; } - else { - writer++; } - } - if(flip_flop == 0) { flip_flop = 1; } else { flip_flop = 0; } - } - symbol->row_height[current_row] = 10; - } + /* Write the information into the symbol */ + writer = 0; + flip_flop = 1; + for (mx_reader = 0; mx_reader < strlen(width_pattern); mx_reader++) { + for (looper = 0; looper < ctoi(width_pattern[mx_reader]); looper++) { + if (flip_flop == 1) { + set_module(symbol, current_row, writer); + writer++; + } else { + writer++; + } + } + if (flip_flop == 0) { + flip_flop = 1; + } else { + flip_flop = 0; + } + } + symbol->row_height[current_row] = 10; + } - symbol->rows = rows_needed; - symbol->width = 70; - return errornum; + symbol->rows = rows_needed; + symbol->width = 70; + return errornum; } diff --git a/backend/code49.c b/backend/code49.c index 2c8f5068..f71d22d6 100644 --- a/backend/code49.c +++ b/backend/code49.c @@ -2,20 +2,20 @@ /* libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart + Copyright (C) 2009-2016 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. + documentation and/or other materials provided with the distribution. 3. Neither the name of the project nor the names of its contributors may be used to endorse or promote products derived from this software - without specific prior written permission. + without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -26,9 +26,9 @@ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + */ #include #include @@ -37,290 +37,299 @@ #include "code49.h" #define INSET "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%!&*" + /* "!" represents Shift 1 and "&" represents Shift 2, "*" represents FNC1 */ -int code_49(struct zint_symbol *symbol, unsigned char source[], int length) -{ - int i, j, rows, M, x_count, y_count, z_count, posn_val, local_value, h; - char intermediate[170]; - int codewords[170], codeword_count; - int c_grid[8][8]; /* Refers to table 3 */ - int w_grid[8][4]; /* Refets to table 2 */ - int pad_count = 0; - char pattern[40]; - int gs1; +int code_49(struct zint_symbol *symbol, unsigned char source[], int length) { + int i, j, rows, M, x_count, y_count, z_count, posn_val, local_value, h; + char intermediate[170]; + int codewords[170], codeword_count; + int c_grid[8][8]; /* Refers to table 3 */ + int w_grid[8][4]; /* Refets to table 2 */ + int pad_count = 0; + char pattern[40]; + int gs1; - if(length > 81) { - strcpy(symbol->errtxt, "Input too long"); - return ZINT_ERROR_TOO_LONG; - } - if(symbol->input_mode == GS1_MODE) { gs1 = 1; } else { gs1 = 0; } + if (length > 81) { + strcpy(symbol->errtxt, "Input too long"); + return ZINT_ERROR_TOO_LONG; + } + if (symbol->input_mode == GS1_MODE) { + gs1 = 1; + strcpy(intermediate, "*"); /* FNC1 */ + } else { + gs1 = 0; + } - strcpy(intermediate, gs1 ? "*" : ""); /* FNC1 */ - for(i = 0; i < length; i++) { - if(source[i] > 127) { - strcpy(symbol->errtxt, "Invalid characters in input data"); - return ZINT_ERROR_INVALID_DATA; - } - if(gs1 && (source[i] == '[')) - concat(intermediate, "*"); /* FNC1 */ - else - concat(intermediate, c49_table7[source[i]]); - } + for (i = 0; i < length; i++) { + if (source[i] > 127) { + strcpy(symbol->errtxt, "Invalid characters in input data"); + return ZINT_ERROR_INVALID_DATA; + } + if (gs1 && (source[i] == '[')) + concat(intermediate, "*"); /* FNC1 */ + else + concat(intermediate, c49_table7[source[i]]); + } - codeword_count = 0; - i = 0; - h = strlen(intermediate); - do { - if((intermediate[i] >= '0') && (intermediate[i] <= '9')) { - /* Numeric data */ - for(j = 0; (intermediate[i + j] >= '0') && (intermediate[i + j] <= '9'); j++); - if(j >= 5) { - /* Use Numeric Encodation Method */ - int block_count, c; - int block_remain; - int block_value; + codeword_count = 0; + i = 0; + h = strlen(intermediate); + do { + if ((intermediate[i] >= '0') && (intermediate[i] <= '9')) { + /* Numeric data */ + for (j = 0; (intermediate[i + j] >= '0') && (intermediate[i + j] <= '9'); j++); + if (j >= 5) { + /* Use Numeric Encodation Method */ + int block_count, c; + int block_remain; + int block_value; - codewords[codeword_count] = 48; /* Numeric Shift */ - codeword_count++; + codewords[codeword_count] = 48; /* Numeric Shift */ + codeword_count++; - block_count = j / 5; - block_remain = j % 5; + block_count = j / 5; + block_remain = j % 5; - for(c = 0; c < block_count; c++) { - if((c == block_count - 1) && (block_remain == 2)) { - /* Rule (d) */ - block_value = 100000; - block_value += ctoi(intermediate[i]) * 1000; - block_value += ctoi(intermediate[i + 1]) * 100; - block_value += ctoi(intermediate[i + 2]) * 10; - block_value += ctoi(intermediate[i + 3]); + for (c = 0; c < block_count; c++) { + if ((c == block_count - 1) && (block_remain == 2)) { + /* Rule (d) */ + block_value = 100000; + block_value += ctoi(intermediate[i]) * 1000; + block_value += ctoi(intermediate[i + 1]) * 100; + block_value += ctoi(intermediate[i + 2]) * 10; + block_value += ctoi(intermediate[i + 3]); - codewords[codeword_count] = block_value / (48 * 48); - block_value = block_value - (48 * 48) * codewords[codeword_count]; - codeword_count++; - codewords[codeword_count] = block_value / 48; - block_value = block_value - 48 * codewords[codeword_count]; - codeword_count++; - codewords[codeword_count] = block_value; - codeword_count++; - i += 4; - block_value = ctoi(intermediate[i]) * 100; - block_value += ctoi(intermediate[i + 1]) * 10; - block_value += ctoi(intermediate[i + 2]); + codewords[codeword_count] = block_value / (48 * 48); + block_value = block_value - (48 * 48) * codewords[codeword_count]; + codeword_count++; + codewords[codeword_count] = block_value / 48; + block_value = block_value - 48 * codewords[codeword_count]; + codeword_count++; + codewords[codeword_count] = block_value; + codeword_count++; + i += 4; + block_value = ctoi(intermediate[i]) * 100; + block_value += ctoi(intermediate[i + 1]) * 10; + block_value += ctoi(intermediate[i + 2]); - codewords[codeword_count] = block_value / 48; - block_value = block_value - 48 * codewords[codeword_count]; - codeword_count++; - codewords[codeword_count] = block_value; - codeword_count++; - i += 3; - } else { - block_value = ctoi(intermediate[i]) * 10000; - block_value += ctoi(intermediate[i + 1]) * 1000; - block_value += ctoi(intermediate[i + 2]) * 100; - block_value += ctoi(intermediate[i + 3]) * 10; - block_value += ctoi(intermediate[i + 4]); + codewords[codeword_count] = block_value / 48; + block_value = block_value - 48 * codewords[codeword_count]; + codeword_count++; + codewords[codeword_count] = block_value; + codeword_count++; + i += 3; + } else { + block_value = ctoi(intermediate[i]) * 10000; + block_value += ctoi(intermediate[i + 1]) * 1000; + block_value += ctoi(intermediate[i + 2]) * 100; + block_value += ctoi(intermediate[i + 3]) * 10; + block_value += ctoi(intermediate[i + 4]); - codewords[codeword_count] = block_value / (48 * 48); - block_value = block_value - (48 * 48) * codewords[codeword_count]; - codeword_count++; - codewords[codeword_count] = block_value / 48; - block_value = block_value - 48 * codewords[codeword_count]; - codeword_count++; - codewords[codeword_count] = block_value; - codeword_count++; - i += 5; - } - } + codewords[codeword_count] = block_value / (48 * 48); + block_value = block_value - (48 * 48) * codewords[codeword_count]; + codeword_count++; + codewords[codeword_count] = block_value / 48; + block_value = block_value - 48 * codewords[codeword_count]; + codeword_count++; + codewords[codeword_count] = block_value; + codeword_count++; + i += 5; + } + } - switch(block_remain) { - case 1: - /* Rule (a) */ - codewords[codeword_count] = posn(INSET, intermediate[i]); - codeword_count++; - i++; - break; - case 3: - /* Rule (b) */ - block_value = ctoi(intermediate[i]) * 100; - block_value += ctoi(intermediate[i + 1]) * 10; - block_value += ctoi(intermediate[i + 2]); + switch (block_remain) { + case 1: + /* Rule (a) */ + codewords[codeword_count] = posn(INSET, intermediate[i]); + codeword_count++; + i++; + break; + case 3: + /* Rule (b) */ + block_value = ctoi(intermediate[i]) * 100; + block_value += ctoi(intermediate[i + 1]) * 10; + block_value += ctoi(intermediate[i + 2]); - codewords[codeword_count] = block_value / 48; - block_value = block_value - 48 * codewords[codeword_count]; - codeword_count++; - codewords[codeword_count] = block_value; - codeword_count++; - i += 3; - break; - case 4: - /* Rule (c) */ - block_value = 100000; - block_value += ctoi(intermediate[i]) * 1000; - block_value += ctoi(intermediate[i + 1]) * 100; - block_value += ctoi(intermediate[i + 2]) * 10; - block_value += ctoi(intermediate[i + 3]); + codewords[codeword_count] = block_value / 48; + block_value = block_value - 48 * codewords[codeword_count]; + codeword_count++; + codewords[codeword_count] = block_value; + codeword_count++; + i += 3; + break; + case 4: + /* Rule (c) */ + block_value = 100000; + block_value += ctoi(intermediate[i]) * 1000; + block_value += ctoi(intermediate[i + 1]) * 100; + block_value += ctoi(intermediate[i + 2]) * 10; + block_value += ctoi(intermediate[i + 3]); - codewords[codeword_count] = block_value / (48 * 48); - block_value = block_value - (48 * 48) * codewords[codeword_count]; - codeword_count++; - codewords[codeword_count] = block_value / 48; - block_value = block_value - 48 * codewords[codeword_count]; - codeword_count++; - codewords[codeword_count] = block_value; - codeword_count++; - i += 4; - break; - } - if(i < h) { - /* There is more to add */ - codewords[codeword_count] = 48; /* Numeric Shift */ - codeword_count++; - } - } else { - codewords[codeword_count] = posn(INSET, intermediate[i]); - codeword_count++; - i++; - } - } else { - codewords[codeword_count] = posn(INSET, intermediate[i]); - codeword_count++; - i++; - } - } while(i < h); + codewords[codeword_count] = block_value / (48 * 48); + block_value = block_value - (48 * 48) * codewords[codeword_count]; + codeword_count++; + codewords[codeword_count] = block_value / 48; + block_value = block_value - 48 * codewords[codeword_count]; + codeword_count++; + codewords[codeword_count] = block_value; + codeword_count++; + i += 4; + break; + } + if (i < h) { + /* There is more to add */ + codewords[codeword_count] = 48; /* Numeric Shift */ + codeword_count++; + } + } else { + codewords[codeword_count] = posn(INSET, intermediate[i]); + codeword_count++; + i++; + } + } else { + codewords[codeword_count] = posn(INSET, intermediate[i]); + codeword_count++; + i++; + } + } while (i < h); - switch(codewords[0]) { /* Set starting mode value */ - case 48: M = 2; break; - case 43: M = 4; break; - case 44: M = 5; break; - default: M = 0; break; - } + switch (codewords[0]) { + /* Set starting mode value */ + case 48: M = 2; + break; + case 43: M = 4; + break; + case 44: M = 5; + break; + default: M = 0; + break; + } - if(M != 0) { - for(i = 0; i < codeword_count; i++) { - codewords[i] = codewords[i + 1]; - } - codeword_count--; - } + if (M != 0) { + for (i = 0; i < codeword_count; i++) { + codewords[i] = codewords[i + 1]; + } + codeword_count--; + } - if(codeword_count > 49) { - strcpy(symbol->errtxt, "Input too long"); - return ZINT_ERROR_TOO_LONG; - } + if (codeword_count > 49) { + strcpy(symbol->errtxt, "Input too long"); + return ZINT_ERROR_TOO_LONG; + } - /* Place codewords in code character array (c grid) */ - rows = 0; - do{ - for(i = 0; i < 7; i++) { - if(((rows * 7) + i) < codeword_count) { - c_grid[rows][i] = codewords[(rows * 7) + i]; - } else { - c_grid[rows][i] = 48; /* Pad */ - pad_count++; - } - } - rows++; - } while ((rows * 7) < codeword_count); + /* Place codewords in code character array (c grid) */ + rows = 0; + do { + for (i = 0; i < 7; i++) { + if (((rows * 7) + i) < codeword_count) { + c_grid[rows][i] = codewords[(rows * 7) + i]; + } else { + c_grid[rows][i] = 48; /* Pad */ + pad_count++; + } + } + rows++; + } while ((rows * 7) < codeword_count); - if((((rows <= 6) && (pad_count < 5))) || (rows > 6) || (rows == 1)) { - /* Add a row */ - for(i = 0; i < 7; i++) { - c_grid[rows][i] = 48; /* Pad */ - } - rows++; - } + if ((((rows <= 6) && (pad_count < 5))) || (rows > 6) || (rows == 1)) { + /* Add a row */ + for (i = 0; i < 7; i++) { + c_grid[rows][i] = 48; /* Pad */ + } + rows++; + } - /* Add row count and mode character */ - c_grid[rows - 1][6] = (7 * (rows - 2)) + M; + /* Add row count and mode character */ + c_grid[rows - 1][6] = (7 * (rows - 2)) + M; - /* Add row check character */ - for(i = 0; i < rows - 1; i++) { - int row_sum = 0; + /* Add row check character */ + for (i = 0; i < rows - 1; i++) { + int row_sum = 0; - for(j = 0; j < 7; j++) { - row_sum += c_grid[i][j]; - } - c_grid[i][7] = row_sum % 49; - } + for (j = 0; j < 7; j++) { + row_sum += c_grid[i][j]; + } + c_grid[i][7] = row_sum % 49; + } - /* Calculate Symbol Check Characters */ - posn_val = 0; - x_count = c_grid[rows - 1][6] * 20; - y_count = c_grid[rows - 1][6] * 16; - z_count = c_grid[rows - 1][6] * 38; - for(i = 0; i < rows - 1; i++) { - for(j = 0; j < 4; j++) { - local_value = (c_grid[i][2 * j] * 49) + c_grid[i][(2 * j) + 1]; - x_count += c49_x_weight[posn_val] * local_value; - y_count += c49_y_weight[posn_val] * local_value; - z_count += c49_z_weight[posn_val] * local_value; - posn_val++; - } - } + /* Calculate Symbol Check Characters */ + posn_val = 0; + x_count = c_grid[rows - 1][6] * 20; + y_count = c_grid[rows - 1][6] * 16; + z_count = c_grid[rows - 1][6] * 38; + for (i = 0; i < rows - 1; i++) { + for (j = 0; j < 4; j++) { + local_value = (c_grid[i][2 * j] * 49) + c_grid[i][(2 * j) + 1]; + x_count += c49_x_weight[posn_val] * local_value; + y_count += c49_y_weight[posn_val] * local_value; + z_count += c49_z_weight[posn_val] * local_value; + posn_val++; + } + } - if(rows > 6) { - /* Add Z Symbol Check */ - c_grid[rows - 1][0] = (z_count % 2401) / 49; - c_grid[rows - 1][1] = (z_count % 2401) % 49; - } + if (rows > 6) { + /* Add Z Symbol Check */ + c_grid[rows - 1][0] = (z_count % 2401) / 49; + c_grid[rows - 1][1] = (z_count % 2401) % 49; + } - local_value = (c_grid[rows - 1][0] * 49) + c_grid[rows - 1][1]; - x_count += c49_x_weight[posn_val] * local_value; - y_count += c49_y_weight[posn_val] * local_value; - posn_val++; + local_value = (c_grid[rows - 1][0] * 49) + c_grid[rows - 1][1]; + x_count += c49_x_weight[posn_val] * local_value; + y_count += c49_y_weight[posn_val] * local_value; + posn_val++; - /* Add Y Symbol Check */ - c_grid[rows - 1][2] = (y_count % 2401) / 49; - c_grid[rows - 1][3] = (y_count % 2401) % 49; + /* Add Y Symbol Check */ + c_grid[rows - 1][2] = (y_count % 2401) / 49; + c_grid[rows - 1][3] = (y_count % 2401) % 49; - local_value = (c_grid[rows - 1][2] * 49) + c_grid[rows - 1][3]; - x_count += c49_x_weight[posn_val] * local_value; + local_value = (c_grid[rows - 1][2] * 49) + c_grid[rows - 1][3]; + x_count += c49_x_weight[posn_val] * local_value; - /* Add X Symbol Check */ - c_grid[rows - 1][4] = (x_count % 2401) / 49; - c_grid[rows - 1][5] = (x_count % 2401) % 49; + /* Add X Symbol Check */ + c_grid[rows - 1][4] = (x_count % 2401) / 49; + c_grid[rows - 1][5] = (x_count % 2401) % 49; - /* Add last row check character */ - j = 0; - for(i = 0; i < 7; i++) { - j += c_grid[rows - 1][i]; - } - c_grid[rows - 1][7] = j % 49; + /* Add last row check character */ + j = 0; + for (i = 0; i < 7; i++) { + j += c_grid[rows - 1][i]; + } + c_grid[rows - 1][7] = j % 49; - /* Transfer data to symbol character array (w grid) */ - for(i = 0; i < rows; i++) { - for(j = 0; j < 4; j ++) { - w_grid[i][j] = (c_grid[i][2 * j] * 49) + c_grid[i][(2 * j) + 1]; - } - } + /* Transfer data to symbol character array (w grid) */ + for (i = 0; i < rows; i++) { + for (j = 0; j < 4; j++) { + w_grid[i][j] = (c_grid[i][2 * j] * 49) + c_grid[i][(2 * j) + 1]; + } + } - for(i = 0; i < rows; i++) { - strcpy(pattern, "11"); /* Start character */ - for(j = 0; j < 4; j++) { - if(i != (rows - 1)) { - if(c49_table4[i][j] == 'E') { - /* Even Parity */ - concat(pattern, c49_appxe_even[w_grid[i][j]]); - } else { - /* Odd Parity */ - concat(pattern, c49_appxe_odd[w_grid[i][j]]); - } - } else { - /* Last row uses all even parity */ - concat(pattern, c49_appxe_even[w_grid[i][j]]); - } - } - concat(pattern, "4"); /* Stop character */ + for (i = 0; i < rows; i++) { + strcpy(pattern, "11"); /* Start character */ + for (j = 0; j < 4; j++) { + if (i != (rows - 1)) { + if (c49_table4[i][j] == 'E') { + /* Even Parity */ + concat(pattern, c49_appxe_even[w_grid[i][j]]); + } else { + /* Odd Parity */ + concat(pattern, c49_appxe_odd[w_grid[i][j]]); + } + } else { + /* Last row uses all even parity */ + concat(pattern, c49_appxe_even[w_grid[i][j]]); + } + } + concat(pattern, "4"); /* Stop character */ - /* Expand into symbol */ - symbol->row_height[i] = 10; - expand(symbol, pattern); - } + /* Expand into symbol */ + symbol->row_height[i] = 10; + expand(symbol, pattern); + } - symbol->whitespace_width = 10; - symbol->output_options = BARCODE_BIND; - symbol->border_width = 2; + symbol->whitespace_width = 10; + symbol->output_options = BARCODE_BIND; + symbol->border_width = 2; - return 0; + return 0; } \ No newline at end of file diff --git a/backend/code49.h b/backend/code49.h index 598c74c7..a4f053fd 100644 --- a/backend/code49.h +++ b/backend/code49.h @@ -2,20 +2,20 @@ /* libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart + Copyright (C) 2009-2016 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. + documentation and/or other materials provided with the distribution. 3. Neither the name of the project nor the names of its contributors may be used to endorse or promote products derived from this software - without specific prior written permission. + without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -26,1161 +26,1161 @@ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + */ /* This data set taken from ANSI/AIM-BC6-2000, 4th April 2000 */ static const char *c49_table7[128] = { - /* Table 7: Code 49 ASCII Chart */ - "! ", "!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", "!1", "!2", "!3", "!4", "!5", " ", "!6", "!7", "!8", "$", "%", "!9", "!0", - "!-", "!.", "!$", "+", "!/", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", - "7", "8", "9", "!+", "&1", "&2", "&3", "&4", "&5", "&6", "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", "&7", "&8", "&9", "&0", "&-", "&.", "&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", "&$", "&/", "&+", - "&%", "& " + /* Table 7: Code 49 ASCII Chart */ + "! ", "!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", "!1", "!2", "!3", "!4", "!5", " ", "!6", "!7", "!8", "$", "%", "!9", "!0", + "!-", "!.", "!$", "+", "!/", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", + "7", "8", "9", "!+", "&1", "&2", "&3", "&4", "&5", "&6", "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", "&7", "&8", "&9", "&0", "&-", "&.", "&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", "&$", "&/", "&+", + "&%", "& " }; /* Table 5: Check Character Weighting Values */ static const int c49_x_weight[] = { - 1, 9, 31, 26, 2, 12, 17, 23, 37, 18, 22, 6, 27, 44, 15, 43, - 39, 11, 13, 5, 41, 33, 36, 8, 4, 32, 3, 19, 40, 25, 29, 10 + 1, 9, 31, 26, 2, 12, 17, 23, 37, 18, 22, 6, 27, 44, 15, 43, + 39, 11, 13, 5, 41, 33, 36, 8, 4, 32, 3, 19, 40, 25, 29, 10 }; static const int c49_y_weight[] = { - 9, 31, 26, 2, 12, 17, 23, 37, 18, 22, 6, 27, 44, 15, 43, 39, - 11, 13, 5, 41, 33, 36, 8, 4, 32, 3, 19, 40, 25, 29, 10, 24 + 9, 31, 26, 2, 12, 17, 23, 37, 18, 22, 6, 27, 44, 15, 43, 39, + 11, 13, 5, 41, 33, 36, 8, 4, 32, 3, 19, 40, 25, 29, 10, 24 }; static const int c49_z_weight[] = { - 31, 26, 2, 12, 17, 23, 37, 18, 22, 6, 27, 44, 15, 43, 39, 11, - 13, 5, 41, 33, 36, 8, 4, 32, 3, 19, 40, 25, 29, 10, 24, 30 + 31, 26, 2, 12, 17, 23, 37, 18, 22, 6, 27, 44, 15, 43, 39, 11, + 13, 5, 41, 33, 36, 8, 4, 32, 3, 19, 40, 25, 29, 10, 24, 30 }; static const char *c49_table4[8] = { - /* Table 4: Row Parity Pattern for Code 49 Symbols */ - "OEEO", "EOEO", "OOEE", "EEOO", "OEOE", "EOOE", "OOOO", "EEEE" + /* Table 4: Row Parity Pattern for Code 49 Symbols */ + "OEEO", "EOEO", "OOEE", "EEOO", "OEOE", "EOOE", "OOOO", "EEEE" }; static const char *c49_appxe_even[2401] = { - /* Appendix E - Code 49 Encodation Patterns (Even Symbol Character Parity) */ - /* Column 1 */ - "11521132", - "25112131", "14212132", "25121221", "14221222", "12412132", - "23321221", "12421222", "21521221", "15112222", "15121312", - "13312222", "24221311", "13321312", "11512222", "22421311", - "11521312", "25112311", "14212312", "23312311", "12412312", - "21512311", "16121131", "14321131", "12521131", "15212131", - "15221221", "13412131", "13421221", "11612131", "16112221", - "16121311", "14312221", "14321311", "12512221", "12521311", - "15212311", "13412311", "11612311", "11131135", "31131133", - "51131131", "21122134", "41122132", "21131224", "41131222", - "11113135", "31113133", "51113131", "11122225", "31122223", - "51122221", "11131315", "31131313", "51131311", "21113224", - "41113222", "21122314", - /* Column 2 */ - "41122312", "11113315", "31113313", - "51113311", "12131134", "32131132", "21231133", "41231131", - "22122133", "42122131", "11222134", "22131223", "42131221", - "11231224", "31231222", "12113134", "32113132", "12122224", - "32122222", "12131314", "32131312", "21231313", "41231311", - "22113223", "42113221", "11213224", "22122313", "42122311", - "11222314", "31222312", "12113314", "32113312", "21213313", - "41213311", "13131133", "33131131", "22231132", "11331133", - "31331131", "23122132", "12222133", "23131222", "12231223", - "32231221", "21331222", "13113133", "33113131", "13122223", - "33122221", "11313133", "13131313", "33131311", "11322223", - "22231312", "11331313", "31331311", "23113222", "12213223", - /* Column 3 */ - "23122312", "12222313", "32222311", "21322312", "13113313", - "33113311", "22213312", "11313313", "31313311", "14131132", - "23231131", "12331132", "21431131", "24122131", "13222132", - "24131221", "13231222", "11422132", "22331221", "11431222", - "14113132", "14122222", "12313132", "14131312", "12322222", - "23231311", "12331312", "21431311", "24113221", "13213222", - "24122311", "13222312", "11413222", "22322311", "11422312", - "14113312", "23213311", "12313312", "21413311", "15131131", - "13331131", "14222131", "14231221", "12422131", "12431221", - "15113131", "15122221", "13313131", "15131311", "13322221", - "11513131", "13331311", "11522221", "14213221", "14222311", - "12413221", "12422311", "15113311", - /* Column 4 */ - "13313311", "11513311", - "11141134", "31141132", "21132133", "41132131", "21141223", - "41141221", "11123134", "31123132", "11132224", "31132222", - "11141314", "31141312", "21114133", "41114131", "21123223", - "41123221", "21132313", "41132311", "11114224", "31114222", - "11123314", "31123312", "21114313", "41114311", "12141133", - "32141131", "21241132", "22132132", "11232133", "22141222", - "11241223", "31241221", "12123133", "32123131", "12132223", - "32132221", "12141313", "32141311", "21241312", "22114132", - "11214133", "22123222", "11223223", "22132312", "11232313", - "31232311", "12114223", "32114221", "12123313", "32123311", - "21223312", "22114312", "11214313", "31214311", "13141132", - "22241131", - /* Column 5 */ - "11341132", "23132131", "12232132", "23141221", - "12241222", "21341221", "13123132", "13132222", "11323132", - "13141312", "11332222", "22241311", "11341312", "23114131", - "12214132", "23123221", "12223222", "23132311", "12232312", - "21332311", "13114222", "13123312", "11314222", "22223311", - "11323312", "23114311", "12214312", "21314311", "14141131", - "12341131", "13232131", "13241221", "11432131", "14123131", - "14132221", "12323131", "14141311", "12332221", "12341311", - "13214131", "13223221", "11414131", "13232311", "11423221", - "11432311", "14114221", "14123311", "12314221", "12323311", - "13214311", "11414311", "11151133", "31151131", "21142132", - "21151222", "11133133", "31133131", "11142223", - /* Column 6 */ - "31142221", - "11151313", "31151311", "21124132", "21133222", "21142312", - "11115133", "31115131", "11124223", "31124221", "11133313", - "31133311", "21115222", "21124312", "12151132", "21251131", - "22142131", "11242132", "22151221", "11251222", "12133132", - "12142222", "12151312", "21251311", "22124131", "11224132", - "22133221", "11233222", "22142311", "11242312", "12115132", - "12124222", "12133312", "21233311", "22115221", "11215222", - "22124311", "11224312", "13151131", "12242131", "12251221", - "13133131", "13142221", "11333131", "13151311", "11342221", - "12224131", "12233221", "12242311", "13115131", "13124221", - "11315131", "13133311", "11324221", "11333311", "12215221", - "12224311", "11161132", - /* Column 7 */ - "21152131", "21161221", "11143132", - "11152222", "11161312", "21134131", "21143221", "21152311", - "11125132", "11134222", "11143312", "21116131", "21125221", - "21134311", "12161131", "11252131", "12143131", "12152221", - "12161311", "11234131", "11243221", "11252311", "12125131", - "12134221", "12143311", "11216131", "11225221", "11234311", - "11111236", "31111234", "51111232", "21111325", "41111323", - "61111321", "11111416", "31111414", "51111412", "31211143", - "51211141", "12111235", "32111233", "52111231", "21211234", - "41211232", "22111324", "42111322", "11211325", "31211323", - "51211321", "12111415", "32111413", "52111411", "21211414", - "41211412", "12211144", "32211142", "21311143", "41311141", - /* Column 8 */ - "13111234", "33111232", "22211233", "42211231", "11311234", - "31311232", "23111323", "43111321", "12211324", "32211322", - "21311323", "41311321", "13111414", "33111412", "22211413", - "42211411", "11311414", "31311412", "13211143", "33211141", - "22311142", "11411143", "31411141", "14111233", "34111231", - "23211232", "12311233", "32311231", "21411232", "24111322", - "13211323", "33211321", "22311322", "11411323", "31411321", - "14111413", "34111411", "23211412", "12311413", "32311411", - "21411412", "14211142", "23311141", "12411142", "21511141", - "15111232", "24211231", "13311232", "22411231", "11511232", - "25111321", "14211322", "23311321", "12411322", "21511321", - "15111412", "24211411", "13311412", - /* Column 9 */ - "22411411", "11511412", - "15211141", "13411141", "11611141", "16111231", "14311231", - "12511231", "15211321", "13411321", "11611321", "16111411", - "14311411", "12511411", "21121144", "41121142", "11112145", - "31112143", "51112141", "11121235", "31121233", "51121231", - "21112234", "41112232", "21121324", "41121322", "11112325", - "31112323", "51112321", "11121415", "31121413", "51121411", - "21112414", "41112412", "22121143", "42121141", "11221144", - "31221142", "12112144", "32112142", "12121234", "32121232", - "21221233", "41221231", "22112233", "42112231", "11212234", - "22121323", "42121321", "11221324", "31221322", "12112324", - "32112322", "12121414", "32121412", "21221413", "41221411", - "22112413", - /* Column 10 */ - "42112411", "11212414", "31212412", "23121142", - "12221143", "32221141", "21321142", "13112143", "33112141", - "13121233", "33121231", "11312143", "22221232", "11321233", - "31321231", "23112232", "12212233", "23121322", "12221323", - "32221321", "21321322", "13112323", "33112321", "13121413", - "33121411", "11312323", "22221412", "11321413", "31321411", - "23112412", "12212413", "32212411", "21312412", "24121141", - "13221142", "22321141", "11421142", "14112142", "14121232", - "12312142", "23221231", "12321232", "21421231", "24112231", - "13212232", "24121321", "13221322", "11412232", "22321321", - "11421322", "14112322", "14121412", "12312322", "23221411", - "12321412", "21421411", "24112411", "13212412", - /* Column 11 */ - "22312411", - "11412412", "14221141", "12421141", "15112141", "15121231", - "13312141", "13321231", "11512141", "11521231", "14212231", - "14221321", "12412231", "12421321", "15112321", "15121411", - "13312321", "13321411", "11512321", "11521411", "14212411", - "12412411", "21131143", "41131141", "11122144", "31122142", - "11131234", "31131232", "21113143", "41113141", "21122233", - "41122231", "21131323", "41131321", "11113234", "31113232", - "11122324", "31122322", "11131414", "31131412", "21113323", - "41113321", "21122413", "41122411", "11113414", "31113412", - "22131142", "11231143", "31231141", "12122143", "32122141", - "12131233", "32131231", "21231232", "22113142", "11213143", - "22122232", "11222233", - /* Column 12 */ - "22131322", "11231323", "31231321", - "12113233", "32113231", "12122323", "32122321", "12131413", - "32131411", "21231412", "22113322", "11213323", "22122412", - "11222413", "31222411", "12113413", "32113411", "21213412", - "23131141", "12231142", "21331141", "13122142", "13131232", - "11322142", "22231231", "11331232", "23113141", "12213142", - "23122231", "12222232", "23131321", "12231322", "21331321", - "13113232", "13122322", "11313232", "13131412", "11322322", - "22231411", "11331412", "23113321", "12213322", "23122411", - "12222412", "21322411", "13113412", "22213411", "11313412", - "13231141", "11431141", "14122141", "14131231", "12322141", - "12331231", "13213141", "13222231", "11413141", "13231321", - /* Column 13 */ - "11422231", "11431321", "14113231", "14122321", "12313231", - "14131411", "12322321", "12331411", "13213321", "13222411", - "11413321", "11422411", "14113411", "12313411", "21141142", - "11132143", "31132141", "11141233", "31141231", "21123142", - "21132232", "21141322", "11114143", "31114141", "11123233", - "31123231", "11132323", "31132321", "11141413", "31141411", - "21114232", "21123322", "21132412", "11114323", "31114321", - "11123413", "31123411", "22141141", "11241142", "12132142", - "12141232", "21241231", "22123141", "11223142", "22132231", - "11232232", "22141321", "11241322", "12114142", "12123232", - "12132322", "12141412", "21241411", "22114231", "11214232", - "22123321", "11223322", "22132411", - /* Column 14 */ - "11232412", "12114322", - "12123412", "21223411", "12241141", "13132141", "13141231", - "11332141", "11341231", "12223141", "12232231", "12241321", - "13114141", "13123231", "11314141", "13132321", "11323231", - "13141411", "11332321", "11341411", "12214231", "12223321", - "12232411", "13114321", "13123411", "11314321", "11323411", - "21151141", "11142142", "11151232", "21133141", "21142231", - "21151321", "11124142", "11133232", "11142322", "11151412", - "21115141", "21124231", "21133321", "21142411", "11115232", - "11124322", "11133412", "11251141", "12142141", "12151231", - "11233141", "11242231", "11251321", "12124141", "12133231", - "12142321", "12151411", "11215141", "11224231", "11233321", - "11242411", - /* Column 15 */ - "12115231", "12124321", "12133411", "11152141", - "11161231", "11134141", "11143231", "11152321", "11161411", - "11116141", "11125231", "11134321", "11143411", "21111244", - "41111242", "11111335", "31111333", "51111331", "21111424", - "41111422", "11111515", "31111513", "51111511", "21211153", - "41211151", "22111243", "42111241", "11211244", "31211242", - "12111334", "32111332", "21211333", "41211331", "22111423", - "42111421", "11211424", "31211422", "12111514", "32111512", - "21211513", "41211511", "22211152", "11311153", "31311151", - "23111242", "12211243", "32211241", "21311242", "13111333", - "33111331", "22211332", "11311333", "31311331", "23111422", - "12211423", "32211421", "21311422", "13111513", - /* Column 16 */ - "33111511", - "22211512", "11311513", "31311511", "23211151", "12311152", - "21411151", "24111241", "13211242", "22311241", "11411242", - "14111332", "23211331", "12311332", "21411331", "24111421", - "13211422", "22311421", "11411422", "14111512", "23211511", - "12311512", "21411511", "13311151", "11511151", "14211241", - "12411241", "15111331", "13311331", "11511331", "14211421", - "12411421", "15111511", "13311511", "11511511", "31121152", - "21112153", "41112151", "21121243", "41121241", "11112244", - "31112242", "11121334", "31121332", "21112333", "41112331", - "21121423", "41121421", "11112424", "31112422", "11121514", - "31121512", "21112513", "41112511", "12121153", "32121151", - "21221152", "22112152", - /* Column 17 */ - "11212153", "22121242", "11221243", - "31221241", "12112243", "32112241", "12121333", "32121331", - "21221332", "22112332", "11212333", "22121422", "11221423", - "31221421", "12112423", "32112421", "12121513", "32121511", - "21221512", "22112512", "11212513", "31212511", "13121152", - "22221151", "11321152", "23112151", "12212152", "23121241", - "12221242", "21321241", "13112242", "13121332", "11312242", - "22221331", "11321332", "23112331", "12212332", "23121421", - "12221422", "21321421", "13112422", "13121512", "11312422", - "22221511", "11321512", "23112511", "12212512", "21312511", - "14121151", "12321151", "13212151", "13221241", "11412151", - "11421241", "14112241", "14121331", "12312241", "12321331", - /* Column 18 */ - "13212331", "13221421", "11412331", "11421421", "14112421", - "14121511", "12312421", "12321511", "13212511", "11412511", - "11131153", "31131151", "21122152", "21131242", "11113153", - "31113151", "11122243", "31122241", "11131333", "31131331", - "21113242", "21122332", "21131422", "11113333", "31113331", - "11122423", "31122421", "11131513", "31131511", "21113422", - "21122512", "12131152", "21231151", "22122151", "11222152", - "22131241", "11231242", "12113152", "12122242", "12131332", - "21231331", "22113241", "11213242", "22122331", "11222332", - "22131421", "11231422", "12113332", "12122422", "12131512", - "21231511", "22113421", "11213422", "22122511", "11222512", - "13131151", "11331151", "12222151", - /* Column 19 */ - "12231241", "13113151", - "13122241", "11313151", "13131331", "11322241", "11331331", - "12213241", "12222331", "12231421", "13113331", "13122421", - "11313331", "13131511", "11322421", "11331511", "12213421", - "12222511", "11141152", "21132151", "21141241", "11123152", - "11132242", "11141332", "21114151", "21123241", "21132331", - "21141421", "11114242", "11123332", "11132422", "11141512", - "21114331", "21123421", "21132511", "12141151", "11232151", - "11241241", "12123151", "12132241", "12141331", "11214151", - "11223241", "11232331", "11241421", "12114241", "12123331", - "12132421", "12141511", "11214331", "11223421", "11232511", - "11151151", "11133151", "11142241", "11151331", "11115151", - "11124241", - /* Column 20 */ - "11133331", "11142421", "11151511", "11111254", - "31111252", "21111343", "41111341", "11111434", "31111432", - "21111523", "41111521", "11111614", "31111612", "31211161", - "12111253", "32111251", "21211252", "22111342", "11211343", - "31211341", "12111433", "32111431", "21211432", "22111522", - "11211523", "31211521", "12111613", "32111611", "21211612", - "12211162", "21311161", "13111252", "22211251", "11311252", - "23111341", "12211342", "21311341", "13111432", "22211431", - "11311432", "23111521", "12211522", "21311521", "13111612", - "22211611", "11311612", "13211161", "11411161", "14111251", - "12311251", "13211341", "11411341", "14111431", "12311431", - "13211521", "11411521", "14111611", "12311611", - /* Column 21 */ - "21121162", - "11112163", "31112161", "11121253", "31121251", "21112252", - "21121342", "11112343", "31112341", "11121433", "31121431", - "21112432", "21121522", "11112523", "31112521", "11121613", - "31121611", "22121161", "11221162", "12112162", "12121252", - "21221251", "22112251", "11212252", "22121341", "11221342", - "12112342", "12121432", "21221431", "22112431", "11212432", - "22121521", "11221522", "12112522", "12121612", "21221611", - "12221161", "13112161", "13121251", "11312161", "11321251", - "32121115", "52121113", "21221116", "41221114", "61221112", - "22112116", "42112114", "31212115", "51212113", "13121116", - "33121114", "22221115", "42221113", "11321116", "31321114", - "51321112", "23112115", - /* Column 22 */ - "43112113", "12212116", "32212114", - "52212112", "21312115", "41312113", "61312111", "14121115", - "34121113", "23221114", "43221112", "12321115", "32321113", - "52321111", "21421114", "41421112", "24112114", "13212115", - "33212113", "22312114", "42312112", "11412115", "31412113", - "51412111", "15121114", "24221113", "13321114", "33321112", - "22421113", "42421111", "11521114", "31521112", "25112113", - "14212114", "34212112", "23312113", "43312111", "12412114", - "32412112", "21512113", "41512111", "16121113", "25221112", - "14321113", "34321111", "23421112", "12521113", "32521111", - "15212113", "24312112", "13412113", "33412111", "22512112", - "11612113", "31612111", "31131115", "51131113", "21122116", - /* Column 23 */ - "41122114", "61122112", "31113115", "51113113", "12131116", - "32131114", "52131112", "21231115", "41231113", "61231111", - "22122115", "42122113", "11222116", "31222114", "51222112", - "12113116", "32113114", "52113112", "21213115", "41213113", - "61213111", "13131115", "33131113", "22231114", "42231112", - "11331115", "31331113", "51331111", "23122114", "43122112", - "12222115", "32222113", "52222111", "21322114", "41322112", - "13113115", "33113113", "22213114", "42213112", "11313115", - "31313113", "51313111", "14131114", "34131112", "23231113", - "43231111", "12331114", "32331112", "21431113", "41431111", - "24122113", "13222114", "33222112", "22322113", "42322111", - "11422114", "31422112", "14113114", - /* Column 24 */ - "34113112", "23213113", - "43213111", "12313114", "32313112", "21413113", "41413111", - "15131113", "24231112", "13331113", "33331111", "22431112", - "25122112", "14222113", "34222111", "23322112", "12422113", - "32422111", "21522112", "15113113", "24213112", "13313113", - "33313111", "22413112", "11513113", "31513111", "16131112", - "25231111", "14331112", "23431111", "15222112", "24322111", - "13422112", "22522111", "16113112", "25213111", "14313112", - "23413111", "12513112", "21613111", "11141116", "31141114", - "51141112", "21132115", "41132113", "61132111", "11123116", - "31123114", "51123112", "21114115", "41114113", "61114111", - "12141115", "32141113", "52141111", "21241114", "41241112", - "22132114", - /* Column 25 */ - "42132112", "11232115", "31232113", "51232111", - "12123115", "32123113", "52123111", "21223114", "41223112", - "22114114", "42114112", "11214115", "31214113", "51214111", - "13141114", "33141112", "22241113", "42241111", "11341114", - "31341112", "23132113", "43132111", "12232114", "32232112", - "21332113", "41332111", "13123114", "33123112", "22223113", - "42223111", "11323114", "31323112", "23114113", "43114111", - "12214114", "32214112", "21314113", "41314111", "14141113", - "34141111", "23241112", "12341113", "32341111", "24132112", - "13232113", "33232111", "22332112", "11432113", "31432111", - "14123113", "34123111", "23223112", "12323113", "32323111", - "21423112", "24114112", "13214113", "33214111", - /* Column 26 */ - "22314112", - "11414113", "31414111", "15141112", "24241111", "13341112", - "25132111", "14232112", "23332111", "12432112", "15123112", - "24223111", "13323112", "22423111", "11523112", "25114111", - "14214112", "23314111", "12414112", "21514111", "16141111", - "14341111", "15232111", "13432111", "16123111", "14323111", - "12523111", "15214111", "13414111", "11614111", "11151115", - "31151113", "51151111", "21142114", "41142112", "11133115", - "31133113", "51133111", "21124114", "41124112", "11115115", - "31115113", "51115111", "12151114", "32151112", "21251113", - "41251111", "22142113", "42142111", "11242114", "31242112", - "12133114", "32133112", "21233113", "41233111", "22124113", - "42124111", "11224114", - /* Column 27 */ - "31224112", "12115114", "32115112", - "21215113", "41215111", "13151113", "33151111", "22251112", - "23142112", "12242113", "32242111", "21342112", "13133113", - "33133111", "22233112", "11333113", "31333111", "23124112", - "12224113", "32224111", "21324112", "13115113", "33115111", - "22215112", "11315113", "31315111", "14151112", "23251111", - "24142111", "13242112", "22342111", "14133112", "23233111", - "12333112", "21433111", "24124111", "13224112", "22324111", - "11424112", "14115112", "23215111", "12315112", "21415111", - "15151111", "14242111", "15133111", "13333111", "14224111", - "12424111", "15115111", "13315111", "11515111", "11161114", - "31161112", "21152113", "41152111", "11143114", "31143112", - /* Column 28 */ - "21134113", "41134111", "11125114", "31125112", "21116113", - "41116111", "12161113", "32161111", "22152112", "11252113", - "31252111", "12143113", "32143111", "21243112", "22134112", - "11234113", "31234111", "12125113", "32125111", "21225112", - "22116112", "11216113", "31216111", "13161112", "23152111", - "12252112", "13143112", "22243111", "11343112", "23134111", - "12234112", "21334111", "13125112", "22225111", "11325112", - "23116111", "12216112", "21316111", "14161111", "13252111", - "14143111", "12343111", "13234111", "11434111", "14125111", - "12325111", "13216111", "11416111", "31111216", "51111214", - "31211125", "51211123", "32111215", "52111213", "21211216", - "41211214", "61211212", "12211126", - /* Column 29 */ - "32211124", "52211122", - "21311125", "41311123", "61311121", "13111216", "33111214", - "22211215", "42211213", "11311216", "31311214", "51311212", - "13211125", "33211123", "22311124", "42311122", "11411125", - "31411123", "51411121", "14111215", "34111213", "23211214", - "43211212", "12311215", "32311213", "52311211", "21411214", - "41411212", "14211124", "34211122", "23311123", "43311121", - "12411124", "32411122", "21511123", "41511121", "15111214", - "24211213", "13311214", "33311212", "22411213", "42411211", - "11511214", "31511212", "15211123", "24311122", "13411123", - "33411121", "22511122", "11611123", "31611121", "16111213", - "25211212", "14311213", "34311211", "23411212", "12511213", - "32511211", - /* Column 30 */ - "21611212", "21121126", "41121124", "61121122", - "31112125", "51112123", "31121215", "51121213", "21112216", - "41112214", "61112212", "22121125", "42121123", "11221126", - "31221124", "51221122", "12112126", "32112124", "52112122", - "12121216", "32121214", "52121212", "21221215", "41221213", - "61221211", "22112215", "42112213", "11212216", "31212214", - "51212212", "23121124", "43121122", "12221125", "32221123", - "52221121", "21321124", "41321122", "13112125", "33112123", - "13121215", "33121213", "11312125", "22221214", "42221212", - "11321215", "31321213", "51321211", "23112214", "43112212", - "12212215", "32212213", "52212211", "21312214", "41312212", - "24121123", "13221124", "33221122", "22321123", - /* Column 31 */ - "42321121", - "11421124", "31421122", "14112124", "34112122", "14121214", - "34121212", "12312124", "23221213", "43221211", "12321214", - "32321212", "21421213", "41421211", "24112213", "13212214", - "33212212", "22312213", "42312211", "11412214", "31412212", - "25121122", "14221123", "34221121", "23321122", "12421123", - "32421121", "21521122", "15112123", "15121213", "13312123", - "24221212", "13321213", "33321211", "11512123", "22421212", - "11521213", "31521211", "25112212", "14212213", "34212211", - "23312212", "12412213", "32412211", "21512212", "15221122", - "24321121", "13421122", "22521121", "16112122", "16121212", - "14312122", "25221211", "14321212", "12512122", "23421211", - "12521212", "15212212", - /* Column 32 */ - "24312211", "13412212", "22512211", - "11612212", "21131125", "41131123", "61131121", "11122126", - "31122124", "51122122", "11131216", "31131214", "51131212", - "21113125", "41113123", "61113121", "21122215", "41122213", - "61122211", "11113216", "31113214", "51113212", "22131124", - "42131122", "11231125", "31231123", "51231121", "12122125", - "32122123", "52122121", "12131215", "32131213", "52131211", - "21231214", "41231212", "22113124", "42113122", "11213125", - "22122214", "42122212", "11222215", "31222213", "51222211", - "12113215", "32113213", "52113211", "21213214", "41213212", - "23131123", "43131121", "12231124", "32231122", "21331123", - "41331121", "13122124", "33122122", "13131214", "33131212", - /* Column 33 */ - "11322124", "22231213", "42231211", "11331214", "31331212", - "23113123", "43113121", "12213124", "23122213", "43122211", - "12222214", "32222212", "21322213", "41322211", "13113214", - "33113212", "22213213", "42213211", "11313214", "31313212", - "24131122", "13231123", "33231121", "22331122", "11431123", - "31431121", "14122123", "34122121", "14131213", "34131211", - "12322123", "23231212", "12331213", "32331211", "21431212", - "24113122", "13213123", "24122212", "13222213", "33222211", - "11413123", "22322212", "11422213", "31422211", "14113213", - "34113211", "23213212", "12313213", "32313211", "21413212", - "25131121", "14231122", "23331121", "12431122", "15122122", - "15131212", "13322122", "24231211", - /* Column 34 */ - "13331212", "11522122", - "22431211", "25113121", "14213122", "25122211", "14222212", - "12413122", "23322211", "12422212", "21522211", "15113212", - "24213211", "13313212", "22413211", "11513212", "15231121", - "13431121", "16122121", "16131211", "14322121", "14331211", - "12522121", "15213121", "15222211", "13413121", "13422211", - "11613121", "16113211", "14313211", "12513211", "21141124", - "41141122", "11132125", "31132123", "51132121", "11141215", - "31141213", "51141211", "21123124", "41123122", "21132214", - "41132212", "11114125", "31114123", "51114121", "11123215", - "31123213", "51123211", "21114214", "41114212", "22141123", - "42141121", "11241124", "31241122", "12132124", "32132122", - "12141214", - /* Column 35 */ - "32141212", "21241213", "41241211", "22123123", - "42123121", "11223124", "22132213", "42132211", "11232214", - "31232212", "12114124", "32114122", "12123214", "32123212", - "21223213", "41223211", "22114213", "42114211", "11214214", - "31214212", "23141122", "12241123", "32241121", "21341122", - "13132123", "33132121", "13141213", "33141211", "11332123", - "22241212", "11341213", "31341211", "23123122", "12223123", - "23132212", "12232213", "32232211", "21332212", "13114123", - "33114121", "13123213", "33123211", "11314123", "22223212", - "11323213", "31323211", "23114212", "12214213", "32214211", - "21314212", "24141121", "13241122", "22341121", "14132122", - "14141212", "12332122", "23241211", "12341212", - /* Column 36 */ - "24123121", - "13223122", "24132211", "13232212", "11423122", "22332211", - "11432212", "14114122", "14123212", "12314122", "23223211", - "12323212", "21423211", "24114211", "13214212", "22314211", - "11414212", "14241121", "15132121", "15141211", "13332121", - "13341211", "14223121", "14232211", "12423121", "12432211", - "15114121", "15123211", "13314121", "13323211", "11514121", - "11523211", "14214211", "12414211", "21151123", "41151121", - "11142124", "31142122", "11151214", "31151212", "21133123", - "41133121", "21142213", "41142211", "11124124", "31124122", - "11133214", "31133212", "21115123", "41115121", "21124213", - "41124211", "11115214", "31115212", "22151122", "11251123", - "31251121", "12142123", - /* Column 37 */ - "32142121", "12151213", "32151211", - "21251212", "22133122", "11233123", "22142212", "11242213", - "31242211", "12124123", "32124121", "12133213", "32133211", - "21233212", "22115122", "11215123", "22124212", "11224213", - "31224211", "12115213", "32115211", "21215212", "23151121", - "12251122", "13142122", "13151212", "11342122", "22251211", - "23133121", "12233122", "23142211", "12242212", "21342211", - "13124122", "13133212", "11324122", "22233211", "11333212", - "23115121", "12215122", "23124211", "12224212", "21324211", - "13115212", "22215211", "11315212", "13251121", "14142121", - "14151211", "12342121", "13233121", "13242211", "11433121", - "14124121", "14133211", "12324121", "12333211", "13215121", - /* Column 38 */ - "13224211", "11415121", "11424211", "14115211", "12315211", - "21161122", "11152123", "31152121", "11161213", "31161211", - "21143122", "21152212", "11134123", "31134121", "11143213", - "31143211", "21125122", "21134212", "11116123", "31116121", - "11125213", "31125211", "22161121", "12152122", "12161212", - "22143121", "11243122", "22152211", "11252212", "12134122", - "12143212", "21243211", "22125121", "11225122", "22134211", - "11234212", "12116122", "12125212", "21225211", "13152121", - "13161211", "12243121", "12252211", "13134121", "13143211", - "11334121", "11343211", "12225121", "12234211", "13116121", - "13125211", "11316121", "11325211", "21111226", "41111224", - "61111222", "31111315", "51111313", - /* Column 39 */ - "21211135", "41211133", - "61211131", "22111225", "42111223", "11211226", "31211224", - "51211222", "12111316", "32111314", "52111312", "21211315", - "41211313", "61211311", "22211134", "42211132", "11311135", - "31311133", "51311131", "23111224", "43111222", "12211225", - "32211223", "52211221", "21311224", "41311222", "13111315", - "33111313", "22211314", "42211312", "11311315", "31311313", - "51311311", "23211133", "43211131", "12311134", "32311132", - "21411133", "41411131", "24111223", "13211224", "33211222", - "22311223", "42311221", "11411224", "31411222", "14111314", - "34111312", "23211313", "43211311", "12311314", "32311312", - "21411313", "41411311", "24211132", "13311133", "33311131", - "22411132", - /* Column 40 */ - "11511133", "31511131", "25111222", "14211223", - "34211221", "23311222", "12411223", "32411221", "21511222", - "15111313", "24211312", "13311313", "33311311", "22411312", - "11511313", "31511311", "25211131", "14311132", "23411131", - "12511132", "21611131", "15211222", "24311221", "13411222", - "22511221", "11611222", "16111312", "25211311", "14311312", - "23411311", "12511312", "21611311", "31121134", "51121132", - "21112135", "41112133", "61112131", "21121225", "41121223", - "61121221", "11112226", "31112224", "51112222", "11121316", - "31121314", "51121312", "21112315", "41112313", "61112311", - "12121135", "32121133", "52121131", "21221134", "41221132", - "22112134", "42112132", "11212135", "22121224", - /* Column 41 */ - "42121222", - "11221225", "31221223", "51221221", "12112225", "32112223", - "52112221", "12121315", "32121313", "52121311", "21221314", - "41221312", "22112314", "42112312", "11212315", "31212313", - "51212311", "13121134", "33121132", "22221133", "42221131", - "11321134", "31321132", "23112133", "43112131", "12212134", - "23121223", "43121221", "12221224", "32221222", "21321223", - "41321221", "13112224", "33112222", "13121314", "33121312", - "11312224", "22221313", "42221311", "11321314", "31321312", - /* Column 42 */ - "23112313", "43112311", "12212314", "32212312", "21312313", - "41312311", "14121133", "34121131", "23221132", "12321133", - "32321131", "21421132", "24112132", "13212133", "24121222", - "13221223", "33221221", "11412133", "22321222", "11421223", - "31421221", "14112223", "34112221", "14121313", "34121311", - "12312223", "23221312", "12321313", "32321311", "21421312", - "24112312", "13212313", "33212311", "22312312", "11412313", - "31412311", "15121132", "24221131", "13321132", "22421131" + /* Appendix E - Code 49 Encodation Patterns (Even Symbol Character Parity) */ + /* Column 1 */ + "11521132", + "25112131", "14212132", "25121221", "14221222", "12412132", + "23321221", "12421222", "21521221", "15112222", "15121312", + "13312222", "24221311", "13321312", "11512222", "22421311", + "11521312", "25112311", "14212312", "23312311", "12412312", + "21512311", "16121131", "14321131", "12521131", "15212131", + "15221221", "13412131", "13421221", "11612131", "16112221", + "16121311", "14312221", "14321311", "12512221", "12521311", + "15212311", "13412311", "11612311", "11131135", "31131133", + "51131131", "21122134", "41122132", "21131224", "41131222", + "11113135", "31113133", "51113131", "11122225", "31122223", + "51122221", "11131315", "31131313", "51131311", "21113224", + "41113222", "21122314", + /* Column 2 */ + "41122312", "11113315", "31113313", + "51113311", "12131134", "32131132", "21231133", "41231131", + "22122133", "42122131", "11222134", "22131223", "42131221", + "11231224", "31231222", "12113134", "32113132", "12122224", + "32122222", "12131314", "32131312", "21231313", "41231311", + "22113223", "42113221", "11213224", "22122313", "42122311", + "11222314", "31222312", "12113314", "32113312", "21213313", + "41213311", "13131133", "33131131", "22231132", "11331133", + "31331131", "23122132", "12222133", "23131222", "12231223", + "32231221", "21331222", "13113133", "33113131", "13122223", + "33122221", "11313133", "13131313", "33131311", "11322223", + "22231312", "11331313", "31331311", "23113222", "12213223", + /* Column 3 */ + "23122312", "12222313", "32222311", "21322312", "13113313", + "33113311", "22213312", "11313313", "31313311", "14131132", + "23231131", "12331132", "21431131", "24122131", "13222132", + "24131221", "13231222", "11422132", "22331221", "11431222", + "14113132", "14122222", "12313132", "14131312", "12322222", + "23231311", "12331312", "21431311", "24113221", "13213222", + "24122311", "13222312", "11413222", "22322311", "11422312", + "14113312", "23213311", "12313312", "21413311", "15131131", + "13331131", "14222131", "14231221", "12422131", "12431221", + "15113131", "15122221", "13313131", "15131311", "13322221", + "11513131", "13331311", "11522221", "14213221", "14222311", + "12413221", "12422311", "15113311", + /* Column 4 */ + "13313311", "11513311", + "11141134", "31141132", "21132133", "41132131", "21141223", + "41141221", "11123134", "31123132", "11132224", "31132222", + "11141314", "31141312", "21114133", "41114131", "21123223", + "41123221", "21132313", "41132311", "11114224", "31114222", + "11123314", "31123312", "21114313", "41114311", "12141133", + "32141131", "21241132", "22132132", "11232133", "22141222", + "11241223", "31241221", "12123133", "32123131", "12132223", + "32132221", "12141313", "32141311", "21241312", "22114132", + "11214133", "22123222", "11223223", "22132312", "11232313", + "31232311", "12114223", "32114221", "12123313", "32123311", + "21223312", "22114312", "11214313", "31214311", "13141132", + "22241131", + /* Column 5 */ + "11341132", "23132131", "12232132", "23141221", + "12241222", "21341221", "13123132", "13132222", "11323132", + "13141312", "11332222", "22241311", "11341312", "23114131", + "12214132", "23123221", "12223222", "23132311", "12232312", + "21332311", "13114222", "13123312", "11314222", "22223311", + "11323312", "23114311", "12214312", "21314311", "14141131", + "12341131", "13232131", "13241221", "11432131", "14123131", + "14132221", "12323131", "14141311", "12332221", "12341311", + "13214131", "13223221", "11414131", "13232311", "11423221", + "11432311", "14114221", "14123311", "12314221", "12323311", + "13214311", "11414311", "11151133", "31151131", "21142132", + "21151222", "11133133", "31133131", "11142223", + /* Column 6 */ + "31142221", + "11151313", "31151311", "21124132", "21133222", "21142312", + "11115133", "31115131", "11124223", "31124221", "11133313", + "31133311", "21115222", "21124312", "12151132", "21251131", + "22142131", "11242132", "22151221", "11251222", "12133132", + "12142222", "12151312", "21251311", "22124131", "11224132", + "22133221", "11233222", "22142311", "11242312", "12115132", + "12124222", "12133312", "21233311", "22115221", "11215222", + "22124311", "11224312", "13151131", "12242131", "12251221", + "13133131", "13142221", "11333131", "13151311", "11342221", + "12224131", "12233221", "12242311", "13115131", "13124221", + "11315131", "13133311", "11324221", "11333311", "12215221", + "12224311", "11161132", + /* Column 7 */ + "21152131", "21161221", "11143132", + "11152222", "11161312", "21134131", "21143221", "21152311", + "11125132", "11134222", "11143312", "21116131", "21125221", + "21134311", "12161131", "11252131", "12143131", "12152221", + "12161311", "11234131", "11243221", "11252311", "12125131", + "12134221", "12143311", "11216131", "11225221", "11234311", + "11111236", "31111234", "51111232", "21111325", "41111323", + "61111321", "11111416", "31111414", "51111412", "31211143", + "51211141", "12111235", "32111233", "52111231", "21211234", + "41211232", "22111324", "42111322", "11211325", "31211323", + "51211321", "12111415", "32111413", "52111411", "21211414", + "41211412", "12211144", "32211142", "21311143", "41311141", + /* Column 8 */ + "13111234", "33111232", "22211233", "42211231", "11311234", + "31311232", "23111323", "43111321", "12211324", "32211322", + "21311323", "41311321", "13111414", "33111412", "22211413", + "42211411", "11311414", "31311412", "13211143", "33211141", + "22311142", "11411143", "31411141", "14111233", "34111231", + "23211232", "12311233", "32311231", "21411232", "24111322", + "13211323", "33211321", "22311322", "11411323", "31411321", + "14111413", "34111411", "23211412", "12311413", "32311411", + "21411412", "14211142", "23311141", "12411142", "21511141", + "15111232", "24211231", "13311232", "22411231", "11511232", + "25111321", "14211322", "23311321", "12411322", "21511321", + "15111412", "24211411", "13311412", + /* Column 9 */ + "22411411", "11511412", + "15211141", "13411141", "11611141", "16111231", "14311231", + "12511231", "15211321", "13411321", "11611321", "16111411", + "14311411", "12511411", "21121144", "41121142", "11112145", + "31112143", "51112141", "11121235", "31121233", "51121231", + "21112234", "41112232", "21121324", "41121322", "11112325", + "31112323", "51112321", "11121415", "31121413", "51121411", + "21112414", "41112412", "22121143", "42121141", "11221144", + "31221142", "12112144", "32112142", "12121234", "32121232", + "21221233", "41221231", "22112233", "42112231", "11212234", + "22121323", "42121321", "11221324", "31221322", "12112324", + "32112322", "12121414", "32121412", "21221413", "41221411", + "22112413", + /* Column 10 */ + "42112411", "11212414", "31212412", "23121142", + "12221143", "32221141", "21321142", "13112143", "33112141", + "13121233", "33121231", "11312143", "22221232", "11321233", + "31321231", "23112232", "12212233", "23121322", "12221323", + "32221321", "21321322", "13112323", "33112321", "13121413", + "33121411", "11312323", "22221412", "11321413", "31321411", + "23112412", "12212413", "32212411", "21312412", "24121141", + "13221142", "22321141", "11421142", "14112142", "14121232", + "12312142", "23221231", "12321232", "21421231", "24112231", + "13212232", "24121321", "13221322", "11412232", "22321321", + "11421322", "14112322", "14121412", "12312322", "23221411", + "12321412", "21421411", "24112411", "13212412", + /* Column 11 */ + "22312411", + "11412412", "14221141", "12421141", "15112141", "15121231", + "13312141", "13321231", "11512141", "11521231", "14212231", + "14221321", "12412231", "12421321", "15112321", "15121411", + "13312321", "13321411", "11512321", "11521411", "14212411", + "12412411", "21131143", "41131141", "11122144", "31122142", + "11131234", "31131232", "21113143", "41113141", "21122233", + "41122231", "21131323", "41131321", "11113234", "31113232", + "11122324", "31122322", "11131414", "31131412", "21113323", + "41113321", "21122413", "41122411", "11113414", "31113412", + "22131142", "11231143", "31231141", "12122143", "32122141", + "12131233", "32131231", "21231232", "22113142", "11213143", + "22122232", "11222233", + /* Column 12 */ + "22131322", "11231323", "31231321", + "12113233", "32113231", "12122323", "32122321", "12131413", + "32131411", "21231412", "22113322", "11213323", "22122412", + "11222413", "31222411", "12113413", "32113411", "21213412", + "23131141", "12231142", "21331141", "13122142", "13131232", + "11322142", "22231231", "11331232", "23113141", "12213142", + "23122231", "12222232", "23131321", "12231322", "21331321", + "13113232", "13122322", "11313232", "13131412", "11322322", + "22231411", "11331412", "23113321", "12213322", "23122411", + "12222412", "21322411", "13113412", "22213411", "11313412", + "13231141", "11431141", "14122141", "14131231", "12322141", + "12331231", "13213141", "13222231", "11413141", "13231321", + /* Column 13 */ + "11422231", "11431321", "14113231", "14122321", "12313231", + "14131411", "12322321", "12331411", "13213321", "13222411", + "11413321", "11422411", "14113411", "12313411", "21141142", + "11132143", "31132141", "11141233", "31141231", "21123142", + "21132232", "21141322", "11114143", "31114141", "11123233", + "31123231", "11132323", "31132321", "11141413", "31141411", + "21114232", "21123322", "21132412", "11114323", "31114321", + "11123413", "31123411", "22141141", "11241142", "12132142", + "12141232", "21241231", "22123141", "11223142", "22132231", + "11232232", "22141321", "11241322", "12114142", "12123232", + "12132322", "12141412", "21241411", "22114231", "11214232", + "22123321", "11223322", "22132411", + /* Column 14 */ + "11232412", "12114322", + "12123412", "21223411", "12241141", "13132141", "13141231", + "11332141", "11341231", "12223141", "12232231", "12241321", + "13114141", "13123231", "11314141", "13132321", "11323231", + "13141411", "11332321", "11341411", "12214231", "12223321", + "12232411", "13114321", "13123411", "11314321", "11323411", + "21151141", "11142142", "11151232", "21133141", "21142231", + "21151321", "11124142", "11133232", "11142322", "11151412", + "21115141", "21124231", "21133321", "21142411", "11115232", + "11124322", "11133412", "11251141", "12142141", "12151231", + "11233141", "11242231", "11251321", "12124141", "12133231", + "12142321", "12151411", "11215141", "11224231", "11233321", + "11242411", + /* Column 15 */ + "12115231", "12124321", "12133411", "11152141", + "11161231", "11134141", "11143231", "11152321", "11161411", + "11116141", "11125231", "11134321", "11143411", "21111244", + "41111242", "11111335", "31111333", "51111331", "21111424", + "41111422", "11111515", "31111513", "51111511", "21211153", + "41211151", "22111243", "42111241", "11211244", "31211242", + "12111334", "32111332", "21211333", "41211331", "22111423", + "42111421", "11211424", "31211422", "12111514", "32111512", + "21211513", "41211511", "22211152", "11311153", "31311151", + "23111242", "12211243", "32211241", "21311242", "13111333", + "33111331", "22211332", "11311333", "31311331", "23111422", + "12211423", "32211421", "21311422", "13111513", + /* Column 16 */ + "33111511", + "22211512", "11311513", "31311511", "23211151", "12311152", + "21411151", "24111241", "13211242", "22311241", "11411242", + "14111332", "23211331", "12311332", "21411331", "24111421", + "13211422", "22311421", "11411422", "14111512", "23211511", + "12311512", "21411511", "13311151", "11511151", "14211241", + "12411241", "15111331", "13311331", "11511331", "14211421", + "12411421", "15111511", "13311511", "11511511", "31121152", + "21112153", "41112151", "21121243", "41121241", "11112244", + "31112242", "11121334", "31121332", "21112333", "41112331", + "21121423", "41121421", "11112424", "31112422", "11121514", + "31121512", "21112513", "41112511", "12121153", "32121151", + "21221152", "22112152", + /* Column 17 */ + "11212153", "22121242", "11221243", + "31221241", "12112243", "32112241", "12121333", "32121331", + "21221332", "22112332", "11212333", "22121422", "11221423", + "31221421", "12112423", "32112421", "12121513", "32121511", + "21221512", "22112512", "11212513", "31212511", "13121152", + "22221151", "11321152", "23112151", "12212152", "23121241", + "12221242", "21321241", "13112242", "13121332", "11312242", + "22221331", "11321332", "23112331", "12212332", "23121421", + "12221422", "21321421", "13112422", "13121512", "11312422", + "22221511", "11321512", "23112511", "12212512", "21312511", + "14121151", "12321151", "13212151", "13221241", "11412151", + "11421241", "14112241", "14121331", "12312241", "12321331", + /* Column 18 */ + "13212331", "13221421", "11412331", "11421421", "14112421", + "14121511", "12312421", "12321511", "13212511", "11412511", + "11131153", "31131151", "21122152", "21131242", "11113153", + "31113151", "11122243", "31122241", "11131333", "31131331", + "21113242", "21122332", "21131422", "11113333", "31113331", + "11122423", "31122421", "11131513", "31131511", "21113422", + "21122512", "12131152", "21231151", "22122151", "11222152", + "22131241", "11231242", "12113152", "12122242", "12131332", + "21231331", "22113241", "11213242", "22122331", "11222332", + "22131421", "11231422", "12113332", "12122422", "12131512", + "21231511", "22113421", "11213422", "22122511", "11222512", + "13131151", "11331151", "12222151", + /* Column 19 */ + "12231241", "13113151", + "13122241", "11313151", "13131331", "11322241", "11331331", + "12213241", "12222331", "12231421", "13113331", "13122421", + "11313331", "13131511", "11322421", "11331511", "12213421", + "12222511", "11141152", "21132151", "21141241", "11123152", + "11132242", "11141332", "21114151", "21123241", "21132331", + "21141421", "11114242", "11123332", "11132422", "11141512", + "21114331", "21123421", "21132511", "12141151", "11232151", + "11241241", "12123151", "12132241", "12141331", "11214151", + "11223241", "11232331", "11241421", "12114241", "12123331", + "12132421", "12141511", "11214331", "11223421", "11232511", + "11151151", "11133151", "11142241", "11151331", "11115151", + "11124241", + /* Column 20 */ + "11133331", "11142421", "11151511", "11111254", + "31111252", "21111343", "41111341", "11111434", "31111432", + "21111523", "41111521", "11111614", "31111612", "31211161", + "12111253", "32111251", "21211252", "22111342", "11211343", + "31211341", "12111433", "32111431", "21211432", "22111522", + "11211523", "31211521", "12111613", "32111611", "21211612", + "12211162", "21311161", "13111252", "22211251", "11311252", + "23111341", "12211342", "21311341", "13111432", "22211431", + "11311432", "23111521", "12211522", "21311521", "13111612", + "22211611", "11311612", "13211161", "11411161", "14111251", + "12311251", "13211341", "11411341", "14111431", "12311431", + "13211521", "11411521", "14111611", "12311611", + /* Column 21 */ + "21121162", + "11112163", "31112161", "11121253", "31121251", "21112252", + "21121342", "11112343", "31112341", "11121433", "31121431", + "21112432", "21121522", "11112523", "31112521", "11121613", + "31121611", "22121161", "11221162", "12112162", "12121252", + "21221251", "22112251", "11212252", "22121341", "11221342", + "12112342", "12121432", "21221431", "22112431", "11212432", + "22121521", "11221522", "12112522", "12121612", "21221611", + "12221161", "13112161", "13121251", "11312161", "11321251", + "32121115", "52121113", "21221116", "41221114", "61221112", + "22112116", "42112114", "31212115", "51212113", "13121116", + "33121114", "22221115", "42221113", "11321116", "31321114", + "51321112", "23112115", + /* Column 22 */ + "43112113", "12212116", "32212114", + "52212112", "21312115", "41312113", "61312111", "14121115", + "34121113", "23221114", "43221112", "12321115", "32321113", + "52321111", "21421114", "41421112", "24112114", "13212115", + "33212113", "22312114", "42312112", "11412115", "31412113", + "51412111", "15121114", "24221113", "13321114", "33321112", + "22421113", "42421111", "11521114", "31521112", "25112113", + "14212114", "34212112", "23312113", "43312111", "12412114", + "32412112", "21512113", "41512111", "16121113", "25221112", + "14321113", "34321111", "23421112", "12521113", "32521111", + "15212113", "24312112", "13412113", "33412111", "22512112", + "11612113", "31612111", "31131115", "51131113", "21122116", + /* Column 23 */ + "41122114", "61122112", "31113115", "51113113", "12131116", + "32131114", "52131112", "21231115", "41231113", "61231111", + "22122115", "42122113", "11222116", "31222114", "51222112", + "12113116", "32113114", "52113112", "21213115", "41213113", + "61213111", "13131115", "33131113", "22231114", "42231112", + "11331115", "31331113", "51331111", "23122114", "43122112", + "12222115", "32222113", "52222111", "21322114", "41322112", + "13113115", "33113113", "22213114", "42213112", "11313115", + "31313113", "51313111", "14131114", "34131112", "23231113", + "43231111", "12331114", "32331112", "21431113", "41431111", + "24122113", "13222114", "33222112", "22322113", "42322111", + "11422114", "31422112", "14113114", + /* Column 24 */ + "34113112", "23213113", + "43213111", "12313114", "32313112", "21413113", "41413111", + "15131113", "24231112", "13331113", "33331111", "22431112", + "25122112", "14222113", "34222111", "23322112", "12422113", + "32422111", "21522112", "15113113", "24213112", "13313113", + "33313111", "22413112", "11513113", "31513111", "16131112", + "25231111", "14331112", "23431111", "15222112", "24322111", + "13422112", "22522111", "16113112", "25213111", "14313112", + "23413111", "12513112", "21613111", "11141116", "31141114", + "51141112", "21132115", "41132113", "61132111", "11123116", + "31123114", "51123112", "21114115", "41114113", "61114111", + "12141115", "32141113", "52141111", "21241114", "41241112", + "22132114", + /* Column 25 */ + "42132112", "11232115", "31232113", "51232111", + "12123115", "32123113", "52123111", "21223114", "41223112", + "22114114", "42114112", "11214115", "31214113", "51214111", + "13141114", "33141112", "22241113", "42241111", "11341114", + "31341112", "23132113", "43132111", "12232114", "32232112", + "21332113", "41332111", "13123114", "33123112", "22223113", + "42223111", "11323114", "31323112", "23114113", "43114111", + "12214114", "32214112", "21314113", "41314111", "14141113", + "34141111", "23241112", "12341113", "32341111", "24132112", + "13232113", "33232111", "22332112", "11432113", "31432111", + "14123113", "34123111", "23223112", "12323113", "32323111", + "21423112", "24114112", "13214113", "33214111", + /* Column 26 */ + "22314112", + "11414113", "31414111", "15141112", "24241111", "13341112", + "25132111", "14232112", "23332111", "12432112", "15123112", + "24223111", "13323112", "22423111", "11523112", "25114111", + "14214112", "23314111", "12414112", "21514111", "16141111", + "14341111", "15232111", "13432111", "16123111", "14323111", + "12523111", "15214111", "13414111", "11614111", "11151115", + "31151113", "51151111", "21142114", "41142112", "11133115", + "31133113", "51133111", "21124114", "41124112", "11115115", + "31115113", "51115111", "12151114", "32151112", "21251113", + "41251111", "22142113", "42142111", "11242114", "31242112", + "12133114", "32133112", "21233113", "41233111", "22124113", + "42124111", "11224114", + /* Column 27 */ + "31224112", "12115114", "32115112", + "21215113", "41215111", "13151113", "33151111", "22251112", + "23142112", "12242113", "32242111", "21342112", "13133113", + "33133111", "22233112", "11333113", "31333111", "23124112", + "12224113", "32224111", "21324112", "13115113", "33115111", + "22215112", "11315113", "31315111", "14151112", "23251111", + "24142111", "13242112", "22342111", "14133112", "23233111", + "12333112", "21433111", "24124111", "13224112", "22324111", + "11424112", "14115112", "23215111", "12315112", "21415111", + "15151111", "14242111", "15133111", "13333111", "14224111", + "12424111", "15115111", "13315111", "11515111", "11161114", + "31161112", "21152113", "41152111", "11143114", "31143112", + /* Column 28 */ + "21134113", "41134111", "11125114", "31125112", "21116113", + "41116111", "12161113", "32161111", "22152112", "11252113", + "31252111", "12143113", "32143111", "21243112", "22134112", + "11234113", "31234111", "12125113", "32125111", "21225112", + "22116112", "11216113", "31216111", "13161112", "23152111", + "12252112", "13143112", "22243111", "11343112", "23134111", + "12234112", "21334111", "13125112", "22225111", "11325112", + "23116111", "12216112", "21316111", "14161111", "13252111", + "14143111", "12343111", "13234111", "11434111", "14125111", + "12325111", "13216111", "11416111", "31111216", "51111214", + "31211125", "51211123", "32111215", "52111213", "21211216", + "41211214", "61211212", "12211126", + /* Column 29 */ + "32211124", "52211122", + "21311125", "41311123", "61311121", "13111216", "33111214", + "22211215", "42211213", "11311216", "31311214", "51311212", + "13211125", "33211123", "22311124", "42311122", "11411125", + "31411123", "51411121", "14111215", "34111213", "23211214", + "43211212", "12311215", "32311213", "52311211", "21411214", + "41411212", "14211124", "34211122", "23311123", "43311121", + "12411124", "32411122", "21511123", "41511121", "15111214", + "24211213", "13311214", "33311212", "22411213", "42411211", + "11511214", "31511212", "15211123", "24311122", "13411123", + "33411121", "22511122", "11611123", "31611121", "16111213", + "25211212", "14311213", "34311211", "23411212", "12511213", + "32511211", + /* Column 30 */ + "21611212", "21121126", "41121124", "61121122", + "31112125", "51112123", "31121215", "51121213", "21112216", + "41112214", "61112212", "22121125", "42121123", "11221126", + "31221124", "51221122", "12112126", "32112124", "52112122", + "12121216", "32121214", "52121212", "21221215", "41221213", + "61221211", "22112215", "42112213", "11212216", "31212214", + "51212212", "23121124", "43121122", "12221125", "32221123", + "52221121", "21321124", "41321122", "13112125", "33112123", + "13121215", "33121213", "11312125", "22221214", "42221212", + "11321215", "31321213", "51321211", "23112214", "43112212", + "12212215", "32212213", "52212211", "21312214", "41312212", + "24121123", "13221124", "33221122", "22321123", + /* Column 31 */ + "42321121", + "11421124", "31421122", "14112124", "34112122", "14121214", + "34121212", "12312124", "23221213", "43221211", "12321214", + "32321212", "21421213", "41421211", "24112213", "13212214", + "33212212", "22312213", "42312211", "11412214", "31412212", + "25121122", "14221123", "34221121", "23321122", "12421123", + "32421121", "21521122", "15112123", "15121213", "13312123", + "24221212", "13321213", "33321211", "11512123", "22421212", + "11521213", "31521211", "25112212", "14212213", "34212211", + "23312212", "12412213", "32412211", "21512212", "15221122", + "24321121", "13421122", "22521121", "16112122", "16121212", + "14312122", "25221211", "14321212", "12512122", "23421211", + "12521212", "15212212", + /* Column 32 */ + "24312211", "13412212", "22512211", + "11612212", "21131125", "41131123", "61131121", "11122126", + "31122124", "51122122", "11131216", "31131214", "51131212", + "21113125", "41113123", "61113121", "21122215", "41122213", + "61122211", "11113216", "31113214", "51113212", "22131124", + "42131122", "11231125", "31231123", "51231121", "12122125", + "32122123", "52122121", "12131215", "32131213", "52131211", + "21231214", "41231212", "22113124", "42113122", "11213125", + "22122214", "42122212", "11222215", "31222213", "51222211", + "12113215", "32113213", "52113211", "21213214", "41213212", + "23131123", "43131121", "12231124", "32231122", "21331123", + "41331121", "13122124", "33122122", "13131214", "33131212", + /* Column 33 */ + "11322124", "22231213", "42231211", "11331214", "31331212", + "23113123", "43113121", "12213124", "23122213", "43122211", + "12222214", "32222212", "21322213", "41322211", "13113214", + "33113212", "22213213", "42213211", "11313214", "31313212", + "24131122", "13231123", "33231121", "22331122", "11431123", + "31431121", "14122123", "34122121", "14131213", "34131211", + "12322123", "23231212", "12331213", "32331211", "21431212", + "24113122", "13213123", "24122212", "13222213", "33222211", + "11413123", "22322212", "11422213", "31422211", "14113213", + "34113211", "23213212", "12313213", "32313211", "21413212", + "25131121", "14231122", "23331121", "12431122", "15122122", + "15131212", "13322122", "24231211", + /* Column 34 */ + "13331212", "11522122", + "22431211", "25113121", "14213122", "25122211", "14222212", + "12413122", "23322211", "12422212", "21522211", "15113212", + "24213211", "13313212", "22413211", "11513212", "15231121", + "13431121", "16122121", "16131211", "14322121", "14331211", + "12522121", "15213121", "15222211", "13413121", "13422211", + "11613121", "16113211", "14313211", "12513211", "21141124", + "41141122", "11132125", "31132123", "51132121", "11141215", + "31141213", "51141211", "21123124", "41123122", "21132214", + "41132212", "11114125", "31114123", "51114121", "11123215", + "31123213", "51123211", "21114214", "41114212", "22141123", + "42141121", "11241124", "31241122", "12132124", "32132122", + "12141214", + /* Column 35 */ + "32141212", "21241213", "41241211", "22123123", + "42123121", "11223124", "22132213", "42132211", "11232214", + "31232212", "12114124", "32114122", "12123214", "32123212", + "21223213", "41223211", "22114213", "42114211", "11214214", + "31214212", "23141122", "12241123", "32241121", "21341122", + "13132123", "33132121", "13141213", "33141211", "11332123", + "22241212", "11341213", "31341211", "23123122", "12223123", + "23132212", "12232213", "32232211", "21332212", "13114123", + "33114121", "13123213", "33123211", "11314123", "22223212", + "11323213", "31323211", "23114212", "12214213", "32214211", + "21314212", "24141121", "13241122", "22341121", "14132122", + "14141212", "12332122", "23241211", "12341212", + /* Column 36 */ + "24123121", + "13223122", "24132211", "13232212", "11423122", "22332211", + "11432212", "14114122", "14123212", "12314122", "23223211", + "12323212", "21423211", "24114211", "13214212", "22314211", + "11414212", "14241121", "15132121", "15141211", "13332121", + "13341211", "14223121", "14232211", "12423121", "12432211", + "15114121", "15123211", "13314121", "13323211", "11514121", + "11523211", "14214211", "12414211", "21151123", "41151121", + "11142124", "31142122", "11151214", "31151212", "21133123", + "41133121", "21142213", "41142211", "11124124", "31124122", + "11133214", "31133212", "21115123", "41115121", "21124213", + "41124211", "11115214", "31115212", "22151122", "11251123", + "31251121", "12142123", + /* Column 37 */ + "32142121", "12151213", "32151211", + "21251212", "22133122", "11233123", "22142212", "11242213", + "31242211", "12124123", "32124121", "12133213", "32133211", + "21233212", "22115122", "11215123", "22124212", "11224213", + "31224211", "12115213", "32115211", "21215212", "23151121", + "12251122", "13142122", "13151212", "11342122", "22251211", + "23133121", "12233122", "23142211", "12242212", "21342211", + "13124122", "13133212", "11324122", "22233211", "11333212", + "23115121", "12215122", "23124211", "12224212", "21324211", + "13115212", "22215211", "11315212", "13251121", "14142121", + "14151211", "12342121", "13233121", "13242211", "11433121", + "14124121", "14133211", "12324121", "12333211", "13215121", + /* Column 38 */ + "13224211", "11415121", "11424211", "14115211", "12315211", + "21161122", "11152123", "31152121", "11161213", "31161211", + "21143122", "21152212", "11134123", "31134121", "11143213", + "31143211", "21125122", "21134212", "11116123", "31116121", + "11125213", "31125211", "22161121", "12152122", "12161212", + "22143121", "11243122", "22152211", "11252212", "12134122", + "12143212", "21243211", "22125121", "11225122", "22134211", + "11234212", "12116122", "12125212", "21225211", "13152121", + "13161211", "12243121", "12252211", "13134121", "13143211", + "11334121", "11343211", "12225121", "12234211", "13116121", + "13125211", "11316121", "11325211", "21111226", "41111224", + "61111222", "31111315", "51111313", + /* Column 39 */ + "21211135", "41211133", + "61211131", "22111225", "42111223", "11211226", "31211224", + "51211222", "12111316", "32111314", "52111312", "21211315", + "41211313", "61211311", "22211134", "42211132", "11311135", + "31311133", "51311131", "23111224", "43111222", "12211225", + "32211223", "52211221", "21311224", "41311222", "13111315", + "33111313", "22211314", "42211312", "11311315", "31311313", + "51311311", "23211133", "43211131", "12311134", "32311132", + "21411133", "41411131", "24111223", "13211224", "33211222", + "22311223", "42311221", "11411224", "31411222", "14111314", + "34111312", "23211313", "43211311", "12311314", "32311312", + "21411313", "41411311", "24211132", "13311133", "33311131", + "22411132", + /* Column 40 */ + "11511133", "31511131", "25111222", "14211223", + "34211221", "23311222", "12411223", "32411221", "21511222", + "15111313", "24211312", "13311313", "33311311", "22411312", + "11511313", "31511311", "25211131", "14311132", "23411131", + "12511132", "21611131", "15211222", "24311221", "13411222", + "22511221", "11611222", "16111312", "25211311", "14311312", + "23411311", "12511312", "21611311", "31121134", "51121132", + "21112135", "41112133", "61112131", "21121225", "41121223", + "61121221", "11112226", "31112224", "51112222", "11121316", + "31121314", "51121312", "21112315", "41112313", "61112311", + "12121135", "32121133", "52121131", "21221134", "41221132", + "22112134", "42112132", "11212135", "22121224", + /* Column 41 */ + "42121222", + "11221225", "31221223", "51221221", "12112225", "32112223", + "52112221", "12121315", "32121313", "52121311", "21221314", + "41221312", "22112314", "42112312", "11212315", "31212313", + "51212311", "13121134", "33121132", "22221133", "42221131", + "11321134", "31321132", "23112133", "43112131", "12212134", + "23121223", "43121221", "12221224", "32221222", "21321223", + "41321221", "13112224", "33112222", "13121314", "33121312", + "11312224", "22221313", "42221311", "11321314", "31321312", + /* Column 42 */ + "23112313", "43112311", "12212314", "32212312", "21312313", + "41312311", "14121133", "34121131", "23221132", "12321133", + "32321131", "21421132", "24112132", "13212133", "24121222", + "13221223", "33221221", "11412133", "22321222", "11421223", + "31421221", "14112223", "34112221", "14121313", "34121311", + "12312223", "23221312", "12321313", "32321311", "21421312", + "24112312", "13212313", "33212311", "22312312", "11412313", + "31412311", "15121132", "24221131", "13321132", "22421131" }; static const char *c49_appxe_odd[2401] = { - /* Appendix E - Code 49 Encodation Patterns (Odd Symbol Character Parity) */ - /* Column 1 */ - "22121116", - "42121114", "31221115", "51221113", "32112115", "52112113", - "21212116", "41212114", "61212112", "23121115", "43121113", - "12221116", "32221114", "52221112", "21321115", "41321113", - "61321111", "13112116", "33112114", "22212115", "42212113", - "11312116", "31312114", "51312112", "24121114", "13221115", - "33221113", "22321114", "42321112", "11421115", "31421113", - "51421111", "14112115", "34112113", "23212114", "43212112", - "12312115", "32312113", "52312111", "21412114", "41412112", - "25121113", "14221114", "34221112", "23321113", "43321111", - "12421114", "32421112", "21521113", "41521111", "15112114", - "24212113", "13312114", "33312112", "22412113", "42412111", - "11512114", "31512112", - /* Column 2 */ - "15221113", "24321112", "13421113", - "33421111", "22521112", "16112113", "25212112", "14312113", - "34312111", "23412112", "12512113", "32512111", "21612112", - "21131116", "41131114", "61131112", "31122115", "51122113", - "21113116", "41113114", "61113112", "22131115", "42131113", - "11231116", "31231114", "51231112", "12122116", "32122114", - "52122112", "21222115", "41222113", "61222111", "22113115", - "42113113", "11213116", "31213114", "51213112", "23131114", - "43131112", "12231115", "32231113", "52231111", "21331114", - "41331112", "13122115", "33122113", "22222114", "42222112", - "11322115", "31322113", "51322111", "23113114", "43113112", - "12213115", "32213113", "52213111", "21313114", "41313112", - /* Column 3 */ - "24131113", "13231114", "33231112", "22331113", "42331111", - "11431114", "31431112", "14122114", "34122112", "23222113", - "43222111", "12322114", "32322112", "21422113", "41422111", - "24113113", "13213114", "33213112", "22313113", "42313111", - "11413114", "31413112", "25131112", "14231113", "34231111", - "23331112", "12431113", "32431111", "15122113", "24222112", - "13322113", "33322111", "22422112", "11522113", "31522111", - "25113112", "14213113", "34213111", "23313112", "12413113", - "32413111", "21513112", "15231112", "24331111", "13431112", - "16122112", "25222111", "14322112", "23422111", "12522112", - "15213112", "24313111", "13413112", "22513111", "11613112", - "21141115", "41141113", "61141111", - /* Column 4 */ - "11132116", "31132114", - "51132112", "21123115", "41123113", "61123111", "11114116", - "31114114", "51114112", "22141114", "42141112", "11241115", - "31241113", "51241111", "12132115", "32132113", "52132111", - "21232114", "41232112", "22123114", "42123112", "11223115", - "31223113", "51223111", "12114115", "32114113", "52114111", - "21214114", "41214112", "23141113", "43141111", "12241114", - "32241112", "21341113", "41341111", "13132114", "33132112", - "22232113", "42232111", "11332114", "31332112", "23123113", - "43123111", "12223114", "32223112", "21323113", "41323111", - "13114114", "33114112", "22214113", "42214111", "11314114", - "31314112", "24141112", "13241113", "33241111", "22341112", - "14132113", - /* Column 5 */ - "34132111", "23232112", "12332113", "32332111", - "21432112", "24123112", "13223113", "33223111", "22323112", - "11423113", "31423111", "14114113", "34114111", "23214112", - "12314113", "32314111", "21414112", "25141111", "14241112", - "23341111", "15132112", "24232111", "13332112", "22432111", - "25123111", "14223112", "23323111", "12423112", "21523111", - "15114112", "24214111", "13314112", "22414111", "11514112", - "15241111", "16132111", "14332111", "15223111", "13423111", - "16114111", "14314111", "12514111", "21151114", "41151112", - "11142115", "31142113", "51142111", "21133114", "41133112", - "11124115", "31124113", "51124111", "21115114", "41115112", - "22151113", "42151111", "11251114", "31251112", - /* Column 6 */ - "12142114", - "32142112", "21242113", "41242111", "22133113", "42133111", - "11233114", "31233112", "12124114", "32124112", "21224113", - "41224111", "22115113", "42115111", "11215114", "31215112", - "23151112", "12251113", "32251111", "13142113", "33142111", - "22242112", "11342113", "31342111", "23133112", "12233113", - "32233111", "21333112", "13124113", "33124111", "22224112", - "11324113", "31324111", "23115112", "12215113", "32215111", - "21315112", "24151111", "13251112", "14142112", "23242111", - "12342112", "24133111", "13233112", "22333111", "11433112", - "14124112", "23224111", "12324112", "21424111", "24115111", - "13215112", "22315111", "11415112", "14251111", "15142111", - "13342111", "14233111", - /* Column 7 */ - "12433111", "15124111", "13324111", - "11524111", "14215111", "12415111", "21161113", "41161111", - "11152114", "31152112", "21143113", "41143111", "11134114", - "31134112", "21125113", "41125111", "11116114", "31116112", - "22161112", "12152113", "32152111", "21252112", "22143112", - "11243113", "31243111", "12134113", "32134111", "21234112", - "22125112", "11225113", "31225111", "12116113", "32116111", - "21216112", "23161111", "13152112", "22252111", "23143111", - "12243112", "21343111", "13134112", "22234111", "11334112", - "23125111", "12225112", "21325111", "13116112", "22216111", - "11316112", "14152111", "13243111", "14134111", "12334111", - "13225111", "11425111", "14116111", "12316111", "41111215", - /* Column 8 */ - "61111213", "21211126", "41211124", "61211122", "22111216", - "42111214", "31211215", "51211213", "22211125", "42211123", - "11311126", "31311124", "51311122", "23111215", "43111213", - "12211216", "32211214", "52211212", "21311215", "41311213", - "61311211", "23211124", "43211122", "12311125", "32311123", - "52311121", "21411124", "41411122", "24111214", "13211215", - "33211213", "22311214", "42311212", "11411215", "31411213", - "51411211", "24211123", "13311124", "33311122", "22411123", - "42411121", "11511124", "31511122", "25111213", "14211214", - "34211212", "23311213", "43311211", "12411214", "32411212", - "21511213", "41511211", "25211122", "14311123", "34311121", - "23411122", "12511123", "32511121", - /* Column 9 */ - "21611122", "15211213", - "24311212", "13411213", "33411211", "22511212", "11611213", - "31611211", "31121125", "51121123", "21112126", "41112124", - "61112122", "21121216", "41121214", "61121212", "31112215", - "51112213", "12121126", "32121124", "52121122", "21221125", - "41221123", "61221121", "22112125", "42112123", "11212126", - "22121215", "42121213", "11221216", "31221214", "51221212", - "12112216", "32112214", "52112212", "21212215", "41212213", - "61212211", "13121125", "33121123", "22221124", "42221122", - "11321125", "31321123", "51321121", "23112124", "43112122", - "12212125", "23121214", "43121212", "12221215", "32221213", - "52221211", "21321214", "41321212", "13112215", "33112213", - "22212214", - /* Column 10 */ - "42212212", "11312215", "31312213", "51312211", - "14121124", "34121122", "23221123", "43221121", "12321124", - "32321122", "21421123", "41421121", "24112123", "13212124", - "24121213", "13221214", "33221212", "11412124", "22321213", - "42321211", "11421214", "31421212", "14112214", "34112212", - "23212213", "43212211", "12312214", "32312212", "21412213", - "41412211", "15121123", "24221122", "13321123", "33321121", - "22421122", "11521123", "31521121", "25112122", "14212123", - "25121212", "14221213", "34221211", "12412123", "23321212", - "12421213", "32421211", "21521212", "15112213", "24212212", - "13312213", "33312211", "22412212", "11512213", "31512211", - "16121122", "25221121", "14321122", "23421121", - /* Column 11 */ - "12521122", - "15212122", "15221212", "13412122", "24321211", "13421212", - "11612122", "22521211", "16112212", "25212211", "14312212", - "23412211", "12512212", "21612211", "11131126", "31131124", - "51131122", "21122125", "41122123", "61122121", "21131215", - "41131213", "61131211", "11113126", "31113124", "51113122", - "11122216", "31122214", "51122212", "21113215", "41113213", - "61113211", "12131125", "32131123", "52131121", "21231124", - "41231122", "22122124", "42122122", "11222125", "22131214", - "42131212", "11231215", "31231213", "51231211", "12113125", - "32113123", "52113121", "12122215", "32122213", "52122211", - "21222214", "41222212", "22113214", "42113212", "11213215", - "31213213", "51213211", - /* Column 12 */ - "13131124", "33131122", "22231123", - "42231121", "11331124", "31331122", "23122123", "43122121", - "12222124", "23131213", "43131211", "12231214", "32231212", - "21331213", "41331211", "13113124", "33113122", "13122214", - "33122212", "11313124", "22222213", "42222211", "11322214", - "31322212", "23113213", "43113211", "12213214", "32213212", - "21313213", "41313211", "14131123", "34131121", "23231122", - "12331123", "32331121", "21431122", "24122122", "13222123", - "24131212", "13231213", "33231211", "11422123", "22331212", - "11431213", "31431211", "14113123", "34113121", "14122213", - "34122211", "12313123", "23222212", "12322213", "32322211", - "21422212", "24113212", "13213213", "33213211", "22313212", - /* Column 13 */ - "11413213", "31413211", "15131122", "24231121", "13331122", - "22431121", "25122121", "14222122", "25131211", "14231212", - "12422122", "23331211", "12431212", "15113122", "15122212", - "13313122", "24222211", "13322212", "11513122", "22422211", - "11522212", "25113211", "14213212", "23313211", "12413212", - "21513211", "16131121", "14331121", "15222121", "15231211", - "13422121", "13431211", "16113121", "16122211", "14313121", - "14322211", "12513121", "12522211", "15213211", "13413211", - "11613211", "11141125", "31141123", "51141121", "21132124", - "41132122", "21141214", "41141212", "11123125", "31123123", - "51123121", "11132215", "31132213", "51132211", "21114124", - "41114122", "21123214", "41123212", - /* Column 14 */ - "11114215", "31114213", - "51114211", "12141124", "32141122", "21241123", "41241121", - "22132123", "42132121", "11232124", "22141213", "42141211", - "11241214", "31241212", "12123124", "32123122", "12132214", - "32132212", "21232213", "41232211", "22114123", "42114121", - "11214124", "22123213", "42123211", "11223214", "31223212", - "12114214", "32114212", "21214213", "41214211", "13141123", - "33141121", "22241122", "11341123", "31341121", "23132122", - "12232123", "23141212", "12241213", "32241211", "21341212", - "13123123", "33123121", "13132213", "33132211", "11323123", - "22232212", "11332213", "31332211", "23114122", "12214123", - "23123212", "12223213", "32223211", "21323212", "13114213", - "33114211", - /* Column 15 */ - "22214212", "11314213", "31314211", "14141122", - "23241121", "12341122", "24132121", "13232122", "24141211", - "13241212", "11432122", "22341211", "14123122", "14132212", - "12323122", "23232211", "12332212", "21432211", "24114121", - "13214122", "24123211", "13223212", "11414122", "22323211", - "11423212", "14114212", "23214211", "12314212", "21414211", - "15141121", "13341121", "14232121", "14241211", "12432121", - "15123121", "15132211", "13323121", "13332211", "11523121", - "14214121", "14223211", "12414121", "12423211", "15114211", - "13314211", "11514211", "11151124", "31151122", "21142123", - "41142121", "21151213", "41151211", "11133124", "31133122", - "11142214", "31142212", "21124123", "41124121", - /* Column 16 */ - "21133213", - "41133211", "11115124", "31115122", "11124214", "31124212", - "21115213", "41115211", "12151123", "32151121", "21251122", - "22142122", "11242123", "22151212", "11251213", "31251211", - "12133123", "32133121", "12142213", "32142211", "21242212", - "22124122", "11224123", "22133212", "11233213", "31233211", - "12115123", "32115121", "12124213", "32124211", "21224212", - "22115212", "11215213", "31215211", "13151122", "22251121", - "23142121", "12242122", "23151211", "12251212", "13133122", - "13142212", "11333122", "22242211", "11342212", "23124121", - "12224122", "23133211", "12233212", "21333211", "13115122", - "13124212", "11315122", "22224211", "11324212", "23115211", - "12215212", "21315211", - /* Column 17 */ - "14151121", "13242121", "13251211", - "14133121", "14142211", "12333121", "12342211", "13224121", - "13233211", "11424121", "11433211", "14115121", "14124211", - "12315121", "12324211", "13215211", "11415211", "11161123", - "31161121", "21152122", "21161212", "11143123", "31143121", - "11152213", "31152211", "21134122", "21143212", "11125123", - "31125121", "11134213", "31134211", "21116122", "21125212", - "12161122", "22152121", "11252122", "22161211", "12143122", - "12152212", "21252211", "22134121", "11234122", "22143211", - "11243212", "12125122", "12134212", "21234211", "22116121", - "11216122", "22125211", "11225212", "13161121", "12252121", - "13143121", "13152211", "11343121", "12234121", "12243211", - /* Column 18 */ - "13125121", "13134211", "11325121", "11334211", "12216121", - "12225211", "31111225", "51111223", "21111316", "41111314", - "61111312", "31211134", "51211132", "12111226", "32111224", - "52111222", "21211225", "41211223", "61211221", "22111315", - "42111313", "11211316", "31211314", "51211312", "12211135", - "32211133", "52211131", "21311134", "41311132", "13111225", - "33111223", "22211224", "42211222", "11311225", "31311223", - "51311221", "23111314", "43111312", "12211315", "32211313", - "52211311", "21311314", "41311312", "13211134", "33211132", - "22311133", "42311131", "11411134", "31411132", "14111224", - "34111222", "23211223", "43211221", "12311224", "32311222", - "21411223", "41411221", "24111313", - /* Column 19 */ - "13211314", "33211312", - "22311313", "42311311", "11411314", "31411312", "14211133", - "34211131", "23311132", "12411133", "32411131", "21511132", - "15111223", "24211222", "13311223", "33311221", "22411222", - "11511223", "31511221", "25111312", "14211313", "34211311", - "23311312", "12411313", "32411311", "21511312", "15211132", - "24311131", "13411132", "22511131", "11611132", "16111222", - "25211221", "14311222", "23411221", "12511222", "21611221", - "15211312", "24311311", "13411312", "22511311", "11611312", - "21121135", "41121133", "61121131", "11112136", "31112134", - "51112132", "11121226", "31121224", "51121222", "21112225", - "41112223", "61112221", "21121315", "41121313", "61121311", - "11112316", - /* Column 20 */ - "31112314", "51112312", "22121134", "42121132", - "11221135", "31221133", "51221131", "12112135", "32112133", - "52112131", "12121225", "32121223", "52121221", "21221224", - "41221222", "22112224", "42112222", "11212225", "22121314", - "42121312", "11221315", "31221313", "51221311", "12112315", - "32112313", "52112311", "21212314", "41212312", "23121133", - "43121131", "12221134", "32221132", "21321133", "41321131", - "13112134", "33112132", "13121224", "33121222", "11312134", - "22221223", "42221221", "11321224", "31321222", "23112223", - "43112221", "12212224", "23121313", "43121311", "12221314", - "32221312", "21321313", "41321311", "13112314", "33112312", - "22212313", "42212311", "11312314", "31312312", - /* Column 21 */ - "24121132", - "13221133", "33221131", "22321132", "11421133", "31421131", - "14112133", "34112131", "14121223", "34121221", "12312133", - "23221222", "12321223", "32321221", "21421222", "24112222", - "13212223", "24121312", "13221313", "33221311", "11412223", - "22321312", "11421313", "31421311", "14112313", "34112311", - "23212312", "12312313", "32312311", "21412312", "25121131", - "14221132", "23321131", "12421132", "21521131", "15112132", - "15121222", "13312132", "24221221", "13321222", "11512132", - "22421221", "11521222", "25112221", "14212222", "25121311", - "14221312", "12412222", "23321311", "12421312", "21521311", - "15112312", "24212311", "13312312", "22412311", "11512312", - "15221131", "13421131", - /* Column 22 */ - "16112131", "16121221", "14312131", - "14321221", "12512131", "12521221", "15212221", "15221311", - "13412221", "13421311", "11612221", "16112311", "14312311", - "12512311", "21131134", "41131132", "11122135", "31122133", - "51122131", "11131225", "31131223", "51131221", "21113134", - "41113132", "21122224", "41122222", "21131314", "41131312", - "11113225", "31113223", "51113221", "11122315", "31122313", - "51122311", "21113314", "41113312", "22131133", "42131131", - "11231134", "31231132", "12122134", "32122132", "12131224", - "32131222", "21231223", "41231221", "22113133", "42113131", - "11213134", "22122223", "42122221", "11222224", "22131313", - "42131311", "11231314", "31231312", "12113224", "32113222", - /* Column 23 */ - "12122314", "32122312", "21222313", "41222311", "22113313", - "42113311", "11213314", "31213312", "23131132", "12231133", - "32231131", "21331132", "13122133", "33122131", "13131223", - "33131221", "11322133", "22231222", "11331223", "31331221", - "23113132", "12213133", "23122222", "12222223", "23131312", - "12231313", "32231311", "21331312", "13113223", "33113221", - "13122313", "33122311", "11313223", "22222312", "11322313", - "31322311", "23113312", "12213313", "32213311", "21313312", - "24131131", "13231132", "22331131", "11431132", "14122132", - "14131222", "12322132", "23231221", "12331222", "21431221", - "24113131", "13213132", "24122221", "13222222", "24131311", - "11413132", "13231312", "11422222", - /* Column 24 */ - "22331311", "11431312", - "14113222", "14122312", "12313222", "23222311", "12322312", - "21422311", "24113311", "13213312", "22313311", "11413312", - "14231131", "12431131", "15122131", "15131221", "13322131", - "13331221", "11522131", "14213131", "14222221", "12413131", - "14231311", "12422221", "12431311", "15113221", "15122311", - "13313221", "13322311", "11513221", "11522311", "14213311", - "12413311", "21141133", "41141131", "11132134", "31132132", - "11141224", "31141222", "21123133", "41123131", "21132223", - "41132221", "21141313", "41141311", "11114134", "31114132", - "11123224", "31123222", "11132314", "31132312", "21114223", - "41114221", "21123313", "41123311", "11114314", "31114312", - "22141132", - /* Column 25 */ - "11241133", "31241131", "12132133", "32132131", - "12141223", "32141221", "21241222", "22123132", "11223133", - "22132222", "11232223", "22141312", "11241313", "31241311", - "12114133", "32114131", "12123223", "32123221", "12132313", - "32132311", "21232312", "22114222", "11214223", "22123312", - "11223313", "31223311", "12114313", "32114311", "21214312", - "23141131", "12241132", "21341131", "13132132", "13141222", - "11332132", "22241221", "11341222", "23123131", "12223132", - "23132221", "12232222", "23141311", "12241312", "21341311", - "13114132", "13123222", "11314132", "13132312", "11323222", - "22232311", "11332312", "23114221", "12214222", "23123311", - "12223312", "21323311", "13114312", "22214311", - /* Column 26 */ - "11314312", - "13241131", "14132131", "14141221", "12332131", "12341221", - "13223131", "13232221", "11423131", "13241311", "11432221", - "14114131", "14123221", "12314131", "14132311", "12323221", - "12332311", "13214221", "13223311", "11414221", "11423311", - "14114311", "12314311", "21151132", "11142133", "31142131", - "11151223", "31151221", "21133132", "21142222", "21151312", - "11124133", "31124131", "11133223", "31133221", "11142313", - "31142311", "21115132", "21124222", "21133312", "11115223", - "31115221", "11124313", "31124311", "22151131", "11251132", - "12142132", "12151222", "21251221", "22133131", "11233132", - "22142221", "11242222", "22151311", "11251312", "12124132", - "12133222", "12142312", - /* Column 27 */ - "21242311", "22115131", "11215132", - "22124221", "11224222", "22133311", "11233312", "12115222", - "12124312", "21224311", "12251131", "13142131", "13151221", - "11342131", "12233131", "12242221", "12251311", "13124131", - "13133221", "11324131", "13142311", "11333221", "11342311", - "12215131", "12224221", "12233311", "13115221", "13124311", - "11315221", "11324311", "21161131", "11152132", "11161222", - "21143131", "21152221", "21161311", "11134132", "11143222", - "11152312", "21125131", "21134221", "21143311", "11116132", - "11125222", "11134312", "12152131", "12161221", "11243131", - "11252221", "12134131", "12143221", "12152311", "11225131", - "11234221", "11243311", "12116131", "12125221", "12134311", - /* Column 28 */ - "21111235", "41111233", "61111231", "11111326", "31111324", - "51111322", "21111415", "41111413", "61111411", "21211144", - "41211142", "22111234", "42111232", "11211235", "31211233", - "51211231", "12111325", "32111323", "52111321", "21211324", - "41211322", "22111414", "42111412", "11211415", "31211413", - "51211411", "22211143", "42211141", "11311144", "31311142", - "23111233", "43111231", "12211234", "32211232", "21311233", - "41311231", "13111324", "33111322", "22211323", "42211321", - "11311324", "31311322", "23111413", "43111411", "12211414", - "32211412", "21311413", "41311411", "23211142", "12311143", - "32311141", "21411142", "24111232", "13211233", "33211231", - "22311232", "11411233", "31411231", - /* Column 29 */ - "14111323", "34111321", - "23211322", "12311323", "32311321", "21411322", "24111412", - "13211413", "33211411", "22311412", "11411413", "31411411", - "24211141", "13311142", "22411141", "11511142", "25111231", - "14211232", "23311231", "12411232", "21511231", "15111322", - "24211321", "13311322", "22411321", "11511322", "25111411", - "14211412", "23311411", "12411412", "21511411", "14311141", - "12511141", "15211231", "13411231", "11611231", "16111321", - "14311321", "12511321", "15211411", "13411411", "11611411", - "31121143", "51121141", "21112144", "41112142", "21121234", - "41121232", "11112235", "31112233", "51112231", "11121325", - "31121323", "51121321", "21112324", "41112322", "21121414", - "41121412", - /* Column 30 */ - "11112415", "31112413", "51112411", "12121144", - "32121142", "21221143", "41221141", "22112143", "42112141", - "11212144", "22121233", "42121231", "11221234", "31221232", - "12112234", "32112232", "12121324", "32121322", "21221323", - "41221321", "22112323", "42112321", "11212324", "22121413", - "42121411", "11221414", "31221412", "12112414", "32112412", - "21212413", "41212411", "13121143", "33121141", "22221142", - "11321143", "31321141", "23112142", "12212143", "23121232", - "12221233", "32221231", "21321232", "13112233", "33112231", - "13121323", "33121321", "11312233", "22221322", "11321323", - "31321321", "23112322", "12212323", "23121412", "12221413", - "32221411", "21321412", "13112413", "33112411", - /* Column 31 */ - "22212412", - "11312413", "31312411", "14121142", "23221141", "12321142", - "21421141", "24112141", "13212142", "24121231", "13221232", - "11412142", "22321231", "11421232", "14112232", "14121322", - "12312232", "23221321", "12321322", "21421321", "24112321", - "13212322", "24121411", "13221412", "11412322", "22321411", - "11421412", "14112412", "23212411", "12312412", "21412411", - "15121141", "13321141", "11521141", "14212141", "14221231", - "12412141", "12421231", "15112231", "15121321", "13312231", - "13321321", "11512231", "11521321", "14212321", "14221411", - "12412321", "12421411", "15112411", "13312411", "11512411", - "11131144", "31131142", "21122143", "41122141", "21131233", - "41131231", "11113144", - /* Column 32 */ - "31113142", "11122234", "31122232", - "11131324", "31131322", "21113233", "41113231", "21122323", - "41122321", "21131413", "41131411", "11113324", "31113322", - "11122414", "31122412", "21113413", "41113411", "12131143", - "32131141", "21231142", "22122142", "11222143", "22131232", - "11231233", "31231231", "12113143", "32113141", "12122233", - "32122231", "12131323", "32131321", "21231322", "22113232", - "11213233", "22122322", "11222323", "22131412", "11231413", - "31231411", "12113323", "32113321", "12122413", "32122411", - "21222412", "22113412", "11213413", "31213411", "13131142", - "22231141", "11331142", "23122141", "12222142", "23131231", - "12231232", "21331231", "13113142", "13122232", "11313142", - /* Column 33 */ - "13131322", "11322232", "22231321", "11331322", "23113231", - "12213232", "23122321", "12222322", "23131411", "12231412", - "21331411", "13113322", "13122412", "11313322", "22222411", - "11322412", "23113411", "12213412", "21313411", "14131141", - "12331141", "13222141", "13231231", "11422141", "11431231", - "14113141", "14122231", "12313141", "14131321", "12322231", - "12331321", "13213231", "13222321", "11413231", "13231411", - "11422321", "11431411", "14113321", "14122411", "12313321", - "12322411", "13213411", "11413411", "11141143", "31141141", - "21132142", "21141232", "11123143", "31123141", "11132233", - "31132231", "11141323", "31141321", "21114142", "21123232", - "21132322", "21141412", "11114233", - /* Column 34 */ - "31114231", "11123323", - "31123321", "11132413", "31132411", "21114322", "21123412", - "12141142", "21241141", "22132141", "11232142", "22141231", - "11241232", "12123142", "12132232", "12141322", "21241321", - "22114141", "11214142", "22123231", "11223232", "22132321", - "11232322", "22141411", "11241412", "12114232", "12123322", - "12132412", "21232411", "22114321", "11214322", "22123411", - "11223412", "13141141", "11341141", "12232141", "12241231", - "13123141", "13132231", "11323141", "13141321", "11332231", - "11341321", "12214141", "12223231", "12232321", "12241411", - "13114231", "13123321", "11314231", "13132411", "11323321", - "11332411", "12214321", "12223411", "11151142", "21142141", - "21151231", - /* Column 35 */ - "11133142", "11142232", "11151322", "21124141", - "21133231", "21142321", "21151411", "11115142", "11124232", - "11133322", "11142412", "21115231", "21124321", "21133411", - "12151141", "11242141", "11251231", "12133141", "12142231", - "12151321", "11224141", "11233231", "11242321", "11251411", - "12115141", "12124231", "12133321", "12142411", "11215231", - "11224321", "11233411", "11161141", "11143141", "11152231", - "11161321", "11125141", "11134231", "11143321", "11152411", - "11111245", "31111243", "51111241", "21111334", "41111332", - "11111425", "31111423", "51111421", "21111514", "41111512", - "31211152", "12111244", "32111242", "21211243", "41211241", - "22111333", "42111331", "11211334", "31211332", - /* Column 36 */ - "12111424", - "32111422", "21211423", "41211421", "22111513", "42111511", - "11211514", "31211512", "12211153", "32211151", "21311152", - "13111243", "33111241", "22211242", "11311243", "31311241", - "23111332", "12211333", "32211331", "21311332", "13111423", - "33111421", "22211422", "11311423", "31311421", "23111512", - "12211513", "32211511", "21311512", "13211152", "22311151", - "11411152", "14111242", "23211241", "12311242", "21411241", - "24111331", "13211332", "22311331", "11411332", "14111422", - "23211421", "12311422", "21411421", "24111511", "13211512", - "22311511", "11411512", "14211151", "12411151", "15111241", - "13311241", "11511241", "14211331", "12411331", "15111421", - "13311421", "11511421", - /* Column 37 */ - "14211511", "12411511", "21121153", - "41121151", "11112154", "31112152", "11121244", "31121242", - "21112243", "41112241", "21121333", "41121331", "11112334", - "31112332", "11121424", "31121422", "21112423", "41112421", - "21121513", "41121511", "11112514", "31112512", "22121152", - "11221153", "31221151", "12112153", "32112151", "12121243", - "32121241", "21221242", "22112242", "11212243", "22121332", - "11221333", "31221331", "12112333", "32112331", "12121423", - "32121421", "21221422", "22112422", "11212423", "22121512", - "11221513", "31221511", "12112513", "32112511", "21212512", - "23121151", "12221152", "21321151", "13112152", "13121242", - "11312152", "22221241", "11321242", "23112241", "12212242", - /* Column 38 */ - "23121331", "12221332", "21321331", "13112332", "13121422", - "11312332", "22221421", "11321422", "23112421", "12212422", - "23121511", "12221512", "21321511", "13112512", "22212511", - "11312512", "13221151", "11421151", "14112151", "14121241", - "12312151", "12321241", "13212241", "13221331", "11412241", - "11421331", "14112331", "14121421", "12312331", "12321421", - "13212421", "13221511", "11412421", "11421511", "14112511", - "12312511", "21131152", "11122153", "31122151", "11131243", - "31131241", "21113152", "21122242", "21131332", "11113243", - "31113241", "11122333", "31122331", "11131423", "31131421", - "21113332", "21122422", "21131512", "11113423", "31113421", - "11122513", "31122511", "22131151", - /* Column 39 */ - "11231152", "12122152", - "12131242", "21231241", "22113151", "11213152", "22122241", - "11222242", "22131331", "11231332", "12113242", "12122332", - "12131422", "21231421", "22113331", "11213332", "22122421", - "11222422", "22131511", "11231512", "12113422", "12122512", - "21222511", "12231151", "13122151", "13131241", "11322151", - "11331241", "12213151", "12222241", "12231331", "13113241", - "13122331", "11313241", "13131421", "11322331", "11331421", - "12213331", "12222421", "12231511", "13113421", "13122511", - "11313421", "11322511", "21141151", "11132152", "11141242", - "21123151", "21132241", "21141331", "11114152", "11123242", - "11132332", "11141422", "21114241", "21123331", "21132421", - "21141511", - /* Column 40 */ - "11114332", "11123422", "11132512", "11241151", - "12132151", "12141241", "11223151", "11232241", "11241331", - "12114151", "12123241", "12132331", "12141421", "11214241", - "11223331", "11232421", "11241511", "12114331", "12123421", - "12132511", "11142151", "11151241", "11124151", "11133241", - "11142331", "11151421", "11115241", "11124331", "11133421", - "11142511", "21111253", "41111251", "11111344", "31111342", - "21111433", "41111431", "11111524", "31111522", "21111613", - "41111611", "21211162", "22111252", "11211253", "31211251", - "12111343", "32111341", "21211342", "22111432", "11211433", - "31211431", "12111523", "32111521", "21211522", "22111612", - "11211613", "31211611", "22211161", "11311162", - /* Column 41 */ - "23111251", - "12211252", "21311251", "13111342", "22211341", "11311342", - "23111431", "12211432", "21311431", "13111522", "22211521", - "11311522", "23111611", "12211612", "21311611", "12311161", - "13211251", "11411251", "14111341", "12311341", "13211431", - "11411431", "14111521", "12311521", "13211611", "11411611", - "31121161", "21112162", "21121252", "11112253", "31112251", - "11121343", "31121341", "21112342", "21121432", "11112433", - "31112431", "11121523", "31121521", "21112522", "21121612", - /* Column 42 */ - "12121162", "21221161", "22112161", "11212162", "22121251", - "11221252", "12112252", "12121342", "21221341", "22112341", - "11212342", "22121431", "11221432", "12112432", "12121522", - "21221521", "22112521", "11212522", "22121611", "11221612", - "13121161", "11321161", "12212161", "12221251", "13112251", - "13121341", "11312251", "11321341", "12212341", "12221431", - "13112431", "13121521", "11312431", "11321521", "12212521", - "12221611", "11131162", "21122161", "21131251", "11113162" + /* Appendix E - Code 49 Encodation Patterns (Odd Symbol Character Parity) */ + /* Column 1 */ + "22121116", + "42121114", "31221115", "51221113", "32112115", "52112113", + "21212116", "41212114", "61212112", "23121115", "43121113", + "12221116", "32221114", "52221112", "21321115", "41321113", + "61321111", "13112116", "33112114", "22212115", "42212113", + "11312116", "31312114", "51312112", "24121114", "13221115", + "33221113", "22321114", "42321112", "11421115", "31421113", + "51421111", "14112115", "34112113", "23212114", "43212112", + "12312115", "32312113", "52312111", "21412114", "41412112", + "25121113", "14221114", "34221112", "23321113", "43321111", + "12421114", "32421112", "21521113", "41521111", "15112114", + "24212113", "13312114", "33312112", "22412113", "42412111", + "11512114", "31512112", + /* Column 2 */ + "15221113", "24321112", "13421113", + "33421111", "22521112", "16112113", "25212112", "14312113", + "34312111", "23412112", "12512113", "32512111", "21612112", + "21131116", "41131114", "61131112", "31122115", "51122113", + "21113116", "41113114", "61113112", "22131115", "42131113", + "11231116", "31231114", "51231112", "12122116", "32122114", + "52122112", "21222115", "41222113", "61222111", "22113115", + "42113113", "11213116", "31213114", "51213112", "23131114", + "43131112", "12231115", "32231113", "52231111", "21331114", + "41331112", "13122115", "33122113", "22222114", "42222112", + "11322115", "31322113", "51322111", "23113114", "43113112", + "12213115", "32213113", "52213111", "21313114", "41313112", + /* Column 3 */ + "24131113", "13231114", "33231112", "22331113", "42331111", + "11431114", "31431112", "14122114", "34122112", "23222113", + "43222111", "12322114", "32322112", "21422113", "41422111", + "24113113", "13213114", "33213112", "22313113", "42313111", + "11413114", "31413112", "25131112", "14231113", "34231111", + "23331112", "12431113", "32431111", "15122113", "24222112", + "13322113", "33322111", "22422112", "11522113", "31522111", + "25113112", "14213113", "34213111", "23313112", "12413113", + "32413111", "21513112", "15231112", "24331111", "13431112", + "16122112", "25222111", "14322112", "23422111", "12522112", + "15213112", "24313111", "13413112", "22513111", "11613112", + "21141115", "41141113", "61141111", + /* Column 4 */ + "11132116", "31132114", + "51132112", "21123115", "41123113", "61123111", "11114116", + "31114114", "51114112", "22141114", "42141112", "11241115", + "31241113", "51241111", "12132115", "32132113", "52132111", + "21232114", "41232112", "22123114", "42123112", "11223115", + "31223113", "51223111", "12114115", "32114113", "52114111", + "21214114", "41214112", "23141113", "43141111", "12241114", + "32241112", "21341113", "41341111", "13132114", "33132112", + "22232113", "42232111", "11332114", "31332112", "23123113", + "43123111", "12223114", "32223112", "21323113", "41323111", + "13114114", "33114112", "22214113", "42214111", "11314114", + "31314112", "24141112", "13241113", "33241111", "22341112", + "14132113", + /* Column 5 */ + "34132111", "23232112", "12332113", "32332111", + "21432112", "24123112", "13223113", "33223111", "22323112", + "11423113", "31423111", "14114113", "34114111", "23214112", + "12314113", "32314111", "21414112", "25141111", "14241112", + "23341111", "15132112", "24232111", "13332112", "22432111", + "25123111", "14223112", "23323111", "12423112", "21523111", + "15114112", "24214111", "13314112", "22414111", "11514112", + "15241111", "16132111", "14332111", "15223111", "13423111", + "16114111", "14314111", "12514111", "21151114", "41151112", + "11142115", "31142113", "51142111", "21133114", "41133112", + "11124115", "31124113", "51124111", "21115114", "41115112", + "22151113", "42151111", "11251114", "31251112", + /* Column 6 */ + "12142114", + "32142112", "21242113", "41242111", "22133113", "42133111", + "11233114", "31233112", "12124114", "32124112", "21224113", + "41224111", "22115113", "42115111", "11215114", "31215112", + "23151112", "12251113", "32251111", "13142113", "33142111", + "22242112", "11342113", "31342111", "23133112", "12233113", + "32233111", "21333112", "13124113", "33124111", "22224112", + "11324113", "31324111", "23115112", "12215113", "32215111", + "21315112", "24151111", "13251112", "14142112", "23242111", + "12342112", "24133111", "13233112", "22333111", "11433112", + "14124112", "23224111", "12324112", "21424111", "24115111", + "13215112", "22315111", "11415112", "14251111", "15142111", + "13342111", "14233111", + /* Column 7 */ + "12433111", "15124111", "13324111", + "11524111", "14215111", "12415111", "21161113", "41161111", + "11152114", "31152112", "21143113", "41143111", "11134114", + "31134112", "21125113", "41125111", "11116114", "31116112", + "22161112", "12152113", "32152111", "21252112", "22143112", + "11243113", "31243111", "12134113", "32134111", "21234112", + "22125112", "11225113", "31225111", "12116113", "32116111", + "21216112", "23161111", "13152112", "22252111", "23143111", + "12243112", "21343111", "13134112", "22234111", "11334112", + "23125111", "12225112", "21325111", "13116112", "22216111", + "11316112", "14152111", "13243111", "14134111", "12334111", + "13225111", "11425111", "14116111", "12316111", "41111215", + /* Column 8 */ + "61111213", "21211126", "41211124", "61211122", "22111216", + "42111214", "31211215", "51211213", "22211125", "42211123", + "11311126", "31311124", "51311122", "23111215", "43111213", + "12211216", "32211214", "52211212", "21311215", "41311213", + "61311211", "23211124", "43211122", "12311125", "32311123", + "52311121", "21411124", "41411122", "24111214", "13211215", + "33211213", "22311214", "42311212", "11411215", "31411213", + "51411211", "24211123", "13311124", "33311122", "22411123", + "42411121", "11511124", "31511122", "25111213", "14211214", + "34211212", "23311213", "43311211", "12411214", "32411212", + "21511213", "41511211", "25211122", "14311123", "34311121", + "23411122", "12511123", "32511121", + /* Column 9 */ + "21611122", "15211213", + "24311212", "13411213", "33411211", "22511212", "11611213", + "31611211", "31121125", "51121123", "21112126", "41112124", + "61112122", "21121216", "41121214", "61121212", "31112215", + "51112213", "12121126", "32121124", "52121122", "21221125", + "41221123", "61221121", "22112125", "42112123", "11212126", + "22121215", "42121213", "11221216", "31221214", "51221212", + "12112216", "32112214", "52112212", "21212215", "41212213", + "61212211", "13121125", "33121123", "22221124", "42221122", + "11321125", "31321123", "51321121", "23112124", "43112122", + "12212125", "23121214", "43121212", "12221215", "32221213", + "52221211", "21321214", "41321212", "13112215", "33112213", + "22212214", + /* Column 10 */ + "42212212", "11312215", "31312213", "51312211", + "14121124", "34121122", "23221123", "43221121", "12321124", + "32321122", "21421123", "41421121", "24112123", "13212124", + "24121213", "13221214", "33221212", "11412124", "22321213", + "42321211", "11421214", "31421212", "14112214", "34112212", + "23212213", "43212211", "12312214", "32312212", "21412213", + "41412211", "15121123", "24221122", "13321123", "33321121", + "22421122", "11521123", "31521121", "25112122", "14212123", + "25121212", "14221213", "34221211", "12412123", "23321212", + "12421213", "32421211", "21521212", "15112213", "24212212", + "13312213", "33312211", "22412212", "11512213", "31512211", + "16121122", "25221121", "14321122", "23421121", + /* Column 11 */ + "12521122", + "15212122", "15221212", "13412122", "24321211", "13421212", + "11612122", "22521211", "16112212", "25212211", "14312212", + "23412211", "12512212", "21612211", "11131126", "31131124", + "51131122", "21122125", "41122123", "61122121", "21131215", + "41131213", "61131211", "11113126", "31113124", "51113122", + "11122216", "31122214", "51122212", "21113215", "41113213", + "61113211", "12131125", "32131123", "52131121", "21231124", + "41231122", "22122124", "42122122", "11222125", "22131214", + "42131212", "11231215", "31231213", "51231211", "12113125", + "32113123", "52113121", "12122215", "32122213", "52122211", + "21222214", "41222212", "22113214", "42113212", "11213215", + "31213213", "51213211", + /* Column 12 */ + "13131124", "33131122", "22231123", + "42231121", "11331124", "31331122", "23122123", "43122121", + "12222124", "23131213", "43131211", "12231214", "32231212", + "21331213", "41331211", "13113124", "33113122", "13122214", + "33122212", "11313124", "22222213", "42222211", "11322214", + "31322212", "23113213", "43113211", "12213214", "32213212", + "21313213", "41313211", "14131123", "34131121", "23231122", + "12331123", "32331121", "21431122", "24122122", "13222123", + "24131212", "13231213", "33231211", "11422123", "22331212", + "11431213", "31431211", "14113123", "34113121", "14122213", + "34122211", "12313123", "23222212", "12322213", "32322211", + "21422212", "24113212", "13213213", "33213211", "22313212", + /* Column 13 */ + "11413213", "31413211", "15131122", "24231121", "13331122", + "22431121", "25122121", "14222122", "25131211", "14231212", + "12422122", "23331211", "12431212", "15113122", "15122212", + "13313122", "24222211", "13322212", "11513122", "22422211", + "11522212", "25113211", "14213212", "23313211", "12413212", + "21513211", "16131121", "14331121", "15222121", "15231211", + "13422121", "13431211", "16113121", "16122211", "14313121", + "14322211", "12513121", "12522211", "15213211", "13413211", + "11613211", "11141125", "31141123", "51141121", "21132124", + "41132122", "21141214", "41141212", "11123125", "31123123", + "51123121", "11132215", "31132213", "51132211", "21114124", + "41114122", "21123214", "41123212", + /* Column 14 */ + "11114215", "31114213", + "51114211", "12141124", "32141122", "21241123", "41241121", + "22132123", "42132121", "11232124", "22141213", "42141211", + "11241214", "31241212", "12123124", "32123122", "12132214", + "32132212", "21232213", "41232211", "22114123", "42114121", + "11214124", "22123213", "42123211", "11223214", "31223212", + "12114214", "32114212", "21214213", "41214211", "13141123", + "33141121", "22241122", "11341123", "31341121", "23132122", + "12232123", "23141212", "12241213", "32241211", "21341212", + "13123123", "33123121", "13132213", "33132211", "11323123", + "22232212", "11332213", "31332211", "23114122", "12214123", + "23123212", "12223213", "32223211", "21323212", "13114213", + "33114211", + /* Column 15 */ + "22214212", "11314213", "31314211", "14141122", + "23241121", "12341122", "24132121", "13232122", "24141211", + "13241212", "11432122", "22341211", "14123122", "14132212", + "12323122", "23232211", "12332212", "21432211", "24114121", + "13214122", "24123211", "13223212", "11414122", "22323211", + "11423212", "14114212", "23214211", "12314212", "21414211", + "15141121", "13341121", "14232121", "14241211", "12432121", + "15123121", "15132211", "13323121", "13332211", "11523121", + "14214121", "14223211", "12414121", "12423211", "15114211", + "13314211", "11514211", "11151124", "31151122", "21142123", + "41142121", "21151213", "41151211", "11133124", "31133122", + "11142214", "31142212", "21124123", "41124121", + /* Column 16 */ + "21133213", + "41133211", "11115124", "31115122", "11124214", "31124212", + "21115213", "41115211", "12151123", "32151121", "21251122", + "22142122", "11242123", "22151212", "11251213", "31251211", + "12133123", "32133121", "12142213", "32142211", "21242212", + "22124122", "11224123", "22133212", "11233213", "31233211", + "12115123", "32115121", "12124213", "32124211", "21224212", + "22115212", "11215213", "31215211", "13151122", "22251121", + "23142121", "12242122", "23151211", "12251212", "13133122", + "13142212", "11333122", "22242211", "11342212", "23124121", + "12224122", "23133211", "12233212", "21333211", "13115122", + "13124212", "11315122", "22224211", "11324212", "23115211", + "12215212", "21315211", + /* Column 17 */ + "14151121", "13242121", "13251211", + "14133121", "14142211", "12333121", "12342211", "13224121", + "13233211", "11424121", "11433211", "14115121", "14124211", + "12315121", "12324211", "13215211", "11415211", "11161123", + "31161121", "21152122", "21161212", "11143123", "31143121", + "11152213", "31152211", "21134122", "21143212", "11125123", + "31125121", "11134213", "31134211", "21116122", "21125212", + "12161122", "22152121", "11252122", "22161211", "12143122", + "12152212", "21252211", "22134121", "11234122", "22143211", + "11243212", "12125122", "12134212", "21234211", "22116121", + "11216122", "22125211", "11225212", "13161121", "12252121", + "13143121", "13152211", "11343121", "12234121", "12243211", + /* Column 18 */ + "13125121", "13134211", "11325121", "11334211", "12216121", + "12225211", "31111225", "51111223", "21111316", "41111314", + "61111312", "31211134", "51211132", "12111226", "32111224", + "52111222", "21211225", "41211223", "61211221", "22111315", + "42111313", "11211316", "31211314", "51211312", "12211135", + "32211133", "52211131", "21311134", "41311132", "13111225", + "33111223", "22211224", "42211222", "11311225", "31311223", + "51311221", "23111314", "43111312", "12211315", "32211313", + "52211311", "21311314", "41311312", "13211134", "33211132", + "22311133", "42311131", "11411134", "31411132", "14111224", + "34111222", "23211223", "43211221", "12311224", "32311222", + "21411223", "41411221", "24111313", + /* Column 19 */ + "13211314", "33211312", + "22311313", "42311311", "11411314", "31411312", "14211133", + "34211131", "23311132", "12411133", "32411131", "21511132", + "15111223", "24211222", "13311223", "33311221", "22411222", + "11511223", "31511221", "25111312", "14211313", "34211311", + "23311312", "12411313", "32411311", "21511312", "15211132", + "24311131", "13411132", "22511131", "11611132", "16111222", + "25211221", "14311222", "23411221", "12511222", "21611221", + "15211312", "24311311", "13411312", "22511311", "11611312", + "21121135", "41121133", "61121131", "11112136", "31112134", + "51112132", "11121226", "31121224", "51121222", "21112225", + "41112223", "61112221", "21121315", "41121313", "61121311", + "11112316", + /* Column 20 */ + "31112314", "51112312", "22121134", "42121132", + "11221135", "31221133", "51221131", "12112135", "32112133", + "52112131", "12121225", "32121223", "52121221", "21221224", + "41221222", "22112224", "42112222", "11212225", "22121314", + "42121312", "11221315", "31221313", "51221311", "12112315", + "32112313", "52112311", "21212314", "41212312", "23121133", + "43121131", "12221134", "32221132", "21321133", "41321131", + "13112134", "33112132", "13121224", "33121222", "11312134", + "22221223", "42221221", "11321224", "31321222", "23112223", + "43112221", "12212224", "23121313", "43121311", "12221314", + "32221312", "21321313", "41321311", "13112314", "33112312", + "22212313", "42212311", "11312314", "31312312", + /* Column 21 */ + "24121132", + "13221133", "33221131", "22321132", "11421133", "31421131", + "14112133", "34112131", "14121223", "34121221", "12312133", + "23221222", "12321223", "32321221", "21421222", "24112222", + "13212223", "24121312", "13221313", "33221311", "11412223", + "22321312", "11421313", "31421311", "14112313", "34112311", + "23212312", "12312313", "32312311", "21412312", "25121131", + "14221132", "23321131", "12421132", "21521131", "15112132", + "15121222", "13312132", "24221221", "13321222", "11512132", + "22421221", "11521222", "25112221", "14212222", "25121311", + "14221312", "12412222", "23321311", "12421312", "21521311", + "15112312", "24212311", "13312312", "22412311", "11512312", + "15221131", "13421131", + /* Column 22 */ + "16112131", "16121221", "14312131", + "14321221", "12512131", "12521221", "15212221", "15221311", + "13412221", "13421311", "11612221", "16112311", "14312311", + "12512311", "21131134", "41131132", "11122135", "31122133", + "51122131", "11131225", "31131223", "51131221", "21113134", + "41113132", "21122224", "41122222", "21131314", "41131312", + "11113225", "31113223", "51113221", "11122315", "31122313", + "51122311", "21113314", "41113312", "22131133", "42131131", + "11231134", "31231132", "12122134", "32122132", "12131224", + "32131222", "21231223", "41231221", "22113133", "42113131", + "11213134", "22122223", "42122221", "11222224", "22131313", + "42131311", "11231314", "31231312", "12113224", "32113222", + /* Column 23 */ + "12122314", "32122312", "21222313", "41222311", "22113313", + "42113311", "11213314", "31213312", "23131132", "12231133", + "32231131", "21331132", "13122133", "33122131", "13131223", + "33131221", "11322133", "22231222", "11331223", "31331221", + "23113132", "12213133", "23122222", "12222223", "23131312", + "12231313", "32231311", "21331312", "13113223", "33113221", + "13122313", "33122311", "11313223", "22222312", "11322313", + "31322311", "23113312", "12213313", "32213311", "21313312", + "24131131", "13231132", "22331131", "11431132", "14122132", + "14131222", "12322132", "23231221", "12331222", "21431221", + "24113131", "13213132", "24122221", "13222222", "24131311", + "11413132", "13231312", "11422222", + /* Column 24 */ + "22331311", "11431312", + "14113222", "14122312", "12313222", "23222311", "12322312", + "21422311", "24113311", "13213312", "22313311", "11413312", + "14231131", "12431131", "15122131", "15131221", "13322131", + "13331221", "11522131", "14213131", "14222221", "12413131", + "14231311", "12422221", "12431311", "15113221", "15122311", + "13313221", "13322311", "11513221", "11522311", "14213311", + "12413311", "21141133", "41141131", "11132134", "31132132", + "11141224", "31141222", "21123133", "41123131", "21132223", + "41132221", "21141313", "41141311", "11114134", "31114132", + "11123224", "31123222", "11132314", "31132312", "21114223", + "41114221", "21123313", "41123311", "11114314", "31114312", + "22141132", + /* Column 25 */ + "11241133", "31241131", "12132133", "32132131", + "12141223", "32141221", "21241222", "22123132", "11223133", + "22132222", "11232223", "22141312", "11241313", "31241311", + "12114133", "32114131", "12123223", "32123221", "12132313", + "32132311", "21232312", "22114222", "11214223", "22123312", + "11223313", "31223311", "12114313", "32114311", "21214312", + "23141131", "12241132", "21341131", "13132132", "13141222", + "11332132", "22241221", "11341222", "23123131", "12223132", + "23132221", "12232222", "23141311", "12241312", "21341311", + "13114132", "13123222", "11314132", "13132312", "11323222", + "22232311", "11332312", "23114221", "12214222", "23123311", + "12223312", "21323311", "13114312", "22214311", + /* Column 26 */ + "11314312", + "13241131", "14132131", "14141221", "12332131", "12341221", + "13223131", "13232221", "11423131", "13241311", "11432221", + "14114131", "14123221", "12314131", "14132311", "12323221", + "12332311", "13214221", "13223311", "11414221", "11423311", + "14114311", "12314311", "21151132", "11142133", "31142131", + "11151223", "31151221", "21133132", "21142222", "21151312", + "11124133", "31124131", "11133223", "31133221", "11142313", + "31142311", "21115132", "21124222", "21133312", "11115223", + "31115221", "11124313", "31124311", "22151131", "11251132", + "12142132", "12151222", "21251221", "22133131", "11233132", + "22142221", "11242222", "22151311", "11251312", "12124132", + "12133222", "12142312", + /* Column 27 */ + "21242311", "22115131", "11215132", + "22124221", "11224222", "22133311", "11233312", "12115222", + "12124312", "21224311", "12251131", "13142131", "13151221", + "11342131", "12233131", "12242221", "12251311", "13124131", + "13133221", "11324131", "13142311", "11333221", "11342311", + "12215131", "12224221", "12233311", "13115221", "13124311", + "11315221", "11324311", "21161131", "11152132", "11161222", + "21143131", "21152221", "21161311", "11134132", "11143222", + "11152312", "21125131", "21134221", "21143311", "11116132", + "11125222", "11134312", "12152131", "12161221", "11243131", + "11252221", "12134131", "12143221", "12152311", "11225131", + "11234221", "11243311", "12116131", "12125221", "12134311", + /* Column 28 */ + "21111235", "41111233", "61111231", "11111326", "31111324", + "51111322", "21111415", "41111413", "61111411", "21211144", + "41211142", "22111234", "42111232", "11211235", "31211233", + "51211231", "12111325", "32111323", "52111321", "21211324", + "41211322", "22111414", "42111412", "11211415", "31211413", + "51211411", "22211143", "42211141", "11311144", "31311142", + "23111233", "43111231", "12211234", "32211232", "21311233", + "41311231", "13111324", "33111322", "22211323", "42211321", + "11311324", "31311322", "23111413", "43111411", "12211414", + "32211412", "21311413", "41311411", "23211142", "12311143", + "32311141", "21411142", "24111232", "13211233", "33211231", + "22311232", "11411233", "31411231", + /* Column 29 */ + "14111323", "34111321", + "23211322", "12311323", "32311321", "21411322", "24111412", + "13211413", "33211411", "22311412", "11411413", "31411411", + "24211141", "13311142", "22411141", "11511142", "25111231", + "14211232", "23311231", "12411232", "21511231", "15111322", + "24211321", "13311322", "22411321", "11511322", "25111411", + "14211412", "23311411", "12411412", "21511411", "14311141", + "12511141", "15211231", "13411231", "11611231", "16111321", + "14311321", "12511321", "15211411", "13411411", "11611411", + "31121143", "51121141", "21112144", "41112142", "21121234", + "41121232", "11112235", "31112233", "51112231", "11121325", + "31121323", "51121321", "21112324", "41112322", "21121414", + "41121412", + /* Column 30 */ + "11112415", "31112413", "51112411", "12121144", + "32121142", "21221143", "41221141", "22112143", "42112141", + "11212144", "22121233", "42121231", "11221234", "31221232", + "12112234", "32112232", "12121324", "32121322", "21221323", + "41221321", "22112323", "42112321", "11212324", "22121413", + "42121411", "11221414", "31221412", "12112414", "32112412", + "21212413", "41212411", "13121143", "33121141", "22221142", + "11321143", "31321141", "23112142", "12212143", "23121232", + "12221233", "32221231", "21321232", "13112233", "33112231", + "13121323", "33121321", "11312233", "22221322", "11321323", + "31321321", "23112322", "12212323", "23121412", "12221413", + "32221411", "21321412", "13112413", "33112411", + /* Column 31 */ + "22212412", + "11312413", "31312411", "14121142", "23221141", "12321142", + "21421141", "24112141", "13212142", "24121231", "13221232", + "11412142", "22321231", "11421232", "14112232", "14121322", + "12312232", "23221321", "12321322", "21421321", "24112321", + "13212322", "24121411", "13221412", "11412322", "22321411", + "11421412", "14112412", "23212411", "12312412", "21412411", + "15121141", "13321141", "11521141", "14212141", "14221231", + "12412141", "12421231", "15112231", "15121321", "13312231", + "13321321", "11512231", "11521321", "14212321", "14221411", + "12412321", "12421411", "15112411", "13312411", "11512411", + "11131144", "31131142", "21122143", "41122141", "21131233", + "41131231", "11113144", + /* Column 32 */ + "31113142", "11122234", "31122232", + "11131324", "31131322", "21113233", "41113231", "21122323", + "41122321", "21131413", "41131411", "11113324", "31113322", + "11122414", "31122412", "21113413", "41113411", "12131143", + "32131141", "21231142", "22122142", "11222143", "22131232", + "11231233", "31231231", "12113143", "32113141", "12122233", + "32122231", "12131323", "32131321", "21231322", "22113232", + "11213233", "22122322", "11222323", "22131412", "11231413", + "31231411", "12113323", "32113321", "12122413", "32122411", + "21222412", "22113412", "11213413", "31213411", "13131142", + "22231141", "11331142", "23122141", "12222142", "23131231", + "12231232", "21331231", "13113142", "13122232", "11313142", + /* Column 33 */ + "13131322", "11322232", "22231321", "11331322", "23113231", + "12213232", "23122321", "12222322", "23131411", "12231412", + "21331411", "13113322", "13122412", "11313322", "22222411", + "11322412", "23113411", "12213412", "21313411", "14131141", + "12331141", "13222141", "13231231", "11422141", "11431231", + "14113141", "14122231", "12313141", "14131321", "12322231", + "12331321", "13213231", "13222321", "11413231", "13231411", + "11422321", "11431411", "14113321", "14122411", "12313321", + "12322411", "13213411", "11413411", "11141143", "31141141", + "21132142", "21141232", "11123143", "31123141", "11132233", + "31132231", "11141323", "31141321", "21114142", "21123232", + "21132322", "21141412", "11114233", + /* Column 34 */ + "31114231", "11123323", + "31123321", "11132413", "31132411", "21114322", "21123412", + "12141142", "21241141", "22132141", "11232142", "22141231", + "11241232", "12123142", "12132232", "12141322", "21241321", + "22114141", "11214142", "22123231", "11223232", "22132321", + "11232322", "22141411", "11241412", "12114232", "12123322", + "12132412", "21232411", "22114321", "11214322", "22123411", + "11223412", "13141141", "11341141", "12232141", "12241231", + "13123141", "13132231", "11323141", "13141321", "11332231", + "11341321", "12214141", "12223231", "12232321", "12241411", + "13114231", "13123321", "11314231", "13132411", "11323321", + "11332411", "12214321", "12223411", "11151142", "21142141", + "21151231", + /* Column 35 */ + "11133142", "11142232", "11151322", "21124141", + "21133231", "21142321", "21151411", "11115142", "11124232", + "11133322", "11142412", "21115231", "21124321", "21133411", + "12151141", "11242141", "11251231", "12133141", "12142231", + "12151321", "11224141", "11233231", "11242321", "11251411", + "12115141", "12124231", "12133321", "12142411", "11215231", + "11224321", "11233411", "11161141", "11143141", "11152231", + "11161321", "11125141", "11134231", "11143321", "11152411", + "11111245", "31111243", "51111241", "21111334", "41111332", + "11111425", "31111423", "51111421", "21111514", "41111512", + "31211152", "12111244", "32111242", "21211243", "41211241", + "22111333", "42111331", "11211334", "31211332", + /* Column 36 */ + "12111424", + "32111422", "21211423", "41211421", "22111513", "42111511", + "11211514", "31211512", "12211153", "32211151", "21311152", + "13111243", "33111241", "22211242", "11311243", "31311241", + "23111332", "12211333", "32211331", "21311332", "13111423", + "33111421", "22211422", "11311423", "31311421", "23111512", + "12211513", "32211511", "21311512", "13211152", "22311151", + "11411152", "14111242", "23211241", "12311242", "21411241", + "24111331", "13211332", "22311331", "11411332", "14111422", + "23211421", "12311422", "21411421", "24111511", "13211512", + "22311511", "11411512", "14211151", "12411151", "15111241", + "13311241", "11511241", "14211331", "12411331", "15111421", + "13311421", "11511421", + /* Column 37 */ + "14211511", "12411511", "21121153", + "41121151", "11112154", "31112152", "11121244", "31121242", + "21112243", "41112241", "21121333", "41121331", "11112334", + "31112332", "11121424", "31121422", "21112423", "41112421", + "21121513", "41121511", "11112514", "31112512", "22121152", + "11221153", "31221151", "12112153", "32112151", "12121243", + "32121241", "21221242", "22112242", "11212243", "22121332", + "11221333", "31221331", "12112333", "32112331", "12121423", + "32121421", "21221422", "22112422", "11212423", "22121512", + "11221513", "31221511", "12112513", "32112511", "21212512", + "23121151", "12221152", "21321151", "13112152", "13121242", + "11312152", "22221241", "11321242", "23112241", "12212242", + /* Column 38 */ + "23121331", "12221332", "21321331", "13112332", "13121422", + "11312332", "22221421", "11321422", "23112421", "12212422", + "23121511", "12221512", "21321511", "13112512", "22212511", + "11312512", "13221151", "11421151", "14112151", "14121241", + "12312151", "12321241", "13212241", "13221331", "11412241", + "11421331", "14112331", "14121421", "12312331", "12321421", + "13212421", "13221511", "11412421", "11421511", "14112511", + "12312511", "21131152", "11122153", "31122151", "11131243", + "31131241", "21113152", "21122242", "21131332", "11113243", + "31113241", "11122333", "31122331", "11131423", "31131421", + "21113332", "21122422", "21131512", "11113423", "31113421", + "11122513", "31122511", "22131151", + /* Column 39 */ + "11231152", "12122152", + "12131242", "21231241", "22113151", "11213152", "22122241", + "11222242", "22131331", "11231332", "12113242", "12122332", + "12131422", "21231421", "22113331", "11213332", "22122421", + "11222422", "22131511", "11231512", "12113422", "12122512", + "21222511", "12231151", "13122151", "13131241", "11322151", + "11331241", "12213151", "12222241", "12231331", "13113241", + "13122331", "11313241", "13131421", "11322331", "11331421", + "12213331", "12222421", "12231511", "13113421", "13122511", + "11313421", "11322511", "21141151", "11132152", "11141242", + "21123151", "21132241", "21141331", "11114152", "11123242", + "11132332", "11141422", "21114241", "21123331", "21132421", + "21141511", + /* Column 40 */ + "11114332", "11123422", "11132512", "11241151", + "12132151", "12141241", "11223151", "11232241", "11241331", + "12114151", "12123241", "12132331", "12141421", "11214241", + "11223331", "11232421", "11241511", "12114331", "12123421", + "12132511", "11142151", "11151241", "11124151", "11133241", + "11142331", "11151421", "11115241", "11124331", "11133421", + "11142511", "21111253", "41111251", "11111344", "31111342", + "21111433", "41111431", "11111524", "31111522", "21111613", + "41111611", "21211162", "22111252", "11211253", "31211251", + "12111343", "32111341", "21211342", "22111432", "11211433", + "31211431", "12111523", "32111521", "21211522", "22111612", + "11211613", "31211611", "22211161", "11311162", + /* Column 41 */ + "23111251", + "12211252", "21311251", "13111342", "22211341", "11311342", + "23111431", "12211432", "21311431", "13111522", "22211521", + "11311522", "23111611", "12211612", "21311611", "12311161", + "13211251", "11411251", "14111341", "12311341", "13211431", + "11411431", "14111521", "12311521", "13211611", "11411611", + "31121161", "21112162", "21121252", "11112253", "31112251", + "11121343", "31121341", "21112342", "21121432", "11112433", + "31112431", "11121523", "31121521", "21112522", "21121612", + /* Column 42 */ + "12121162", "21221161", "22112161", "11212162", "22121251", + "11221252", "12112252", "12121342", "21221341", "22112341", + "11212342", "22121431", "11221432", "12112432", "12121522", + "21221521", "22112521", "11212522", "22121611", "11221612", + "13121161", "11321161", "12212161", "12221251", "13112251", + "13121341", "11312251", "11321341", "12212341", "12221431", + "13112431", "13121521", "11312431", "11321521", "12212521", + "12221611", "11131162", "21122161", "21131251", "11113162" }; diff --git a/backend/common.c b/backend/common.c index ba977675..154ef5ad 100644 --- a/backend/common.c +++ b/backend/common.c @@ -2,20 +2,20 @@ /* libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart + Copyright (C) 2008-2016 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. + documentation and/or other materials provided with the distribution. 3. Neither the name of the project nor the names of its contributors may be used to endorse or promote products derived from this software - without specific prior written permission. + without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -26,360 +26,358 @@ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + */ #include #include #include #include "common.h" +/* Local replacement for strlen() with unsigned char strings */ int ustrlen(const unsigned char data[]) { - /* Local replacement for strlen() with unsigned char strings */ - int i; - for (i=0;data[i];i++); + int i; + for (i = 0; data[i]; i++); - return i; + return i; } -void ustrcpy(unsigned char target[],const unsigned char source[]) { - /* Local replacement for strcpy() with unsigned char strings */ - int i, len; +/* Local replacement for strcpy() with unsigned char strings */ +void ustrcpy(unsigned char target[], const unsigned char source[]) { + int i, len; - len = ustrlen(source); - for(i = 0; i < len; i++) { - target[i] = source[i]; - } - target[i] = '\0'; + len = ustrlen(source); + for (i = 0; i < len; i++) { + target[i] = source[i]; + } + target[i] = '\0'; } -void concat(char dest[],const char source[]) -{ /* Concatinates dest[] with the contents of source[], copying /0 as well */ - unsigned int i, j, n; +/* Concatinates dest[] with the contents of source[], copying /0 as well */ +void concat(char dest[], const char source[]) { + unsigned int i, j, n; - j = strlen(dest); - n = strlen(source); - for(i = 0; i <= n; i++) { - dest[i + j] = source[i]; } + j = strlen(dest); + n = strlen(source); + for (i = 0; i <= n; i++) { + dest[i + j] = source[i]; + } } -void uconcat(unsigned char dest[], const unsigned char source[]) -{ /* Concatinates dest[] with the contents of source[], copying /0 as well */ - unsigned int i, j; +/* Concatinates dest[] with the contents of source[], copying /0 as well */ +void uconcat(unsigned char dest[], const unsigned char source[]) { + unsigned int i, j; - j = ustrlen(dest); - for(i = 0; i <= ustrlen(source); i++) { - dest[i + j] = source[i]; } + j = ustrlen(dest); + for (i = 0; i <= ustrlen(source); i++) { + dest[i + j] = source[i]; + } } - -int ctoi(char source) -{ /* Converts a character 0-9 to its equivalent integer value */ - if((source >= '0') && (source <= '9')) - return (source - '0'); - return(source - 'A' + 10); +/* Converts a character 0-9 to its equivalent integer value */ +int ctoi(char source) { + if ((source >= '0') && (source <= '9')) + return (source - '0'); + return (source - 'A' + 10); } -char itoc(int source) -{ /* Converts an integer value to its hexadecimal character */ - if ((source >= 0) && (source <= 9)) { - return ('0' + source); } - else { - return ('A' + (source - 10)); } +/* Converts an integer value to its hexadecimal character */ +char itoc(int source) { + if ((source >= 0) && (source <= 9)) { + return ('0' + source); + } else { + return ('A' + (source - 10)); + } } -void to_upper(unsigned char source[]) -{ /* Converts lower case characters to upper case in a string source[] */ - unsigned int i, src_len = ustrlen(source); +/* Converts lower case characters to upper case in a string source[] */ +void to_upper(unsigned char source[]) { + unsigned int i, src_len = ustrlen(source); - for (i = 0; i < src_len; i++) { - if ((source[i] >= 'a') && (source[i] <= 'z')) { - source [i] = (source[i] - 'a') + 'A'; } - } + for (i = 0; i < src_len; i++) { + if ((source[i] >= 'a') && (source[i] <= 'z')) { + source [i] = (source[i] - 'a') + 'A'; + } + } } -int is_sane(char test_string[], unsigned char source[], int length) -{ /* Verifies that a string only uses valid characters */ - unsigned int i, j, latch; - unsigned int lt = strlen(test_string); +/* Verifies that a string only uses valid characters */ +int is_sane(char test_string[], unsigned char source[], int length) { + unsigned int i, j, latch; + unsigned int lt = strlen(test_string); - for(i = 0; i < length; i++) { - latch = FALSE; - for(j = 0; j < lt; j++) { - if (source[i] == test_string[j]) { - latch = TRUE; - break; - } - } - if (!(latch)) { - return ZINT_ERROR_INVALID_DATA; - } - } + for (i = 0; i < length; i++) { + latch = FALSE; + for (j = 0; j < lt; j++) { + if (source[i] == test_string[j]) { + latch = TRUE; + break; + } + } + if (!(latch)) { + return ZINT_ERROR_INVALID_DATA; + } + } - return 0; + return 0; } -int posn(char set_string[], char data) -{ /* Returns the position of data in set_string */ - unsigned int i, n = strlen(set_string); +/* Returns the position of data in set_string */ +int posn(char set_string[], char data) { + unsigned int i, n = strlen(set_string); - for(i = 0; i < n; i++) { - if (data == set_string[i]) { return i; } } - return 0; + for (i = 0; i < n; i++) { + if (data == set_string[i]) { + return i; + } + } + return 0; } -void lookup(char set_string[],const char *table[], char data, char dest[]) -{ /* Replaces huge switch statements for looking up in tables */ - unsigned int i, n = strlen(set_string); +/* Replaces huge switch statements for looking up in tables */ +void lookup(char set_string[], const char *table[], char data, char dest[]) { + unsigned int i, n = strlen(set_string); - for(i = 0; i < n; i++) { - if (data == set_string[i]) { concat(dest, table[i]); } } + for (i = 0; i < n; i++) { + if (data == set_string[i]) { + concat(dest, table[i]); + } + } } -int module_is_set(struct zint_symbol *symbol, int y_coord, int x_coord) -{ - return (symbol->encoded_data[y_coord][x_coord / 7] >> (x_coord % 7)) & 1; -#if 0 - switch(x_sub) { - case 0: if((symbol->encoded_data[y_coord][x_char] & 0x01) != 0) { result = 1; } break; - case 1: if((symbol->encoded_data[y_coord][x_char] & 0x02) != 0) { result = 1; } break; - case 2: if((symbol->encoded_data[y_coord][x_char] & 0x04) != 0) { result = 1; } break; - case 3: if((symbol->encoded_data[y_coord][x_char] & 0x08) != 0) { result = 1; } break; - case 4: if((symbol->encoded_data[y_coord][x_char] & 0x10) != 0) { result = 1; } break; - case 5: if((symbol->encoded_data[y_coord][x_char] & 0x20) != 0) { result = 1; } break; - case 6: if((symbol->encoded_data[y_coord][x_char] & 0x40) != 0) { result = 1; } break; - } - - return result; -#endif +/* Return true (1) if a module is dark/black, orherwise false (0) */ +int module_is_set(struct zint_symbol *symbol, int y_coord, int x_coord) { + return (symbol->encoded_data[y_coord][x_coord / 7] >> (x_coord % 7)) & 1; } -void set_module(struct zint_symbol *symbol, int y_coord, int x_coord) -{ - symbol->encoded_data[y_coord][x_coord / 7] |= 1 << (x_coord % 7); -#if 0 - int x_char, x_sub; - - - x_char = x_coord / 7; - x_sub = x_coord % 7; - - switch(x_sub) { - case 0: symbol->encoded_data[y_coord][x_char] += 0x01; break; - case 1: symbol->encoded_data[y_coord][x_char] += 0x02; break; - case 2: symbol->encoded_data[y_coord][x_char] += 0x04; break; - case 3: symbol->encoded_data[y_coord][x_char] += 0x08; break; - case 4: symbol->encoded_data[y_coord][x_char] += 0x10; break; - case 5: symbol->encoded_data[y_coord][x_char] += 0x20; break; - case 6: symbol->encoded_data[y_coord][x_char] += 0x40; break; - } /* The last binary digit is reserved for colour barcodes */ -#endif +/* Set a module to dark/black */ +void set_module(struct zint_symbol *symbol, int y_coord, int x_coord) { + symbol->encoded_data[y_coord][x_coord / 7] |= 1 << (x_coord % 7); } -void unset_module(struct zint_symbol *symbol, int y_coord, int x_coord) -{ - symbol->encoded_data[y_coord][x_coord / 7] &= ~(1 << (x_coord % 7)); -#if 0 - int x_char, x_sub; - - x_char = x_coord / 7; - x_sub = x_coord % 7; - - switch(x_sub) { - case 0: symbol->encoded_data[y_coord][x_char] -= 0x01; break; - case 1: symbol->encoded_data[y_coord][x_char] -= 0x02; break; - case 2: symbol->encoded_data[y_coord][x_char] -= 0x04; break; - case 3: symbol->encoded_data[y_coord][x_char] -= 0x08; break; - case 4: symbol->encoded_data[y_coord][x_char] -= 0x10; break; - case 5: symbol->encoded_data[y_coord][x_char] -= 0x20; break; - case 6: symbol->encoded_data[y_coord][x_char] -= 0x40; break; - } /* The last binary digit is reserved for colour barcodes */ -#endif +/* Set (or unset) a module to white */ +void unset_module(struct zint_symbol *symbol, int y_coord, int x_coord) { + symbol->encoded_data[y_coord][x_coord / 7] &= ~(1 << (x_coord % 7)); } -void expand(struct zint_symbol *symbol, char data[]) -{ /* Expands from a width pattern to a bit pattern */ +/* Expands from a width pattern to a bit pattern */ +void expand(struct zint_symbol *symbol, char data[]) { - unsigned int reader, n = strlen(data); - int writer, i; - char latch; + unsigned int reader, n = strlen(data); + int writer, i; + char latch; - writer = 0; - latch = '1'; + writer = 0; + latch = '1'; - for(reader = 0; reader < n; reader++) { - for(i = 0; i < ctoi(data[reader]); i++) { - if(latch == '1') { set_module(symbol, symbol->rows, writer); } - writer++; - } + for (reader = 0; reader < n; reader++) { + for (i = 0; i < ctoi(data[reader]); i++) { + if (latch == '1') { + set_module(symbol, symbol->rows, writer); + } + writer++; + } - latch = (latch == '1' ? '0' : '1'); - } + latch = (latch == '1' ? '0' : '1'); + } - if(symbol->symbology != BARCODE_PHARMA) { - if(writer > symbol->width) { - symbol->width = writer; - } - } else { - /* Pharmacode One ends with a space - adjust for this */ - if(writer > symbol->width + 2) { - symbol->width = writer - 2; - } - } - symbol->rows = symbol->rows + 1; + if (symbol->symbology != BARCODE_PHARMA) { + if (writer > symbol->width) { + symbol->width = writer; + } + } else { + /* Pharmacode One ends with a space - adjust for this */ + if (writer > symbol->width + 2) { + symbol->width = writer - 2; + } + } + symbol->rows = symbol->rows + 1; } +/* Indicates which symbologies can have row binding */ int is_stackable(int symbology) { - /* Indicates which symbologies can have row binding */ - if(symbology < BARCODE_PDF417) { return 1; } - if(symbology == BARCODE_CODE128B) { return 1; } - if(symbology == BARCODE_ISBNX) { return 1; } - if(symbology == BARCODE_EAN14) { return 1; } - if(symbology == BARCODE_NVE18) { return 1; } - if(symbology == BARCODE_KOREAPOST) { return 1; } - if(symbology == BARCODE_PLESSEY) { return 1; } - if(symbology == BARCODE_TELEPEN_NUM) { return 1; } - if(symbology == BARCODE_ITF14) { return 1; } - if(symbology == BARCODE_CODE32) { return 1; } + if (symbology < BARCODE_PDF417) { + return 1; + } + if (symbology == BARCODE_CODE128B) { + return 1; + } + if (symbology == BARCODE_ISBNX) { + return 1; + } + if (symbology == BARCODE_EAN14) { + return 1; + } + if (symbology == BARCODE_NVE18) { + return 1; + } + if (symbology == BARCODE_KOREAPOST) { + return 1; + } + if (symbology == BARCODE_PLESSEY) { + return 1; + } + if (symbology == BARCODE_TELEPEN_NUM) { + return 1; + } + if (symbology == BARCODE_ITF14) { + return 1; + } + if (symbology == BARCODE_CODE32) { + return 1; + } - return 0; + return 0; } +/* Indicates which symbols can have addon (EAN-2 and EAN-5) */ int is_extendable(int symbology) { - /* Indicates which symbols can have addon */ - if(symbology == BARCODE_EANX) { return 1; } - if(symbology == BARCODE_UPCA) { return 1; } - if(symbology == BARCODE_UPCE) { return 1; } - if(symbology == BARCODE_ISBNX) { return 1; } - if(symbology == BARCODE_UPCA_CC) { return 1; } - if(symbology == BARCODE_UPCE_CC) { return 1; } - if(symbology == BARCODE_EANX_CC) { return 1; } + if (symbology == BARCODE_EANX) { + return 1; + } + if (symbology == BARCODE_UPCA) { + return 1; + } + if (symbology == BARCODE_UPCE) { + return 1; + } + if (symbology == BARCODE_ISBNX) { + return 1; + } + if (symbology == BARCODE_UPCA_CC) { + return 1; + } + if (symbology == BARCODE_UPCE_CC) { + return 1; + } + if (symbology == BARCODE_EANX_CC) { + return 1; + } - return 0; + return 0; } -int roundup(float input) -{ - float remainder; - int integer_part; +int roundup(float input) { + float remainder; + int integer_part; - integer_part = (int)input; - remainder = input - integer_part; + integer_part = (int) input; + remainder = input - integer_part; - if(remainder > 0.1) { - integer_part++; - } + if (remainder > 0.1) { + integer_part++; + } - return integer_part; + return integer_part; } -int istwodigits(unsigned char source[], int position) -{ - if((source[position] >= '0') && (source[position] <= '9')) { - if((source[position + 1] >= '0') && (source[position + 1] <= '9')) { - return 1; - } - } +int istwodigits(unsigned char source[], int position) { + if ((source[position] >= '0') && (source[position] <= '9')) { + if ((source[position + 1] >= '0') && (source[position + 1] <= '9')) { + return 1; + } + } - return 0; + return 0; } -float froundup(float input) -{ - float fraction, output = 0.0; +float froundup(float input) { + float fraction, output = 0.0; - fraction = input - (int)input; - if(fraction > 0.01) { output = (input - fraction) + 1.0; } else { output = input; } + fraction = input - (int) input; + if (fraction > 0.01) { + output = (input - fraction) + 1.0; + } else { + output = input; + } - return output; + return output; } -int latin1_process(struct zint_symbol *symbol, unsigned char source[], unsigned char preprocessed[], int *length) -{ - int j, i, next; - - /* Convert Unicode to Latin-1 for those symbologies which only support Latin-1 */ - j = 0; - i = 0; - do { - next = -1; - if(source[i] < 128) { - preprocessed[j] = source[i]; - j++; - next = i + 1; - } else { - if(source[i] == 0xC2) { - preprocessed[j] = source[i + 1]; - j++; - next = i + 2; - } - if(source[i] == 0xC3) { - preprocessed[j] = source[i + 1] + 64; - j++; - next = i + 2; - } - } - if(next == -1) { - strcpy(symbol->errtxt, "error: Invalid character in input string (only Latin-1 characters supported)"); - return ZINT_ERROR_INVALID_DATA; - } - i = next; - } while(i < *length); - preprocessed[j] = '\0'; - *length = j; +/* Convert Unicode to Latin-1 for those symbologies which only support Latin-1 */ +int latin1_process(struct zint_symbol *symbol, unsigned char source[], unsigned char preprocessed[], int *length) { + int j, i, next; - return 0; + j = 0; + i = 0; + do { + next = -1; + if (source[i] < 128) { + preprocessed[j] = source[i]; + j++; + next = i + 1; + } else { + if (source[i] == 0xC2) { + preprocessed[j] = source[i + 1]; + j++; + next = i + 2; + } + if (source[i] == 0xC3) { + preprocessed[j] = source[i + 1] + 64; + j++; + next = i + 2; + } + } + if (next == -1) { + strcpy(symbol->errtxt, "error: Invalid character in input string (only Latin-1 characters supported)"); + return ZINT_ERROR_INVALID_DATA; + } + i = next; + } while (i < *length); + preprocessed[j] = '\0'; + *length = j; + + return 0; } -int utf8toutf16(struct zint_symbol *symbol, unsigned char source[], int vals[], int *length) -{ - int bpos, jpos, error_number; - int next; +int utf8toutf16(struct zint_symbol *symbol, unsigned char source[], int vals[], int *length) { + int bpos, jpos, error_number; + int next; - bpos = 0; - jpos = 0; - error_number = 0; - next = 0; + bpos = 0; + jpos = 0; + error_number = 0; + next = 0; - do { - if(source[bpos] <= 0x7f) { - /* 1 byte mode (7-bit ASCII) */ - vals[jpos] = source[bpos]; - next = bpos + 1; - jpos++; - } else { - if((source[bpos] >= 0x80) && (source[bpos] <= 0xbf)) { - strcpy(symbol->errtxt, "Corrupt Unicode data"); - return ZINT_ERROR_INVALID_DATA; - } - if((source[bpos] >= 0xc0) && (source[bpos] <= 0xc1)) { - strcpy(symbol->errtxt, "Overlong encoding not supported"); - return ZINT_ERROR_INVALID_DATA; - } + do { + if (source[bpos] <= 0x7f) { + /* 1 byte mode (7-bit ASCII) */ + vals[jpos] = source[bpos]; + next = bpos + 1; + jpos++; + } else { + if ((source[bpos] >= 0x80) && (source[bpos] <= 0xbf)) { + strcpy(symbol->errtxt, "Corrupt Unicode data"); + return ZINT_ERROR_INVALID_DATA; + } + if ((source[bpos] >= 0xc0) && (source[bpos] <= 0xc1)) { + strcpy(symbol->errtxt, "Overlong encoding not supported"); + return ZINT_ERROR_INVALID_DATA; + } - if((source[bpos] >= 0xc2) && (source[bpos] <= 0xdf)) { - /* 2 byte mode */ - vals[jpos] = ((source[bpos] & 0x1f) << 6) + (source[bpos + 1] & 0x3f); - next = bpos + 2; - jpos++; - } else - if((source[bpos] >= 0xe0) && (source[bpos] <= 0xef)) { - /* 3 byte mode */ - vals[jpos] = ((source[bpos] & 0x0f) << 12) + ((source[bpos + 1] & 0x3f) << 6) + (source[bpos + 2] & 0x3f); - next = bpos + 3; - jpos ++; - } else - if(source[bpos] >= 0xf0) { - strcpy(symbol->errtxt, "Unicode sequences of more than 3 bytes not supported"); - return ZINT_ERROR_INVALID_DATA; - } - } + if ((source[bpos] >= 0xc2) && (source[bpos] <= 0xdf)) { + /* 2 byte mode */ + vals[jpos] = ((source[bpos] & 0x1f) << 6) + (source[bpos + 1] & 0x3f); + next = bpos + 2; + jpos++; + } else + if ((source[bpos] >= 0xe0) && (source[bpos] <= 0xef)) { + /* 3 byte mode */ + vals[jpos] = ((source[bpos] & 0x0f) << 12) + ((source[bpos + 1] & 0x3f) << 6) + (source[bpos + 2] & 0x3f); + next = bpos + 3; + jpos++; + } else + if (source[bpos] >= 0xf0) { + strcpy(symbol->errtxt, "Unicode sequences of more than 3 bytes not supported"); + return ZINT_ERROR_INVALID_DATA; + } + } - bpos = next; + bpos = next; - } while(bpos < *length); - *length = jpos; + } while (bpos < *length); + *length = jpos; - return error_number; + return error_number; } diff --git a/backend/common.h b/backend/common.h index ed18d78d..9ff44ebc 100644 --- a/backend/common.h +++ b/backend/common.h @@ -2,20 +2,20 @@ /* libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart + Copyright (C) 2009-2016 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. + documentation and/or other materials provided with the distribution. 3. Neither the name of the project nor the names of its contributors may be used to endorse or promote products derived from this software - without specific prior written permission. + without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -26,9 +26,9 @@ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + */ /* Used in some logic */ #ifndef __COMMON_H @@ -48,32 +48,31 @@ #include "zint.h" #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif /* __cplusplus */ -extern int ustrlen(const unsigned char source[]); -extern void ustrcpy(unsigned char target[], const unsigned char source[]); -extern void concat(char dest[], const char source[]); -extern void uconcat(unsigned char dest[], const unsigned char source[]); -extern int ctoi(char source); -extern char itoc(int source); -extern void to_upper(unsigned char source[]); -extern int is_sane(char test_string[], unsigned char source[], int length); -extern void lookup(char set_string[],const char *table[], char data, char dest[]); -extern int posn(char set_string[], char data); -extern void expand(struct zint_symbol *symbol, char data[]); -extern int is_stackable(int symbology); -extern int is_extendable(int symbology); -extern int roundup(float input); -extern int module_is_set(struct zint_symbol *symbol, int y_coord, int x_coord); -extern void set_module(struct zint_symbol *symbol, int y_coord, int x_coord); -extern void unset_module(struct zint_symbol *symbol, int y_coord, int x_coord); -extern int istwodigits(unsigned char source[], int position); -extern float froundup(float input); -extern int parunmodd(unsigned char llyth); -extern int latin1_process(struct zint_symbol *symbol, unsigned char source[], unsigned char preprocessed[], int *length); -extern int utf8toutf16(struct zint_symbol *symbol, unsigned char source[], int vals[], int *length); + extern int ustrlen(const unsigned char source[]); + extern void ustrcpy(unsigned char target[], const unsigned char source[]); + extern void concat(char dest[], const char source[]); + extern void uconcat(unsigned char dest[], const unsigned char source[]); + extern int ctoi(char source); + extern char itoc(int source); + extern void to_upper(unsigned char source[]); + extern int is_sane(char test_string[], unsigned char source[], int length); + extern void lookup(char set_string[], const char *table[], char data, char dest[]); + extern int posn(char set_string[], char data); + extern void expand(struct zint_symbol *symbol, char data[]); + extern int is_stackable(int symbology); + extern int is_extendable(int symbology); + extern int roundup(float input); + extern int module_is_set(struct zint_symbol *symbol, int y_coord, int x_coord); + extern void set_module(struct zint_symbol *symbol, int y_coord, int x_coord); + extern void unset_module(struct zint_symbol *symbol, int y_coord, int x_coord); + extern int istwodigits(unsigned char source[], int position); + extern float froundup(float input); + extern int parunmodd(unsigned char llyth); + extern int latin1_process(struct zint_symbol *symbol, unsigned char source[], unsigned char preprocessed[], int *length); + extern int utf8toutf16(struct zint_symbol *symbol, unsigned char source[], int vals[], int *length); #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/backend/composite.c b/backend/composite.c index e5b429ce..b4585fb0 100644 --- a/backend/composite.c +++ b/backend/composite.c @@ -2,20 +2,20 @@ /* libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart + Copyright (C) 2008-2016 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. + documentation and/or other materials provided with the distribution. 3. Neither the name of the project nor the names of its contributors may be used to endorse or promote products derived from this software - without specific prior written permission. + without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -26,9 +26,9 @@ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + */ /* The functions "getBit", "init928" and "encode928" are copyright BSI and are released with permission under the following terms: @@ -46,14 +46,14 @@ written permission of BSI must be obtained." The date of publication for these functions is 31 May 2006 -*/ + */ #include #include #include #include #ifdef _MSC_VER -#include +#include #endif #include "common.h" #include "large.h" @@ -74,1891 +74,2277 @@ static UINT pwr928[69][7]; int _min(int first, int second) { - if(first <= second) + if (first <= second) return first; - else + else return second; } /* gets bit in bitString at bitPos */ int getBit(UINT *bitStr, int bitPos) { - return !!(bitStr[bitPos >> 4] & (0x8000 >> (bitPos & 15))); + return !!(bitStr[bitPos >> 4] & (0x8000 >> (bitPos & 15))); } /* initialize pwr928 encoding table */ void init928(void) { - int i, j, v; - int cw[7]; - cw[6] = 1L; - for (i = 5; i >= 0; i--) - cw[i] = 0; + int i, j, v; + int cw[7]; + cw[6] = 1L; + for (i = 5; i >= 0; i--) + cw[i] = 0; - for (i = 0; i < 7; i++) - pwr928[0][i] = cw[i]; - for (j = 1; j < 69; j++) { - for (v = 0, i = 6; i >= 1; i--) { - v = (2 * cw[i]) + (v / 928); - pwr928[j][i] = cw[i] = v % 928; - } - pwr928[j][0] = cw[0] = (2 * cw[0]) + (v / 928); - } - return; + for (i = 0; i < 7; i++) + pwr928[0][i] = cw[i]; + for (j = 1; j < 69; j++) { + for (v = 0, i = 6; i >= 1; i--) { + v = (2 * cw[i]) + (v / 928); + pwr928[j][i] = cw[i] = v % 928; + } + pwr928[j][0] = cw[0] = (2 * cw[0]) + (v / 928); + } + return; } /* converts bit string to base 928 values, codeWords[0] is highest order */ int encode928(UINT bitString[], UINT codeWords[], int bitLng) { - int i, j, b, bitCnt, cwNdx, cwCnt, cwLng; - for (cwNdx = cwLng = b = 0; b < bitLng; b += 69, cwNdx += 7) { - bitCnt = _min(bitLng-b, 69); - cwLng += cwCnt = bitCnt/10 + 1; - for (i = 0; i < cwCnt; i++) - codeWords[cwNdx+i] = 0; /* init 0 */ - for (i = 0; i < bitCnt; i++) { - if (getBit(bitString, b+bitCnt-i-1)) { - for (j = 0; j < cwCnt; j++) - codeWords[cwNdx+j] += pwr928[i][j+7-cwCnt]; - } - } - for (i = cwCnt-1; i > 0; i--) { - /* add "carries" */ - codeWords[cwNdx+i-1] += codeWords[cwNdx+i]/928L; - codeWords[cwNdx+i] %= 928L; - } - } - return (cwLng); + int i, j, b, bitCnt, cwNdx, cwCnt, cwLng; + for (cwNdx = cwLng = b = 0; b < bitLng; b += 69, cwNdx += 7) { + bitCnt = _min(bitLng - b, 69); + cwLng += cwCnt = bitCnt / 10 + 1; + for (i = 0; i < cwCnt; i++) + codeWords[cwNdx + i] = 0; /* init 0 */ + for (i = 0; i < bitCnt; i++) { + if (getBit(bitString, b + bitCnt - i - 1)) { + for (j = 0; j < cwCnt; j++) + codeWords[cwNdx + j] += pwr928[i][j + 7 - cwCnt]; + } + } + for (i = cwCnt - 1; i > 0; i--) { + /* add "carries" */ + codeWords[cwNdx + i - 1] += codeWords[cwNdx + i] / 928L; + codeWords[cwNdx + i] %= 928L; + } + } + return (cwLng); } -int cc_a(struct zint_symbol *symbol, char source[], int cc_width) -{ /* CC-A 2D component */ - int i, strpos, segment, bitlen, cwCnt, variant, rows; - int k, offset, j, total, rsCodeWords[8]; - int LeftRAPStart, RightRAPStart, CentreRAPStart, StartCluster; - int LeftRAP, RightRAP, CentreRAP, Cluster, dummy[5]; - int writer, flip, loop; - UINT codeWords[28]; - UINT bitStr[13]; - char codebarre[100], pattern[580]; - char local_source[210]; /* A copy of source but with padding zeroes to make 208 bits */ +/* CC-A 2D component */ +int cc_a(struct zint_symbol *symbol, char source[], int cc_width) { + int i, strpos, segment, bitlen, cwCnt, variant, rows; + int k, offset, j, total, rsCodeWords[8]; + int LeftRAPStart, RightRAPStart, CentreRAPStart, StartCluster; + int LeftRAP, RightRAP, CentreRAP, Cluster, dummy[5]; + int writer, flip, loop; + UINT codeWords[28]; + UINT bitStr[13]; + char codebarre[100], pattern[580]; + char local_source[210]; /* A copy of source but with padding zeroes to make 208 bits */ - variant=0; + variant = 0; - for(i = 0; i < 13; i++) { bitStr[i] = 0; } - for(i = 0; i < 28; i++) { codeWords[i] = 0; } + for (i = 0; i < 13; i++) { + bitStr[i] = 0; + } + for (i = 0; i < 28; i++) { + codeWords[i] = 0; + } - bitlen = strlen(source); + bitlen = strlen(source); - for(i = 0; i < 208; i++) { local_source[i] = '0'; } - for(i = 0; i < bitlen; i++) { local_source[i] = source[i]; } - local_source[208] = '\0'; + for (i = 0; i < 208; i++) { + local_source[i] = '0'; + } + for (i = 0; i < bitlen; i++) { + local_source[i] = source[i]; + } + local_source[208] = '\0'; - for(segment = 0; segment < 13; segment++) { - strpos = segment * 16; - if(local_source[strpos] == '1') { bitStr[segment] += 0x8000; } - if(local_source[strpos + 1] == '1') { bitStr[segment] += 0x4000; } - if(local_source[strpos + 2] == '1') { bitStr[segment] += 0x2000; } - if(local_source[strpos + 3] == '1') { bitStr[segment] += 0x1000; } - if(local_source[strpos + 4] == '1') { bitStr[segment] += 0x800; } - if(local_source[strpos + 5] == '1') { bitStr[segment] += 0x400; } - if(local_source[strpos + 6] == '1') { bitStr[segment] += 0x200; } - if(local_source[strpos + 7] == '1') { bitStr[segment] += 0x100; } - if(local_source[strpos + 8] == '1') { bitStr[segment] += 0x80; } - if(local_source[strpos + 9] == '1') { bitStr[segment] += 0x40; } - if(local_source[strpos + 10] == '1') { bitStr[segment] += 0x20; } - if(local_source[strpos + 11] == '1') { bitStr[segment] += 0x10; } - if(local_source[strpos + 12] == '1') { bitStr[segment] += 0x08; } - if(local_source[strpos + 13] == '1') { bitStr[segment] += 0x04; } - if(local_source[strpos + 14] == '1') { bitStr[segment] += 0x02; } - if(local_source[strpos + 15] == '1') { bitStr[segment] += 0x01; } - } + for (segment = 0; segment < 13; segment++) { + strpos = segment * 16; + for (i = 0; i < 16; i++) { + if (local_source[strpos + i] == '1') { + bitStr[segment] += (0x8000 >> i); + } + } + } - init928(); - /* encode codeWords from bitStr */ - cwCnt = encode928(bitStr, codeWords, bitlen); + init928(); + /* encode codeWords from bitStr */ + cwCnt = encode928(bitStr, codeWords, bitlen); - switch(cc_width) { - case 2: - switch(cwCnt) { - case 6: variant = 0; break; - case 8: variant = 1; break; - case 9: variant = 2; break; - case 11: variant = 3; break; - case 12: variant = 4; break; - case 14: variant = 5; break; - case 17: variant = 6; break; - } - break; - case 3: - switch(cwCnt) { - case 8: variant = 7; break; - case 10: variant = 8; break; - case 12: variant = 9; break; - case 14: variant = 10; break; - case 17: variant = 11; break; - } - break; - case 4: - switch(cwCnt) { - case 8: variant = 12; break; - case 11: variant = 13; break; - case 14: variant = 14; break; - case 17: variant = 15; break; - case 20: variant = 16; break; - } - break; - } + switch (cc_width) { + case 2: + switch (cwCnt) { + case 6: variant = 0; + break; + case 8: variant = 1; + break; + case 9: variant = 2; + break; + case 11: variant = 3; + break; + case 12: variant = 4; + break; + case 14: variant = 5; + break; + case 17: variant = 6; + break; + } + break; + case 3: + switch (cwCnt) { + case 8: variant = 7; + break; + case 10: variant = 8; + break; + case 12: variant = 9; + break; + case 14: variant = 10; + break; + case 17: variant = 11; + break; + } + break; + case 4: + switch (cwCnt) { + case 8: variant = 12; + break; + case 11: variant = 13; + break; + case 14: variant = 14; + break; + case 17: variant = 15; + break; + case 20: variant = 16; + break; + } + break; + } - rows = ccaVariants[variant]; - k = ccaVariants[17 + variant]; - offset = ccaVariants[34 + variant]; + rows = ccaVariants[variant]; + k = ccaVariants[17 + variant]; + offset = ccaVariants[34 + variant]; - /* Reed-Solomon error correction */ + /* Reed-Solomon error correction */ - for(i = 0; i < 8; i++) { - rsCodeWords[i] = 0; - } - total = 0; - for(i = 0; i < cwCnt; i++) { - total = (codeWords[i] + rsCodeWords[k - 1]) % 929; - for(j = k - 1; j >= 0; j--) { - if(j == 0) { - rsCodeWords[j] = (929 - (total * ccaCoeffs[offset + j]) % 929) % 929; - } else { - rsCodeWords[j] = (rsCodeWords[j - 1] + 929 - (total * ccaCoeffs[offset + j]) % 929) % 929; - } - } - } + for (i = 0; i < 8; i++) { + rsCodeWords[i] = 0; + } + total = 0; + for (i = 0; i < cwCnt; i++) { + total = (codeWords[i] + rsCodeWords[k - 1]) % 929; + for (j = k - 1; j >= 0; j--) { + if (j == 0) { + rsCodeWords[j] = (929 - (total * ccaCoeffs[offset + j]) % 929) % 929; + } else { + rsCodeWords[j] = (rsCodeWords[j - 1] + 929 - (total * ccaCoeffs[offset + j]) % 929) % 929; + } + } + } - for(j = 0; j < k; j++) { - if(rsCodeWords[j] != 0) { rsCodeWords[j] = 929 - rsCodeWords[j]; } - } + for (j = 0; j < k; j++) { + if (rsCodeWords[j] != 0) { + rsCodeWords[j] = 929 - rsCodeWords[j]; + } + } - for(i = k - 1; i >= 0; i--) { - codeWords[cwCnt] = rsCodeWords[i]; - cwCnt++; - } + for (i = k - 1; i >= 0; i--) { + codeWords[cwCnt] = rsCodeWords[i]; + cwCnt++; + } - /* Place data into table */ - LeftRAPStart = aRAPTable[variant]; - CentreRAPStart = aRAPTable[variant + 17]; - RightRAPStart = aRAPTable[variant + 34]; - StartCluster = aRAPTable[variant + 51] / 3; + /* Place data into table */ + LeftRAPStart = aRAPTable[variant]; + CentreRAPStart = aRAPTable[variant + 17]; + RightRAPStart = aRAPTable[variant + 34]; + StartCluster = aRAPTable[variant + 51] / 3; - LeftRAP = LeftRAPStart; - CentreRAP = CentreRAPStart; - RightRAP = RightRAPStart; - Cluster = StartCluster; /* Cluster can be 0, 1 or 2 for Cluster(0), Cluster(3) and Cluster(6) */ + LeftRAP = LeftRAPStart; + CentreRAP = CentreRAPStart; + RightRAP = RightRAPStart; + Cluster = StartCluster; /* Cluster can be 0, 1 or 2 for Cluster(0), Cluster(3) and Cluster(6) */ - for(i = 0; i < rows; i++) { - strcpy(codebarre, ""); - offset = 929 * Cluster; - for(j = 0; j < 5; j++) { - dummy[j] = 0; - } - for(j = 0; j < cc_width ; j++) { - dummy[j + 1] = codeWords[i * cc_width + j]; - } - /* Copy the data into codebarre */ - concat(codebarre, RAPLR[LeftRAP]); - concat(codebarre, "1"); - concat(codebarre, codagemc[offset + dummy[1]]); - concat(codebarre, "1"); - if(cc_width == 3) { - concat(codebarre, RAPC[CentreRAP]); - } - if(cc_width >= 2) { - concat(codebarre, "1"); - concat(codebarre, codagemc[offset + dummy[2]]); - concat(codebarre, "1"); - } - if(cc_width == 4) { - concat(codebarre, RAPC[CentreRAP]); - } - if(cc_width >= 3) { - concat(codebarre, "1"); - concat(codebarre, codagemc[offset + dummy[3]]); - concat(codebarre, "1"); - } - if(cc_width == 4) { - concat(codebarre, "1"); - concat(codebarre, codagemc[offset + dummy[4]]); - concat(codebarre, "1"); - } - concat(codebarre, RAPLR[RightRAP]); - concat(codebarre, "1"); /* stop */ + for (i = 0; i < rows; i++) { + strcpy(codebarre, ""); + offset = 929 * Cluster; + for (j = 0; j < 5; j++) { + dummy[j] = 0; + } + for (j = 0; j < cc_width; j++) { + dummy[j + 1] = codeWords[i * cc_width + j]; + } + /* Copy the data into codebarre */ + concat(codebarre, RAPLR[LeftRAP]); + concat(codebarre, "1"); + concat(codebarre, codagemc[offset + dummy[1]]); + concat(codebarre, "1"); + if (cc_width == 3) { + concat(codebarre, RAPC[CentreRAP]); + } + if (cc_width >= 2) { + concat(codebarre, "1"); + concat(codebarre, codagemc[offset + dummy[2]]); + concat(codebarre, "1"); + } + if (cc_width == 4) { + concat(codebarre, RAPC[CentreRAP]); + } + if (cc_width >= 3) { + concat(codebarre, "1"); + concat(codebarre, codagemc[offset + dummy[3]]); + concat(codebarre, "1"); + } + if (cc_width == 4) { + concat(codebarre, "1"); + concat(codebarre, codagemc[offset + dummy[4]]); + concat(codebarre, "1"); + } + concat(codebarre, RAPLR[RightRAP]); + concat(codebarre, "1"); /* stop */ - /* Now codebarre is a mixture of letters and numbers */ + /* Now codebarre is a mixture of letters and numbers */ - writer = 0; - flip = 1; - strcpy(pattern, ""); - for(loop = 0; loop < strlen(codebarre); loop++) { - if((codebarre[loop] >= '0') && (codebarre[loop] <= '9')) { - for(k = 0; k < ctoi(codebarre[loop]); k++) { - if(flip == 0) { - pattern[writer] = '0'; - } else { - pattern[writer] = '1'; - } - writer++; - } - pattern[writer] = '\0'; - if(flip == 0) { - flip = 1; - } else { - flip = 0; - } - } else { - lookup(BRSET, PDFttf, codebarre[loop], pattern); - writer += 5; - } - } - symbol->width = writer; + writer = 0; + flip = 1; + strcpy(pattern, ""); + for (loop = 0; loop < strlen(codebarre); loop++) { + if ((codebarre[loop] >= '0') && (codebarre[loop] <= '9')) { + for (k = 0; k < ctoi(codebarre[loop]); k++) { + if (flip == 0) { + pattern[writer] = '0'; + } else { + pattern[writer] = '1'; + } + writer++; + } + pattern[writer] = '\0'; + if (flip == 0) { + flip = 1; + } else { + flip = 0; + } + } else { + lookup(BRSET, PDFttf, codebarre[loop], pattern); + writer += 5; + } + } + symbol->width = writer; - /* so now pattern[] holds the string of '1's and '0's. - copy this to the symbol */ - for(loop = 0; loop < strlen(pattern); loop++) { - if(pattern[loop] == '1') { set_module(symbol, i, loop); } - } - symbol->row_height[i] = 2; - symbol->rows++; + /* so now pattern[] holds the string of '1's and '0's. - copy this to the symbol */ + for (loop = 0; loop < strlen(pattern); loop++) { + if (pattern[loop] == '1') { + set_module(symbol, i, loop); + } + } + symbol->row_height[i] = 2; + symbol->rows++; - /* Set up RAPs and Cluster for next row */ - LeftRAP++; - CentreRAP++; - RightRAP++; - Cluster++; + /* Set up RAPs and Cluster for next row */ + LeftRAP++; + CentreRAP++; + RightRAP++; + Cluster++; - if(LeftRAP == 53) { - LeftRAP = 1; - } - if(CentreRAP == 53) { - CentreRAP = 1; - } - if(RightRAP == 53) { - RightRAP = 1; - } - if(Cluster == 3) { - Cluster = 0; - } - } + if (LeftRAP == 53) { + LeftRAP = 1; + } + if (CentreRAP == 53) { + CentreRAP = 1; + } + if (RightRAP == 53) { + RightRAP = 1; + } + if (Cluster == 3) { + Cluster = 0; + } + } - return 0; + return 0; } -int cc_b(struct zint_symbol *symbol, char source[], int cc_width) -{ /* CC-B 2D component */ - int length, i, binloc; +/* CC-B 2D component */ +int cc_b(struct zint_symbol *symbol, char source[], int cc_width) { + int length, i, binloc; #ifndef _MSC_VER - unsigned char data_string[(strlen(source) / 8) + 3]; + unsigned char data_string[(strlen(source) / 8) + 3]; #else - unsigned char* data_string = (unsigned char*)_alloca((strlen(source) / 8) + 3); + unsigned char* data_string = (unsigned char*) _alloca((strlen(source) / 8) + 3); #endif - int chainemc[180], mclength; - int k, j, longueur, mccorrection[50], offset; - int total, dummy[5]; - char codebarre[100], pattern[580]; - int variant, LeftRAPStart, CentreRAPStart, RightRAPStart, StartCluster; - int LeftRAP, CentreRAP, RightRAP, Cluster, writer, flip, loop; + int chainemc[180], mclength; + int k, j, longueur, mccorrection[50], offset; + int total, dummy[5]; + char codebarre[100], pattern[580]; + int variant, LeftRAPStart, CentreRAPStart, RightRAPStart, StartCluster; + int LeftRAP, CentreRAP, RightRAP, Cluster, writer, flip, loop; - length = strlen(source) / 8; + length = strlen(source) / 8; - for(i = 0; i < length; i++) { - binloc = i * 8; + for (i = 0; i < length; i++) { + binloc = i * 8; - data_string[i] = 0; - if(source[binloc] == '1') { data_string[i] += 0x80; } - if(source[binloc + 1] == '1') { data_string[i] += 0x40; } - if(source[binloc + 2] == '1') { data_string[i] += 0x20; } - if(source[binloc + 3] == '1') { data_string[i] += 0x10; } - if(source[binloc + 4] == '1') { data_string[i] += 0x08; } - if(source[binloc + 5] == '1') { data_string[i] += 0x04; } - if(source[binloc + 6] == '1') { data_string[i] += 0x02; } - if(source[binloc + 7] == '1') { data_string[i] += 0x01; } - } + data_string[i] = 0; + for (int p = 0; p < 8; p++) { + if (source[binloc + p] == '1') { + data_string[i] += (0x80 >> p); + } + } + } - mclength = 0; + mclength = 0; - /* "the CC-B component shall have codeword 920 in the first symbol character position" (section 9a) */ - chainemc[mclength] = 920; - mclength++; + /* "the CC-B component shall have codeword 920 in the first symbol character position" (section 9a) */ + chainemc[mclength] = 920; + mclength++; - byteprocess(chainemc, &mclength, data_string, 0, length, 0); + byteprocess(chainemc, &mclength, data_string, 0, length, 0); - /* Now figure out which variant of the symbol to use and load values accordingly */ + /* Now figure out which variant of the symbol to use and load values accordingly */ - variant = 0; + variant = 0; - if(cc_width == 2) { - variant = 13; - if(mclength <= 33) { variant = 12; } - if(mclength <= 29) { variant = 11; } - if(mclength <= 24) { variant = 10; } - if(mclength <= 19) { variant = 9; } - if(mclength <= 13) { variant = 8; } - if(mclength <= 8) { variant = 7; } - } + if (cc_width == 2) { + variant = 13; + if (mclength <= 33) { + variant = 12; + } + if (mclength <= 29) { + variant = 11; + } + if (mclength <= 24) { + variant = 10; + } + if (mclength <= 19) { + variant = 9; + } + if (mclength <= 13) { + variant = 8; + } + if (mclength <= 8) { + variant = 7; + } + } - if(cc_width == 3) { - variant = 23; - if(mclength <= 70) { variant = 22; } - if(mclength <= 58) { variant = 21; } - if(mclength <= 46) { variant = 20; } - if(mclength <= 34) { variant = 19; } - if(mclength <= 24) { variant = 18; } - if(mclength <= 18) { variant = 17; } - if(mclength <= 14) { variant = 16; } - if(mclength <= 10) { variant = 15; } - if(mclength <= 6) { variant = 14; } - } + if (cc_width == 3) { + variant = 23; + if (mclength <= 70) { + variant = 22; + } + if (mclength <= 58) { + variant = 21; + } + if (mclength <= 46) { + variant = 20; + } + if (mclength <= 34) { + variant = 19; + } + if (mclength <= 24) { + variant = 18; + } + if (mclength <= 18) { + variant = 17; + } + if (mclength <= 14) { + variant = 16; + } + if (mclength <= 10) { + variant = 15; + } + if (mclength <= 6) { + variant = 14; + } + } - if(cc_width == 4) { - variant = 34; - if(mclength <= 108) { variant = 33; } - if(mclength <= 90) { variant = 32; } - if(mclength <= 72) { variant = 31; } - if(mclength <= 54) { variant = 30; } - if(mclength <= 39) { variant = 29; } - if(mclength <= 30) { variant = 28; } - if(mclength <= 24) { variant = 27; } - if(mclength <= 18) { variant = 26; } - if(mclength <= 12) { variant = 25; } - if(mclength <= 8) { variant = 24; } - } + if (cc_width == 4) { + variant = 34; + if (mclength <= 108) { + variant = 33; + } + if (mclength <= 90) { + variant = 32; + } + if (mclength <= 72) { + variant = 31; + } + if (mclength <= 54) { + variant = 30; + } + if (mclength <= 39) { + variant = 29; + } + if (mclength <= 30) { + variant = 28; + } + if (mclength <= 24) { + variant = 27; + } + if (mclength <= 18) { + variant = 26; + } + if (mclength <= 12) { + variant = 25; + } + if (mclength <= 8) { + variant = 24; + } + } - /* Now we have the variant we can load the data - from here on the same as MicroPDF417 code */ - variant --; - symbol->option_2 = MicroVariants[variant]; /* columns */ - symbol->rows = MicroVariants[variant + 34]; /* rows */ - k = MicroVariants[variant + 68]; /* number of EC CWs */ - longueur = (symbol->option_2 * symbol->rows) - k; /* number of non-EC CWs */ - i = longueur - mclength; /* amount of padding required */ - offset = MicroVariants[variant + 102]; /* coefficient offset */ + /* Now we have the variant we can load the data - from here on the same as MicroPDF417 code */ + variant--; + symbol->option_2 = MicroVariants[variant]; /* columns */ + symbol->rows = MicroVariants[variant + 34]; /* rows */ + k = MicroVariants[variant + 68]; /* number of EC CWs */ + longueur = (symbol->option_2 * symbol->rows) - k; /* number of non-EC CWs */ + i = longueur - mclength; /* amount of padding required */ + offset = MicroVariants[variant + 102]; /* coefficient offset */ - /* We add the padding */ - while (i > 0) { - chainemc[mclength] = 900; - mclength++; - i--; - } + /* We add the padding */ + while (i > 0) { + chainemc[mclength] = 900; + mclength++; + i--; + } - /* Reed-Solomon error correction */ - longueur = mclength; - for(loop = 0; loop < 50; loop++) { - mccorrection[loop] = 0; - } - total = 0; - for(i = 0; i < longueur; i++) { - total = (chainemc[i] + mccorrection[k - 1]) % 929; - for(j = k - 1; j >= 0; j--) { - if(j == 0) { - mccorrection[j] = (929 - (total * Microcoeffs[offset + j]) % 929) % 929; - } else { - mccorrection[j] = (mccorrection[j - 1] + 929 - (total * Microcoeffs[offset + j]) % 929) % 929; - } - } - } + /* Reed-Solomon error correction */ + longueur = mclength; + for (loop = 0; loop < 50; loop++) { + mccorrection[loop] = 0; + } + total = 0; + for (i = 0; i < longueur; i++) { + total = (chainemc[i] + mccorrection[k - 1]) % 929; + for (j = k - 1; j >= 0; j--) { + if (j == 0) { + mccorrection[j] = (929 - (total * Microcoeffs[offset + j]) % 929) % 929; + } else { + mccorrection[j] = (mccorrection[j - 1] + 929 - (total * Microcoeffs[offset + j]) % 929) % 929; + } + } + } - for(j = 0; j < k; j++) { - if(mccorrection[j] != 0) { mccorrection[j] = 929 - mccorrection[j]; } - } - /* we add these codes to the string */ - for(i = k - 1; i >= 0; i--) { - chainemc[mclength] = mccorrection[i]; - mclength++; - } + for (j = 0; j < k; j++) { + if (mccorrection[j] != 0) { + mccorrection[j] = 929 - mccorrection[j]; + } + } + /* we add these codes to the string */ + for (i = k - 1; i >= 0; i--) { + chainemc[mclength] = mccorrection[i]; + mclength++; + } - /* Now get the RAP (Row Address Pattern) start values */ - LeftRAPStart = RAPTable[variant]; - CentreRAPStart = RAPTable[variant + 34]; - RightRAPStart = RAPTable[variant + 68]; - StartCluster = RAPTable[variant + 102] / 3; + /* Now get the RAP (Row Address Pattern) start values */ + LeftRAPStart = RAPTable[variant]; + CentreRAPStart = RAPTable[variant + 34]; + RightRAPStart = RAPTable[variant + 68]; + StartCluster = RAPTable[variant + 102] / 3; - /* That's all values loaded, get on with the encoding */ + /* That's all values loaded, get on with the encoding */ - LeftRAP = LeftRAPStart; - CentreRAP = CentreRAPStart; - RightRAP = RightRAPStart; - Cluster = StartCluster; /* Cluster can be 0, 1 or 2 for Cluster(0), Cluster(3) and Cluster(6) */ + LeftRAP = LeftRAPStart; + CentreRAP = CentreRAPStart; + RightRAP = RightRAPStart; + Cluster = StartCluster; + /* Cluster can be 0, 1 or 2 for Cluster(0), Cluster(3) and Cluster(6) */ - for(i = 0; i < symbol->rows; i++) { - strcpy(codebarre, ""); - offset = 929 * Cluster; - for(j = 0; j < 5; j++) { - dummy[j] = 0; - } - for(j = 0; j < symbol->option_2 ; j++) { - dummy[j + 1] = chainemc[i * symbol->option_2 + j]; - } - /* Copy the data into codebarre */ - concat(codebarre, RAPLR[LeftRAP]); - concat(codebarre, "1"); - concat(codebarre, codagemc[offset + dummy[1]]); - concat(codebarre, "1"); - if(cc_width == 3) { - concat(codebarre, RAPC[CentreRAP]); - } - if(cc_width >= 2) { - concat(codebarre, "1"); - concat(codebarre, codagemc[offset + dummy[2]]); - concat(codebarre, "1"); - } - if(cc_width == 4) { - concat(codebarre, RAPC[CentreRAP]); - } - if(cc_width >= 3) { - concat(codebarre, "1"); - concat(codebarre, codagemc[offset + dummy[3]]); - concat(codebarre, "1"); - } - if(cc_width == 4) { - concat(codebarre, "1"); - concat(codebarre, codagemc[offset + dummy[4]]); - concat(codebarre, "1"); - } - concat(codebarre, RAPLR[RightRAP]); - concat(codebarre, "1"); /* stop */ + for (i = 0; i < symbol->rows; i++) { + strcpy(codebarre, ""); + offset = 929 * Cluster; + for (j = 0; j < 5; j++) { + dummy[j] = 0; + } + for (j = 0; j < symbol->option_2; j++) { + dummy[j + 1] = chainemc[i * symbol->option_2 + j]; + } + /* Copy the data into codebarre */ + concat(codebarre, RAPLR[LeftRAP]); + concat(codebarre, "1"); + concat(codebarre, codagemc[offset + dummy[1]]); + concat(codebarre, "1"); + if (cc_width == 3) { + concat(codebarre, RAPC[CentreRAP]); + } + if (cc_width >= 2) { + concat(codebarre, "1"); + concat(codebarre, codagemc[offset + dummy[2]]); + concat(codebarre, "1"); + } + if (cc_width == 4) { + concat(codebarre, RAPC[CentreRAP]); + } + if (cc_width >= 3) { + concat(codebarre, "1"); + concat(codebarre, codagemc[offset + dummy[3]]); + concat(codebarre, "1"); + } + if (cc_width == 4) { + concat(codebarre, "1"); + concat(codebarre, codagemc[offset + dummy[4]]); + concat(codebarre, "1"); + } + concat(codebarre, RAPLR[RightRAP]); + concat(codebarre, "1"); /* stop */ - /* Now codebarre is a mixture of letters and numbers */ + /* Now codebarre is a mixture of letters and numbers */ - writer = 0; - flip = 1; - strcpy(pattern, ""); - for(loop = 0; loop < strlen(codebarre); loop++) { - if((codebarre[loop] >= '0') && (codebarre[loop] <= '9')) { - for(k = 0; k < ctoi(codebarre[loop]); k++) { - if(flip == 0) { - pattern[writer] = '0'; - } else { - pattern[writer] = '1'; - } - writer++; - } - pattern[writer] = '\0'; - if(flip == 0) { - flip = 1; - } else { - flip = 0; - } - } else { - lookup(BRSET, PDFttf, codebarre[loop], pattern); - writer += 5; - } - } - symbol->width = writer; + writer = 0; + flip = 1; + strcpy(pattern, ""); + for (loop = 0; loop < strlen(codebarre); loop++) { + if ((codebarre[loop] >= '0') && (codebarre[loop] <= '9')) { + for (k = 0; k < ctoi(codebarre[loop]); k++) { + if (flip == 0) { + pattern[writer] = '0'; + } else { + pattern[writer] = '1'; + } + writer++; + } + pattern[writer] = '\0'; + if (flip == 0) { + flip = 1; + } else { + flip = 0; + } + } else { + lookup(BRSET, PDFttf, codebarre[loop], pattern); + writer += 5; + } + } + symbol->width = writer; - /* so now pattern[] holds the string of '1's and '0's. - copy this to the symbol */ - for(loop = 0; loop < strlen(pattern); loop++) { - if(pattern[loop] == '1') { set_module(symbol, i, loop); } - } - symbol->row_height[i] = 2; + /* so now pattern[] holds the string of '1's and '0's. - copy this to the symbol */ + for (loop = 0; loop < strlen(pattern); loop++) { + if (pattern[loop] == '1') { + set_module(symbol, i, loop); + } + } + symbol->row_height[i] = 2; - /* Set up RAPs and Cluster for next row */ - LeftRAP++; - CentreRAP++; - RightRAP++; - Cluster++; + /* Set up RAPs and Cluster for next row */ + LeftRAP++; + CentreRAP++; + RightRAP++; + Cluster++; - if(LeftRAP == 53) { - LeftRAP = 1; - } - if(CentreRAP == 53) { - CentreRAP = 1; - } - if(RightRAP == 53) { - RightRAP = 1; - } - if(Cluster == 3) { - Cluster = 0; - } - } + if (LeftRAP == 53) { + LeftRAP = 1; + } + if (CentreRAP == 53) { + CentreRAP = 1; + } + if (RightRAP == 53) { + RightRAP = 1; + } + if (Cluster == 3) { + Cluster = 0; + } + } - return 0; + return 0; } -int cc_c(struct zint_symbol *symbol, char source[], int cc_width, int ecc_level) -{ /* CC-C 2D component - byte compressed PDF417 */ - int length, i, binloc; +/* CC-C 2D component - byte compressed PDF417 */ +int cc_c(struct zint_symbol *symbol, char source[], int cc_width, int ecc_level) { + int length, i, binloc; #ifndef _MSC_VER - unsigned char data_string[(strlen(source) / 8) + 4]; + unsigned char data_string[(strlen(source) / 8) + 4]; #else - unsigned char* data_string = (unsigned char*)_alloca((strlen(source) / 8) + 4); + unsigned char* data_string = (unsigned char*) _alloca((strlen(source) / 8) + 4); #endif - int chainemc[1000], mclength, k; - int offset, longueur, loop, total, j, mccorrection[520]; - int c1, c2, c3, dummy[35]; - char codebarre[100], pattern[580]; + int chainemc[1000], mclength, k; + int offset, longueur, loop, total, j, mccorrection[520]; + int c1, c2, c3, dummy[35]; + char codebarre[100], pattern[580]; - length = strlen(source) / 8; + length = strlen(source) / 8; - for(i = 0; i < length; i++) { - binloc = i * 8; + for (i = 0; i < length; i++) { + binloc = i * 8; - data_string[i] = 0; - if(source[binloc] == '1') { data_string[i] += 0x80; } - if(source[binloc + 1] == '1') { data_string[i] += 0x40; } - if(source[binloc + 2] == '1') { data_string[i] += 0x20; } - if(source[binloc + 3] == '1') { data_string[i] += 0x10; } - if(source[binloc + 4] == '1') { data_string[i] += 0x08; } - if(source[binloc + 5] == '1') { data_string[i] += 0x04; } - if(source[binloc + 6] == '1') { data_string[i] += 0x02; } - if(source[binloc + 7] == '1') { data_string[i] += 0x01; } - } + data_string[i] = 0; + for (int p = 0; p < 8; p++) { + if (source[binloc + p] == '1') { + data_string[i] += (0x80 >> p); + } + } + } - mclength = 0; + mclength = 0; - chainemc[mclength] = 0; /* space for length descriptor */ - mclength++; - chainemc[mclength] = 920; /* CC-C identifier */ - mclength++; + chainemc[mclength] = 0; /* space for length descriptor */ + mclength++; + chainemc[mclength] = 920; /* CC-C identifier */ + mclength++; - byteprocess(chainemc, &mclength, data_string, 0, length, 0); + byteprocess(chainemc, &mclength, data_string, 0, length, 0); - chainemc[0] = mclength; + chainemc[0] = mclength; - k = 1; - for(i = 1; i <= (ecc_level + 1); i++) - { - k *= 2; - } + k = 1; + for (i = 1; i <= (ecc_level + 1); i++) { + k *= 2; + } - /* 796 - we now take care of the Reed Solomon codes */ - switch(ecc_level) { - case 1: offset = 2; break; - case 2: offset = 6; break; - case 3: offset = 14; break; - case 4: offset = 30; break; - case 5: offset = 62; break; - case 6: offset = 126; break; - case 7: offset = 254; break; - case 8: offset = 510; break; - default: offset = 0; break; - } + /* 796 - we now take care of the Reed Solomon codes */ + switch (ecc_level) { + case 1: offset = 2; + break; + case 2: offset = 6; + break; + case 3: offset = 14; + break; + case 4: offset = 30; + break; + case 5: offset = 62; + break; + case 6: offset = 126; + break; + case 7: offset = 254; + break; + case 8: offset = 510; + break; + default: offset = 0; + break; + } - longueur = mclength; - for(loop = 0; loop < 520; loop++) { - mccorrection[loop] = 0; - } - total = 0; - for(i = 0; i < longueur; i++) { - total = (chainemc[i] + mccorrection[k - 1]) % 929; - for(j = k - 1; j >= 0; j--) { - if(j == 0) { - mccorrection[j] = (929 - (total * coefrs[offset + j]) % 929) % 929; - } else { - mccorrection[j] = (mccorrection[j - 1] + 929 - (total * coefrs[offset + j]) % 929) % 929; - } - } - } + longueur = mclength; + for (loop = 0; loop < 520; loop++) { + mccorrection[loop] = 0; + } + total = 0; + for (i = 0; i < longueur; i++) { + total = (chainemc[i] + mccorrection[k - 1]) % 929; + for (j = k - 1; j >= 0; j--) { + if (j == 0) { + mccorrection[j] = (929 - (total * coefrs[offset + j]) % 929) % 929; + } else { + mccorrection[j] = (mccorrection[j - 1] + 929 - (total * coefrs[offset + j]) % 929) % 929; + } + } + } - for(j = 0; j < k; j++) { - if(mccorrection[j] != 0) { mccorrection[j] = 929 - mccorrection[j]; } - } - /* we add these codes to the string */ - for(i = k - 1; i >= 0; i--) { - chainemc[mclength] = mccorrection[i]; - mclength++; - } + for (j = 0; j < k; j++) { + if (mccorrection[j] != 0) { + mccorrection[j] = 929 - mccorrection[j]; + } + } + /* we add these codes to the string */ + for (i = k - 1; i >= 0; i--) { + chainemc[mclength] = mccorrection[i]; + mclength++; + } - /* 818 - The CW string is finished */ - c1 = (mclength / cc_width - 1) / 3; - c2 = ecc_level * 3 + (mclength / cc_width - 1) % 3; - c3 = cc_width - 1; + /* 818 - The CW string is finished */ + c1 = (mclength / cc_width - 1) / 3; + c2 = ecc_level * 3 + (mclength / cc_width - 1) % 3; + c3 = cc_width - 1; - /* we now encode each row */ - for(i = 0; i <= (mclength / cc_width) - 1; i++) { - for(j = 0; j < cc_width ; j++) { - dummy[j + 1] = chainemc[i * cc_width + j]; - } - k = (i / 3) * 30; - switch(i % 3) { - /* follows this pattern from US Patent 5,243,655: - Row 0: L0 (row #, # of rows) R0 (row #, # of columns) - Row 1: L1 (row #, security level) R1 (row #, # of rows) - Row 2: L2 (row #, # of columns) R2 (row #, security level) - Row 3: L3 (row #, # of rows) R3 (row #, # of columns) - etc. */ - case 0: - dummy[0] = k + c1; - dummy[cc_width + 1] = k + c3; - break; - case 1: - dummy[0] = k + c2; - dummy[cc_width + 1] = k + c1; - break; - case 2: - dummy[0] = k + c3; - dummy[cc_width + 1] = k + c2; - break; - } - strcpy(codebarre, "+*"); /* Start with a start char and a separator */ + /* we now encode each row */ + for (i = 0; i <= (mclength / cc_width) - 1; i++) { + for (j = 0; j < cc_width; j++) { + dummy[j + 1] = chainemc[i * cc_width + j]; + } + k = (i / 3) * 30; + switch (i % 3) { + case 0: + dummy[0] = k + c1; + dummy[cc_width + 1] = k + c3; + break; + case 1: + dummy[0] = k + c2; + dummy[cc_width + 1] = k + c1; + break; + case 2: + dummy[0] = k + c3; + dummy[cc_width + 1] = k + c2; + break; + } + strcpy(codebarre, "+*"); /* Start with a start char and a separator */ - for(j = 0; j <= cc_width + 1; j++) { - switch(i % 3) { - case 1: offset = 929; /* cluster(3) */ break; - case 2: offset = 1858; /* cluster(6) */ break; - default: offset = 0; /* cluster(0) */ break; - } - concat(codebarre, codagemc[offset + dummy[j]]); - concat(codebarre, "*"); - } - concat(codebarre, "-"); + for (j = 0; j <= cc_width + 1; j++) { + switch (i % 3) { + case 1: offset = 929; /* cluster(3) */ + break; + case 2: offset = 1858; /* cluster(6) */ + break; + default: offset = 0; /* cluster(0) */ + break; + } + concat(codebarre, codagemc[offset + dummy[j]]); + concat(codebarre, "*"); + } + concat(codebarre, "-"); - strcpy(pattern, ""); - for(loop = 0; loop < strlen(codebarre); loop++) { - lookup(BRSET, PDFttf, codebarre[loop], pattern); - } - for(loop = 0; loop < strlen(pattern); loop++) { - if(pattern[loop] == '1') { set_module(symbol, i, loop); } - } - symbol->row_height[i] = 3; - } - symbol->rows = (mclength / cc_width); - symbol->width = strlen(pattern); - - return 0; + strcpy(pattern, ""); + for (loop = 0; loop < strlen(codebarre); loop++) { + lookup(BRSET, PDFttf, codebarre[loop], pattern); + } + for (loop = 0; loop < strlen(pattern); loop++) { + if (pattern[loop] == '1') { + set_module(symbol, i, loop); + } + } + symbol->row_height[i] = 3; + } + symbol->rows = (mclength / cc_width); + symbol->width = strlen(pattern); + + return 0; } -int cc_binary_string(struct zint_symbol *symbol, const char source[], char binary_string[], int cc_mode, int *cc_width, int *ecc, int lin_width) -{ /* Handles all data encodation from section 5 of ISO/IEC 24723 */ - int encoding_method, read_posn, d1, d2, value, alpha_pad; - int i, j, mask, ai_crop,fnc1_latch; - long int group_val; - int ai90_mode, latch, remainder, binary_length; - char date_str[4]; +int cc_binary_string(struct zint_symbol *symbol, const char source[], char binary_string[], int cc_mode, int *cc_width, int *ecc, int lin_width) { /* Handles all data encodation from section 5 of ISO/IEC 24723 */ + int encoding_method, read_posn, d1, d2, value, alpha_pad; + int i, j, mask, ai_crop, fnc1_latch; + long int group_val; + int ai90_mode, latch, remainder, binary_length; + char date_str[4]; #ifndef _MSC_VER - char general_field[strlen(source) + 1], general_field_type[strlen(source) + 1]; + char general_field[strlen(source) + 1], general_field_type[strlen(source) + 1]; #else - char* general_field = (char*)_alloca(strlen(source) + 1); - char* general_field_type = (char*)_alloca(strlen(source) + 1); + char* general_field = (char*) _alloca(strlen(source) + 1); + char* general_field_type = (char*) _alloca(strlen(source) + 1); #endif - int target_bitsize; - - encoding_method = 1; - read_posn = 0; - ai_crop = 0; - fnc1_latch = 0; - alpha_pad = 0; - ai90_mode = 0; - *ecc = 0; - value = 0; - target_bitsize = 0; - - if((source[0] == '1') && ((source[1] == '0') || (source[1] == '1') || (source[1] == '7')) && (strlen(source) > 8)) { - /* Source starts (10), (11) or (17) */ - encoding_method = 2; - } - - if((source[0] == '9') && (source[1] == '0')) { - /* Source starts (90) */ - encoding_method = 3; - } - - if(encoding_method == 1) { - concat(binary_string, "0"); - } - - if(encoding_method == 2) { - /* Encoding Method field "10" - date and lot number */ - - concat(binary_string, "10"); - - if(source[1] == '0') { - /* No date data */ - concat(binary_string, "11"); - read_posn = 2; - } else { - /* Production Date (11) or Expiration Date (17) */ - date_str[0] = source[2]; - date_str[1] = source[3]; - date_str[2] = '\0'; - group_val = atoi(date_str) * 384; - - date_str[0] = source[4]; - date_str[1] = source[5]; - group_val += (atoi(date_str) - 1) * 32; - - date_str[0] = source[6]; - date_str[1] = source[7]; - group_val += atoi(date_str); - - mask = 0x8000; - for(j = 0; j < 16; j++) { - if((group_val & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - - if(source[1] == '1') { - /* Production Date AI 11 */ - concat(binary_string, "0"); - } else { - /* Expiration Date AI 17 */ - concat(binary_string, "1"); - } - read_posn = 8; - } - - if((source[read_posn] == '1') && (source[read_posn + 1] == '0')) { - /* Followed by AI 10 - strip this from general field */ - read_posn += 2; - } else { - /* An FNC1 character needs to be inserted in the general field */ - fnc1_latch = 1; - } - } - - if (encoding_method == 3) { - /* Encodation Method field of "11" - AI 90 */ -#ifndef _MSC_VER - char ninety[strlen(source) + 1]; -#else - char* ninety = (char*)_alloca(strlen(source) + 1); -#endif - char numeric_part[4]; - int alpha, alphanum, numeric, test1, test2, test3, next_ai_posn; - int numeric_value, table3_letter, mask; - - /* "This encodation method may be used if an element string with an AI - 90 occurs at the start of the data message, and if the data field - following the two-digit AI 90 starts with an alphanumeric string which - complies with a specific format." (para 5.2.2) */ - - i = 0; - do { - ninety[i] = source[i + 2]; - i++; - } while ((strlen(source) > i + 2) && ('[' != source[i + 2])); - ninety[i] = '\0'; - - /* Find out if the AI 90 data is alphabetic or numeric or both */ - - alpha = 0; - alphanum = 0; - numeric = 0; - - for(i = 0; i < strlen(ninety); i++) { - - if ((ninety[i] >= 'A') && (ninety[i] <= 'Z')) { - /* Character is alphabetic */ - alpha += 1; - } - - if ((ninety[i] >= '0') && (ninety[i] <= '9')) { - /* Character is numeric */ - numeric += 1; - } - - switch(ninety[i]) { - case '*': - case ',': - case '-': - case '.': - case '/': alphanum += 1; break; - } - - if (!(((ninety[i] >= '0') && (ninety[i] <= '9')) || ((ninety[i] >= 'A') && (ninety[i] <= 'Z')))) { - if((ninety[i] != '*') && (ninety[i] != ',') && (ninety[i] != '-') && (ninety[i] != '.') && (ninety[i] != '/')) { - /* An Invalid AI 90 character */ - strcpy(symbol->errtxt, "Invalid AI 90 data"); - return ZINT_ERROR_INVALID_DATA; - } - } - } - - /* must start with 0, 1, 2 or 3 digits followed by an uppercase character */ - test1 = -1; - for(i = 3; i >= 0; i--) { - if ((ninety[i] >= 'A') && (ninety[i] <= 'Z')) { - test1 = i; - } - } - - test2 = 0; - for(i = 0; i < test1; i++) { - if (!((ninety[i] >= '0') && (ninety[i] <= '9'))) { - test2 = 1; - } - } - - /* leading zeros are not permitted */ - test3 = 0; - if((test1 >= 1) && (ninety[0] == '0')) { test3 = 1; } - - if((test1 != -1) && (test2 != 1) && (test3 == 0)) { - /* Encodation method "11" can be used */ - concat(binary_string, "11"); - - numeric -= test1; - alpha --; - - /* Decide on numeric, alpha or alphanumeric mode */ - /* Alpha mode is a special mode for AI 90 */ - - if(alphanum > 0) { - /* Alphanumeric mode */ - concat(binary_string, "0"); - ai90_mode = 1; - } else { - if(alpha > numeric) { - /* Alphabetic mode */ - concat(binary_string, "11"); - ai90_mode = 2; - } else { - /* Numeric mode */ - concat(binary_string, "10"); - ai90_mode = 3; - } - } - - next_ai_posn = 2 + strlen(ninety); - - if(source[next_ai_posn] == '[') { - /* There are more AIs afterwords */ - if((source[next_ai_posn + 1] == '2') && (source[next_ai_posn + 2] == '1')) { - /* AI 21 follows */ - ai_crop = 1; - } - - if((source[next_ai_posn + 1] == '8') && (source[next_ai_posn + 2] == '0') && (source[next_ai_posn + 3] == '0') && (source[next_ai_posn + 4] == '4')) { - /* AI 8004 follows */ - ai_crop = 2; - } - } - - switch(ai_crop) { - case 0: concat(binary_string, "0"); break; - case 1: concat(binary_string, "10"); break; - case 2: concat(binary_string, "11"); break; - } - - if(test1 == 0) { - strcpy(numeric_part, "0"); - } else { - for(i = 0; i < test1; i++) { - numeric_part[i] = ninety[i]; - } - numeric_part[i] = '\0'; - } - - numeric_value = atoi(numeric_part); - - table3_letter = -1; - if(numeric_value < 31) { - switch(ninety[test1]) { - case 'B': table3_letter = 0; break; - case 'D': table3_letter = 1; break; - case 'H': table3_letter = 2; break; - case 'I': table3_letter = 3; break; - case 'J': table3_letter = 4; break; - case 'K': table3_letter = 5; break; - case 'L': table3_letter = 6; break; - case 'N': table3_letter = 7; break; - case 'P': table3_letter = 8; break; - case 'Q': table3_letter = 9; break; - case 'R': table3_letter = 10; break; - case 'S': table3_letter = 11; break; - case 'T': table3_letter = 12; break; - case 'V': table3_letter = 13; break; - case 'W': table3_letter = 14; break; - case 'Z': table3_letter = 15; break; - } - } - - if(table3_letter != -1) { - /* Encoding can be done according to 5.2.2 c) 2) */ - /* five bit binary string representing value before letter */ - mask = 0x10; - for(j = 0; j < 5; j++) { - if((numeric_value & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - - /* followed by four bit representation of letter from Table 3 */ - mask = 0x08; - for(j = 0; j < 4; j++) { - if((table3_letter & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - } else { - /* Encoding is done according to 5.2.2 c) 3) */ - concat(binary_string, "11111"); - /* ten bit representation of number */ - mask = 0x200; - for(j = 0; j < 10; j++) { - if((numeric_value & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - - /* five bit representation of ASCII character */ - mask = 0x10; - for(j = 0; j < 5; j++) { - if(((ninety[test1] - 65) & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - } - - read_posn = test1 + 3; - } else { - /* Use general field encodation instead */ - concat(binary_string, "0"); - read_posn = 0; - } - } - - /* Now encode the rest of the AI 90 data field */ - if(ai90_mode == 2) { - /* Alpha encodation (section 5.2.3) */ - do { - if((source[read_posn] >= '0') && (source[read_posn] <= '9')) { - mask = 0x10; - for(j = 0; j < 5; j++) { - if(((source[read_posn] + 4) & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - } - - if((source[read_posn] >= 'A') && (source[read_posn] <= 'Z')) { - mask = 0x20; - for(j = 0; j < 6; j++) { - if(((source[read_posn] - 65) & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - } - - if(source[read_posn] == '[') { - concat(binary_string, "11111"); - } - - read_posn++; - } while ((source[read_posn - 1] != '[') && (source[read_posn - 1] != '\0')); - alpha_pad = 1; /* This is overwritten if a general field is encoded */ - } - - if(ai90_mode == 1) { - /* Alphanumeric mode */ - do { - if((source[read_posn] >= '0') && (source[read_posn] <= '9')) { - mask = 0x10; - for(j = 0; j < 5; j++) { - if(((source[read_posn] - 43) & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - } - - if((source[read_posn] >= 'A') && (source[read_posn] <= 'Z')) { - mask = 0x20; - for(j = 0; j < 6; j++) { - if(((source[read_posn] - 33) & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - } - - switch(source[read_posn]) { - case '[': concat(binary_string, "01111"); break; - case '*': concat(binary_string, "111010"); break; - case ',': concat(binary_string, "111011"); break; - case '-': concat(binary_string, "111100"); break; - case '.': concat(binary_string, "111101"); break; - case '/': concat(binary_string, "111110"); break; - } - - read_posn++; - } while ((source[read_posn - 1] != '[') && (source[read_posn - 1] != '\0')); - } - - read_posn += (2 * ai_crop); - - /* The compressed data field has been processed if appropriate - the - rest of the data (if any) goes into a general-purpose data compaction field */ - - j = 0; - if(fnc1_latch == 1) { - /* Encodation method "10" has been used but it is not followed by - AI 10, so a FNC1 character needs to be added */ - general_field[j] = '['; - j++; - } - - for(i = read_posn; i < strlen(source); i++) { - general_field[j] = source[i]; - j++; - } - general_field[j] = '\0'; - - if(strlen(general_field) != 0) { alpha_pad = 0; } - - latch = 0; - for(i = 0; i < strlen(general_field); i++) { - /* Table 13 - ISO/IEC 646 encodation */ - if((general_field[i] < ' ') || (general_field[i] > 'z')) { - general_field_type[i] = INVALID_CHAR; latch = 1; - } else { - general_field_type[i] = ISOIEC; - } - - if(general_field[i] == '#') { - general_field_type[i] = INVALID_CHAR; latch = 1; - } - if(general_field[i] == '$') { - general_field_type[i] = INVALID_CHAR; latch = 1; - } - if(general_field[i] == '@') { - general_field_type[i] = INVALID_CHAR; latch = 1; - } - if(general_field[i] == 92) { - general_field_type[i] = INVALID_CHAR; latch = 1; - } - if(general_field[i] == '^') { - general_field_type[i] = INVALID_CHAR; latch = 1; - } - if(general_field[i] == 96) { - general_field_type[i] = INVALID_CHAR; latch = 1; - } - - /* Table 12 - Alphanumeric encodation */ - if((general_field[i] >= 'A') && (general_field[i] <= 'Z')) { - general_field_type[i] = ALPHA_OR_ISO; - } - if(general_field[i] == '*') { - general_field_type[i] = ALPHA_OR_ISO; - } - if(general_field[i] == ',') { - general_field_type[i] = ALPHA_OR_ISO; - } - if(general_field[i] == '-') { - general_field_type[i] = ALPHA_OR_ISO; - } - if(general_field[i] == '.') { - general_field_type[i] = ALPHA_OR_ISO; - } - if(general_field[i] == '/') { - general_field_type[i] = ALPHA_OR_ISO; - } - - /* Numeric encodation */ - if((general_field[i] >= '0') && (general_field[i] <= '9')) { - general_field_type[i] = ANY_ENC; - } - if(general_field[i] == '[') { - /* FNC1 can be encoded in any system */ - general_field_type[i] = ANY_ENC; - } - - } - - general_field_type[strlen(general_field)] = '\0'; - - if(latch == 1) { - /* Invalid characters in input data */ - strcpy(symbol->errtxt, "Invalid characters in input data"); - return ZINT_ERROR_INVALID_DATA; - } - - for(i = 0; i < strlen(general_field); i++) { - if((general_field_type[i] == ISOIEC) && (general_field[i + 1] == '[')) { - general_field_type[i + 1] = ISOIEC; - } - } - - for(i = 0; i < strlen(general_field); i++) { - if((general_field_type[i] == ALPHA_OR_ISO) && (general_field[i + 1] == '[')) { - general_field_type[i + 1] = ALPHA_OR_ISO; - } - } - - latch = general_rules(general_field, general_field_type); - - i = 0; - do { - switch(general_field_type[i]) { - case NUMERIC: - - if(i != 0) { - if((general_field_type[i - 1] != NUMERIC) && (general_field[i - 1] != '[')) { - concat(binary_string, "000"); /* Numeric latch */ - } - } - - if(general_field[i] != '[') { - d1 = ctoi(general_field[i]); - } else { - d1 = 10; - } - - if(general_field[i + 1] != '[') { - d2 = ctoi(general_field[i + 1]); - } else { - d2 = 10; - } - - value = (11 * d1) + d2 + 8; - - mask = 0x40; - for(j = 0; j < 7; j++) { - if((value & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - - i += 2; - break; - - case ALPHA: - - if(i != 0) { - if((general_field_type[i - 1] == NUMERIC) || (general_field[i - 1] == '[')) { - concat(binary_string, "0000"); /* Alphanumeric latch */ - } - if(general_field_type[i - 1] == ISOIEC) { - concat(binary_string, "00100"); /* ISO/IEC 646 latch */ - } - } - - if((general_field[i] >= '0') && (general_field[i] <= '9')) { - - value = general_field[i] - 43; - - mask = 0x10; - for(j = 0; j < 5; j++) { - if((value & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - } - - if((general_field[i] >= 'A') && (general_field[i] <= 'Z')) { - - value = general_field[i] - 33; - - mask = 0x20; - for(j = 0; j < 6; j++) { - if((value & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - } - - if(general_field[i] == '[') concat(binary_string, "01111"); /* FNC1/Numeric latch */ - if(general_field[i] == '*') concat(binary_string, "111010"); /* asterisk */ - if(general_field[i] == ',') concat(binary_string, "111011"); /* comma */ - if(general_field[i] == '-') concat(binary_string, "111100"); /* minus or hyphen */ - if(general_field[i] == '.') concat(binary_string, "111101"); /* period or full stop */ - if(general_field[i] == '/') concat(binary_string, "111110"); /* slash or solidus */ - - i++; - break; - - case ISOIEC: - - if(i != 0) { - if((general_field_type[i - 1] == NUMERIC) || (general_field[i - 1] == '[')) { - concat(binary_string, "0000"); /* Alphanumeric latch */ - concat(binary_string, "00100"); /* ISO/IEC 646 latch */ - } - if(general_field_type[i - 1] == ALPHA) { - concat(binary_string, "00100"); /* ISO/IEC 646 latch */ - } - } - - if((general_field[i] >= '0') && (general_field[i] <= '9')) { - - value = general_field[i] - 43; - - mask = 0x10; - for(j = 0; j < 5; j++) { - if((value & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - } - - if((general_field[i] >= 'A') && (general_field[i] <= 'Z')) { - - value = general_field[i] - 1; - - mask = 0x40; - for(j = 0; j < 7; j++) { - if((value & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - } - - if((general_field[i] >= 'a') && (general_field[i] <= 'z')) { - - value = general_field[i] - 7; - - mask = 0x40; - for(j = 0; j < 7; j++) { - if((value & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - } - - if(general_field[i] == '[') concat(binary_string, "01111"); /* FNC1/Numeric latch */ - if(general_field[i] == '!') concat(binary_string, "11101000"); /* exclamation mark */ - if(general_field[i] == 34) concat(binary_string, "11101001"); /* quotation mark */ - if(general_field[i] == 37) concat(binary_string, "11101010"); /* percent sign */ - if(general_field[i] == '&') concat(binary_string, "11101011"); /* ampersand */ - if(general_field[i] == 39) concat(binary_string, "11101100"); /* apostrophe */ - if(general_field[i] == '(') concat(binary_string, "11101101"); /* left parenthesis */ - if(general_field[i] == ')') concat(binary_string, "11101110"); /* right parenthesis */ - if(general_field[i] == '*') concat(binary_string, "11101111"); /* asterisk */ - if(general_field[i] == '+') concat(binary_string, "11110000"); /* plus sign */ - if(general_field[i] == ',') concat(binary_string, "11110001"); /* comma */ - if(general_field[i] == '-') concat(binary_string, "11110010"); /* minus or hyphen */ - if(general_field[i] == '.') concat(binary_string, "11110011"); /* period or full stop */ - if(general_field[i] == '/') concat(binary_string, "11110100"); /* slash or solidus */ - if(general_field[i] == ':') concat(binary_string, "11110101"); /* colon */ - if(general_field[i] == ';') concat(binary_string, "11110110"); /* semicolon */ - if(general_field[i] == '<') concat(binary_string, "11110111"); /* less-than sign */ - if(general_field[i] == '=') concat(binary_string, "11111000"); /* equals sign */ - if(general_field[i] == '>') concat(binary_string, "11111001"); /* greater-than sign */ - if(general_field[i] == '?') concat(binary_string, "11111010"); /* question mark */ - if(general_field[i] == '_') concat(binary_string, "11111011"); /* underline or low line */ - if(general_field[i] == ' ') concat(binary_string, "11111100"); /* space */ - - i++; - break; - } - } while (i + latch < strlen(general_field)); - - binary_length = strlen(binary_string); - if(cc_mode == 1) { - /* CC-A 2D component - calculate remaining space */ - switch(*(cc_width)) { - case 2: - if(binary_length > 167) { return ZINT_ERROR_TOO_LONG; } - if(binary_length <= 167) { target_bitsize = 167; } - if(binary_length <= 138) { target_bitsize = 138; } - if(binary_length <= 118) { target_bitsize = 118; } - if(binary_length <= 108) { target_bitsize = 108; } - if(binary_length <= 88) { target_bitsize = 88; } - if(binary_length <= 78) { target_bitsize = 78; } - if(binary_length <= 59) { target_bitsize = 59; } - break; - case 3: - if(binary_length > 167) { return ZINT_ERROR_TOO_LONG; } - if(binary_length <= 167) { target_bitsize = 167; } - if(binary_length <= 138) { target_bitsize = 138; } - if(binary_length <= 118) { target_bitsize = 118; } - if(binary_length <= 98) { target_bitsize = 98; } - if(binary_length <= 78) { target_bitsize = 78; } - break; - case 4: - if(binary_length > 197) { return ZINT_ERROR_TOO_LONG; } - if(binary_length <= 197) { target_bitsize = 197; } - if(binary_length <= 167) { target_bitsize = 167; } - if(binary_length <= 138) { target_bitsize = 138; } - if(binary_length <= 108) { target_bitsize = 108; } - if(binary_length <= 78) { target_bitsize = 78; } - break; - } - } - - if(cc_mode == 2) { - /* CC-B 2D component - calculated from ISO/IEC 24728 Table 1 */ - switch(*(cc_width)) { - case 2: - if(binary_length > 336) { return ZINT_ERROR_TOO_LONG; } - if(binary_length <= 336) { target_bitsize = 336; } - if(binary_length <= 296) { target_bitsize = 296; } - if(binary_length <= 256) { target_bitsize = 256; } - if(binary_length <= 208) { target_bitsize = 208; } - if(binary_length <= 160) { target_bitsize = 160; } - if(binary_length <= 104) { target_bitsize = 104; } - if(binary_length <= 56) { target_bitsize = 56; } - break; - case 3: - if(binary_length > 768) { return ZINT_ERROR_TOO_LONG; } - if(binary_length <= 768) { target_bitsize = 768; } - if(binary_length <= 648) { target_bitsize = 648; } - if(binary_length <= 536) { target_bitsize = 536; } - if(binary_length <= 416) { target_bitsize = 416; } - if(binary_length <= 304) { target_bitsize = 304; } - if(binary_length <= 208) { target_bitsize = 208; } - if(binary_length <= 152) { target_bitsize = 152; } - if(binary_length <= 112) { target_bitsize = 112; } - if(binary_length <= 72) { target_bitsize = 72; } - if(binary_length <= 32) { target_bitsize = 32; } - break; - case 4: - if(binary_length > 1184) { return ZINT_ERROR_TOO_LONG; } - if(binary_length <= 1184) { target_bitsize = 1184; } - if(binary_length <= 1016) { target_bitsize = 1016; } - if(binary_length <= 840) { target_bitsize = 840; } - if(binary_length <= 672) { target_bitsize = 672; } - if(binary_length <= 496) { target_bitsize = 496; } - if(binary_length <= 352) { target_bitsize = 352; } - if(binary_length <= 264) { target_bitsize = 264; } - if(binary_length <= 208) { target_bitsize = 208; } - if(binary_length <= 152) { target_bitsize = 152; } - if(binary_length <= 96) { target_bitsize = 96; } - if(binary_length <= 56) { target_bitsize = 56; } - break; - } - } - - if (cc_mode == 3) { - /* CC-C 2D Component is a bit more complex! */ - int byte_length, codewords_used, ecc_level, ecc_codewords, rows; - int codewords_total, target_codewords, target_bytesize; - - byte_length = binary_length / 8; - if(binary_length % 8 != 0) { byte_length++; } - - codewords_used = (byte_length / 6) * 5; - codewords_used += byte_length % 6; - - ecc_level = 7; - if(codewords_used <= 1280) { ecc_level = 6; } - if(codewords_used <= 640) { ecc_level = 5; } - if(codewords_used <= 320) { ecc_level = 4; } - if(codewords_used <= 160) { ecc_level = 3; } - if(codewords_used <= 40) { ecc_level = 2; } - *(ecc) = ecc_level; - ecc_codewords = 1; - for(i = 1; i <= (ecc_level + 1); i++){ - ecc_codewords *= 2; - } - - codewords_used += ecc_codewords; - codewords_used += 3; - - if(codewords_used > symbol->option_3) { - return ZINT_ERROR_TOO_LONG; - } - /* *(cc_width) = 0.5 + sqrt((codewords_used) / 3); */ - *(cc_width) = (lin_width - 62) / 17; - if((codewords_used / *(cc_width)) > 90) { - /* stop the symbol from becoming too high */ - *(cc_width) = *(cc_width) + 1; - } - - rows = codewords_used / *(cc_width); - if(codewords_used % *(cc_width) != 0) { - rows++; - } - - codewords_total = *(cc_width) * rows; - - target_codewords = codewords_total - ecc_codewords; - target_codewords -= 3; - - target_bytesize = 6 * (target_codewords / 5); - target_bytesize += target_codewords % 5; - - target_bitsize = 8 * target_bytesize; - } - - remainder = binary_length - target_bitsize; - - if(latch == 1) { - i = 0; - /* There is still one more numeric digit to encode */ - - if((remainder >= 4) && (remainder <= 6)) { - d1 = ctoi(general_field[i]); - d1++; - - mask = 0x08; - for(j = 0; j < 4; j++) { - if((value & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - } else { - d1 = ctoi(general_field[i]); - d2 = 10; - - value = (11 * d1) + d2 + 8; - - mask = 0x40; - for(j = 0; j < 7; j++) { - if((value & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - /* This may push the symbol up to the next size */ - } - } - - if(strlen(binary_string) > 11805) { /* (2361 * 5) */ - strcpy(symbol->errtxt, "Input too long"); - return ZINT_ERROR_TOO_LONG; - } - - /* all the code below is repeated from above - it needs to be calculated again because the - size of the symbol may have changed when adding data in the above sequence */ - - binary_length = strlen(binary_string); - if(cc_mode == 1) { - /* CC-A 2D component - calculate padding required */ - switch(*(cc_width)) { - case 2: - if(binary_length > 167) { return ZINT_ERROR_TOO_LONG; } - if(binary_length <= 167) { target_bitsize = 167; } - if(binary_length <= 138) { target_bitsize = 138; } - if(binary_length <= 118) { target_bitsize = 118; } - if(binary_length <= 108) { target_bitsize = 108; } - if(binary_length <= 88) { target_bitsize = 88; } - if(binary_length <= 78) { target_bitsize = 78; } - if(binary_length <= 59) { target_bitsize = 59; } - break; - case 3: - if(binary_length > 167) { return ZINT_ERROR_TOO_LONG; } - if(binary_length <= 167) { target_bitsize = 167; } - if(binary_length <= 138) { target_bitsize = 138; } - if(binary_length <= 118) { target_bitsize = 118; } - if(binary_length <= 98) { target_bitsize = 98; } - if(binary_length <= 78) { target_bitsize = 78; } - break; - case 4: - if(binary_length > 197) { return ZINT_ERROR_TOO_LONG; } - if(binary_length <= 197) { target_bitsize = 197; } - if(binary_length <= 167) { target_bitsize = 167; } - if(binary_length <= 138) { target_bitsize = 138; } - if(binary_length <= 108) { target_bitsize = 108; } - if(binary_length <= 78) { target_bitsize = 78; } - break; - } - } - - if(cc_mode == 2) { - /* CC-B 2D component */ - switch(*(cc_width)) { - case 2: - if(binary_length > 336) { return ZINT_ERROR_TOO_LONG; } - if(binary_length <= 336) { target_bitsize = 336; } - if(binary_length <= 296) { target_bitsize = 296; } - if(binary_length <= 256) { target_bitsize = 256; } - if(binary_length <= 208) { target_bitsize = 208; } - if(binary_length <= 160) { target_bitsize = 160; } - if(binary_length <= 104) { target_bitsize = 104; } - if(binary_length <= 56) { target_bitsize = 56; } - break; - case 3: - if(binary_length > 768) { return ZINT_ERROR_TOO_LONG; } - if(binary_length <= 768) { target_bitsize = 768; } - if(binary_length <= 648) { target_bitsize = 648; } - if(binary_length <= 536) { target_bitsize = 536; } - if(binary_length <= 416) { target_bitsize = 416; } - if(binary_length <= 304) { target_bitsize = 304; } - if(binary_length <= 208) { target_bitsize = 208; } - if(binary_length <= 152) { target_bitsize = 152; } - if(binary_length <= 112) { target_bitsize = 112; } - if(binary_length <= 72) { target_bitsize = 72; } - if(binary_length <= 32) { target_bitsize = 32; } - break; - case 4: - if(binary_length > 1184) { return ZINT_ERROR_TOO_LONG; } - if(binary_length <= 1184) { target_bitsize = 1184; } - if(binary_length <= 1016) { target_bitsize = 1016; } - if(binary_length <= 840) { target_bitsize = 840; } - if(binary_length <= 672) { target_bitsize = 672; } - if(binary_length <= 496) { target_bitsize = 496; } - if(binary_length <= 352) { target_bitsize = 352; } - if(binary_length <= 264) { target_bitsize = 264; } - if(binary_length <= 208) { target_bitsize = 208; } - if(binary_length <= 152) { target_bitsize = 152; } - if(binary_length <= 96) { target_bitsize = 96; } - if(binary_length <= 56) { target_bitsize = 56; } - break; - } - } - - if (cc_mode == 3) { - /* CC-C 2D Component is a bit more complex! */ - int byte_length, codewords_used, ecc_level, ecc_codewords, rows; - int codewords_total, target_codewords, target_bytesize; - - byte_length = binary_length / 8; - if(binary_length % 8 != 0) { byte_length++; } - - codewords_used = (byte_length / 6) * 5; - codewords_used += byte_length % 6; - - ecc_level = 7; - if(codewords_used <= 1280) { ecc_level = 6; } - if(codewords_used <= 640) { ecc_level = 5; } - if(codewords_used <= 320) { ecc_level = 4; } - if(codewords_used <= 160) { ecc_level = 3; } - if(codewords_used <= 40) { ecc_level = 2; } - *(ecc) = ecc_level; - ecc_codewords = 1; - for(i = 1; i <= (ecc_level + 1); i++){ - ecc_codewords *= 2; - } - - codewords_used += ecc_codewords; - codewords_used += 3; - - if(codewords_used > symbol->option_3) { - return ZINT_ERROR_TOO_LONG; - } - /* *(cc_width) = 0.5 + sqrt((codewords_used) / 3); */ - *(cc_width) = (lin_width - 62) / 17; - if((codewords_used / *(cc_width)) > 90) { - /* stop the symbol from becoming too high */ - *(cc_width) = *(cc_width) + 1; - } - - rows = codewords_used / *(cc_width); - if(codewords_used % *(cc_width) != 0) { - rows++; - } - - codewords_total = *(cc_width) * rows; - - target_codewords = codewords_total - ecc_codewords; - target_codewords -= 3; - - target_bytesize = 6 * (target_codewords / 5); - target_bytesize += target_codewords % 5; - - target_bitsize = 8 * target_bytesize; - } - - if(binary_length < target_bitsize) { - /* Now add padding to binary string */ - if (alpha_pad == 1) { - concat(binary_string, "11111"); - alpha_pad = 0; - /* Extra FNC1 character required after Alpha encodation (section 5.2.3) */ - } - - if ((strlen(general_field) != 0) && (general_field_type[strlen(general_field) - 1] == NUMERIC)) { - concat(binary_string, "0000"); - } - - while (strlen(binary_string) < target_bitsize) { - concat(binary_string, "00100"); - } - - if(strlen(binary_string) > target_bitsize) { - binary_string[target_bitsize] = '\0'; - } - } - - return 0; -} - -void add_leading_zeroes(struct zint_symbol *symbol) -{ - int with_addon = 0; - int first_len = 0, second_len = 0, zfirst_len = 0, zsecond_len = 0, i, h, n = 0; - - h = strlen(symbol->primary); - for(i = 0; i < h; i++) { - if(symbol->primary[i] == '+') { - with_addon = 1; - } else { - if(with_addon == 0) { - first_len++; - } else { - second_len++; - } - } - } - - /* Calculate target lengths */ - if(first_len <= 12) { zfirst_len = 12; } - if(first_len <= 7) { zfirst_len = 7; } - if(second_len <= 5) { zsecond_len = 5; } - if(second_len <= 2) { zsecond_len = 2; } - if(second_len == 0) { zsecond_len = 0; } - - /* Add leading zeroes */ - n = zfirst_len - first_len; - if (n > 0) - { - memmove(symbol->primary + n, symbol->primary, h); - memset(symbol->primary, '0', n); - } - n += first_len + 1; - if (zsecond_len) - { - memmove(symbol->primary + n + zsecond_len, symbol->primary + n, second_len); - memset(symbol->primary + n , '0', zsecond_len); - n += zsecond_len + second_len; - } - symbol->primary[n] = '\0'; -} - -int composite(struct zint_symbol *symbol, unsigned char source[], int length) -{ - int error_number, cc_mode, cc_width, ecc_level; - int j, i, k; - unsigned int rs = length + 1; - unsigned int bs = 20 * rs; - unsigned int pri_len; + int target_bitsize; + + encoding_method = 1; + read_posn = 0; + ai_crop = 0; + fnc1_latch = 0; + alpha_pad = 0; + ai90_mode = 0; + *ecc = 0; + value = 0; + target_bitsize = 0; + + if ((source[0] == '1') && ((source[1] == '0') || (source[1] == '1') || (source[1] == '7')) && (strlen(source) > 8)) { + /* Source starts (10), (11) or (17) */ + encoding_method = 2; + } + + if ((source[0] == '9') && (source[1] == '0')) { + /* Source starts (90) */ + encoding_method = 3; + } + + if (encoding_method == 1) { + concat(binary_string, "0"); + } + + if (encoding_method == 2) { + /* Encoding Method field "10" - date and lot number */ + + concat(binary_string, "10"); + + if (source[1] == '0') { + /* No date data */ + concat(binary_string, "11"); + read_posn = 2; + } else { + /* Production Date (11) or Expiration Date (17) */ + date_str[0] = source[2]; + date_str[1] = source[3]; + date_str[2] = '\0'; + group_val = atoi(date_str) * 384; + + date_str[0] = source[4]; + date_str[1] = source[5]; + group_val += (atoi(date_str) - 1) * 32; + + date_str[0] = source[6]; + date_str[1] = source[7]; + group_val += atoi(date_str); + + mask = 0x8000; + for (j = 0; j < 16; j++) { + if ((group_val & mask) == 0x00) { + concat(binary_string, "0"); + } else { + concat(binary_string, "1"); + } + mask = mask >> 1; + } + + if (source[1] == '1') { + /* Production Date AI 11 */ + concat(binary_string, "0"); + } else { + /* Expiration Date AI 17 */ + concat(binary_string, "1"); + } + read_posn = 8; + } + + if ((source[read_posn] == '1') && (source[read_posn + 1] == '0')) { + /* Followed by AI 10 - strip this from general field */ + read_posn += 2; + } else { + /* An FNC1 character needs to be inserted in the general field */ + fnc1_latch = 1; + } + } + + if (encoding_method == 3) { + /* Encodation Method field of "11" - AI 90 */ #ifndef _MSC_VER - char reduced[rs]; - char binary_string[bs]; + char ninety[strlen(source) + 1]; #else - char* reduced = (char*)_alloca(rs); - char* binary_string = (char*)_alloca(bs); + char* ninety = (char*) _alloca(strlen(source) + 1); #endif - struct zint_symbol *linear; - int top_shift, bottom_shift; + char numeric_part[4]; + int alpha, alphanum, numeric, test1, test2, test3, next_ai_posn; + int numeric_value, table3_letter, mask; - error_number = 0; - pri_len = strlen(symbol->primary); - if(pri_len == 0) { - strcpy(symbol->errtxt, "No primary (linear) message in 2D composite"); - return ZINT_ERROR_INVALID_OPTION; - } + /* "This encodation method may be used if an element string with an AI + 90 occurs at the start of the data message, and if the data field + following the two-digit AI 90 starts with an alphanumeric string which + complies with a specific format." (para 5.2.2) */ - if(length > 2990) { - strcpy(symbol->errtxt, "2D component input data too long"); - return ZINT_ERROR_TOO_LONG; - } + i = 0; + do { + ninety[i] = source[i + 2]; + i++; + } while ((strlen(source) > i + 2) && ('[' != source[i + 2])); + ninety[i] = '\0'; - linear = ZBarcode_Create(); /* Symbol contains the 2D component and Linear contains the rest */ + /* Find out if the AI 90 data is alphabetic or numeric or both */ - error_number = gs1_verify(symbol, source, length, reduced); - if(error_number != 0) { return error_number; } + alpha = 0; + alphanum = 0; + numeric = 0; - cc_mode = symbol->option_1; + for (i = 0; i < strlen(ninety); i++) { - if((cc_mode == 3) && (symbol->symbology != BARCODE_EAN128_CC)) { - /* CC-C can only be used with a GS1-128 linear part */ - strcpy(symbol->errtxt, "Invalid mode (CC-C only valid with GS1-128 linear component)"); - return ZINT_ERROR_INVALID_OPTION; - } + if ((ninety[i] >= 'A') && (ninety[i] <= 'Z')) { + /* Character is alphabetic */ + alpha += 1; + } - linear->symbology = symbol->symbology; + if ((ninety[i] >= '0') && (ninety[i] <= '9')) { + /* Character is numeric */ + numeric += 1; + } - if(linear->symbology != BARCODE_EAN128_CC) { - /* Set the "component linkage" flag in the linear component */ - linear->option_1 = 2; - } else { - /* GS1-128 needs to know which type of 2D component is used */ - linear->option_1 = cc_mode; - } + switch (ninety[i]) { + case '*': + case ',': + case '-': + case '.': + case '/': alphanum += 1; + break; + } - switch(symbol->symbology) { - case BARCODE_EANX_CC: error_number = eanx(linear, (unsigned char *)symbol->primary, pri_len); break; - case BARCODE_EAN128_CC: error_number = ean_128(linear, (unsigned char *)symbol->primary, pri_len); break; - case BARCODE_RSS14_CC: error_number = rss14(linear, (unsigned char *)symbol->primary, pri_len); break; - case BARCODE_RSS_LTD_CC: error_number = rsslimited(linear, (unsigned char *)symbol->primary, pri_len); break; - case BARCODE_RSS_EXP_CC: error_number = rssexpanded(linear, (unsigned char *)symbol->primary, pri_len); break; - case BARCODE_UPCA_CC: error_number = eanx(linear, (unsigned char *)symbol->primary, pri_len); break; - case BARCODE_UPCE_CC: error_number = eanx(linear, (unsigned char *)symbol->primary, pri_len); break; - case BARCODE_RSS14STACK_CC: error_number = rss14(linear, (unsigned char *)symbol->primary, pri_len); break; - case BARCODE_RSS14_OMNI_CC: error_number = rss14(linear, (unsigned char *)symbol->primary, pri_len); break; - case BARCODE_RSS_EXPSTACK_CC: error_number = rssexpanded(linear, (unsigned char *)symbol->primary, pri_len); break; - } + if (!(((ninety[i] >= '0') && (ninety[i] <= '9')) || ((ninety[i] >= 'A') && (ninety[i] <= 'Z')))) { + if ((ninety[i] != '*') && (ninety[i] != ',') && (ninety[i] != '-') && (ninety[i] != '.') && (ninety[i] != '/')) { + /* An Invalid AI 90 character */ + strcpy(symbol->errtxt, "Invalid AI 90 data"); + return ZINT_ERROR_INVALID_DATA; + } + } + } - if(error_number != 0) { - strcpy(symbol->errtxt, linear->errtxt); - concat(symbol->errtxt, " in linear component"); - return error_number; - } + /* must start with 0, 1, 2 or 3 digits followed by an uppercase character */ + test1 = -1; + for (i = 3; i >= 0; i--) { + if ((ninety[i] >= 'A') && (ninety[i] <= 'Z')) { + test1 = i; + } + } - switch(symbol->symbology) { - /* Determine width of 2D component according to ISO/IEC 24723 Table 1 */ - case BARCODE_EANX_CC: - switch(pri_len) { - case 7: /* EAN-8 */ - case 10: /* EAN-8 + 2 */ - case 13: /* EAN-8 + 5 */ - cc_width = 3; - break; - case 12: /* EAN-13 */ - case 15: /* EAN-13 + 2 */ - case 18: /* EAN-13 + 5 */ - cc_width = 4; - break; - } - break; - case BARCODE_EAN128_CC: cc_width = 4; break; - case BARCODE_RSS14_CC: cc_width = 4; break; - case BARCODE_RSS_LTD_CC: cc_width = 3; break; - case BARCODE_RSS_EXP_CC: cc_width = 4; break; - case BARCODE_UPCA_CC: cc_width = 4; break; - case BARCODE_UPCE_CC: cc_width = 2; break; - case BARCODE_RSS14STACK_CC: cc_width = 2; break; - case BARCODE_RSS14_OMNI_CC: cc_width = 2; break; - case BARCODE_RSS_EXPSTACK_CC: cc_width = 4; break; - } + test2 = 0; + for (i = 0; i < test1; i++) { + if (!((ninety[i] >= '0') && (ninety[i] <= '9'))) { + test2 = 1; + } + } - memset(binary_string, 0, bs); + /* leading zeros are not permitted */ + test3 = 0; + if ((test1 >= 1) && (ninety[0] == '0')) { + test3 = 1; + } - if(cc_mode < 1 || cc_mode > 3) { cc_mode = 1; } + if ((test1 != -1) && (test2 != 1) && (test3 == 0)) { + /* Encodation method "11" can be used */ + concat(binary_string, "11"); - if(cc_mode == 1) { - i = cc_binary_string(symbol, reduced, binary_string, cc_mode, &cc_width, &ecc_level, linear->width); - if (i == ZINT_ERROR_TOO_LONG) { - cc_mode = 2; - } - } + numeric -= test1; + alpha--; - if(cc_mode == 2) { /* If the data didn't fit into CC-A it is recalculated for CC-B */ - i = cc_binary_string(symbol, reduced, binary_string, cc_mode, &cc_width, &ecc_level, linear->width); - if (i == ZINT_ERROR_TOO_LONG) { - if(symbol->symbology != BARCODE_EAN128_CC) { - return ZINT_ERROR_TOO_LONG; - } else { - cc_mode = 3; - } - } - } + /* Decide on numeric, alpha or alphanumeric mode */ + /* Alpha mode is a special mode for AI 90 */ - if(cc_mode == 3) { /* If the data didn't fit in CC-B (and linear part is GS1-128) it is recalculated - for CC-C */ - i = cc_binary_string(symbol, reduced, binary_string, cc_mode, &cc_width, &ecc_level, linear->width); - if (i == ZINT_ERROR_TOO_LONG) { - return ZINT_ERROR_TOO_LONG; - } - } + if (alphanum > 0) { + /* Alphanumeric mode */ + concat(binary_string, "0"); + ai90_mode = 1; + } else { + if (alpha > numeric) { + /* Alphabetic mode */ + concat(binary_string, "11"); + ai90_mode = 2; + } else { + /* Numeric mode */ + concat(binary_string, "10"); + ai90_mode = 3; + } + } - switch(cc_mode) { /* Note that ecc_level is only relevant to CC-C */ - case 1: error_number = cc_a(symbol, binary_string, cc_width); break; - case 2: error_number = cc_b(symbol, binary_string, cc_width); break; - case 3: error_number = cc_c(symbol, binary_string, cc_width, ecc_level); break; - } + next_ai_posn = 2 + strlen(ninety); - if(error_number != 0) { - return ZINT_ERROR_ENCODING_PROBLEM; - } + if (source[next_ai_posn] == '[') { + /* There are more AIs afterwords */ + if ((source[next_ai_posn + 1] == '2') && (source[next_ai_posn + 2] == '1')) { + /* AI 21 follows */ + ai_crop = 1; + } - /* Merge the linear component with the 2D component */ + if ((source[next_ai_posn + 1] == '8') && (source[next_ai_posn + 2] == '0') && (source[next_ai_posn + 3] == '0') && (source[next_ai_posn + 4] == '4')) { + /* AI 8004 follows */ + ai_crop = 2; + } + } - top_shift = 0; - bottom_shift = 0; + switch (ai_crop) { + case 0: concat(binary_string, "0"); + break; + case 1: concat(binary_string, "10"); + break; + case 2: concat(binary_string, "11"); + break; + } - switch(symbol->symbology) { - /* Determine horizontal alignment (according to section 12.3) */ - case BARCODE_EANX_CC: - switch(pri_len) { - case 7: /* EAN-8 */ - case 10: /* EAN-8 + 2 */ - case 13: /* EAN-8 + 5 */ - bottom_shift = 13; - break; - case 12: /* EAN-13 */ - case 15: /* EAN-13 + 2 */ - case 18: /* EAN-13 + 5 */ - bottom_shift = 2; - break; - } - break; - case BARCODE_EAN128_CC: if(cc_mode == 3) { - bottom_shift = 7; - } - break; - case BARCODE_RSS14_CC: bottom_shift = 4; break; - case BARCODE_RSS_LTD_CC: bottom_shift = 9; break; - case BARCODE_RSS_EXP_CC: k = 1; - while((!(module_is_set(linear, 1, k - 1))) && module_is_set(linear, 1, k)) { - /* while((linear->encoded_data[1][k - 1] != '1') && (linear->encoded_data[1][k] != '0')) { */ - k++; - } - top_shift = k; - break; - case BARCODE_UPCA_CC: bottom_shift = 2; break; - case BARCODE_UPCE_CC: bottom_shift = 2; break; - case BARCODE_RSS14STACK_CC: top_shift = 1; break; - case BARCODE_RSS14_OMNI_CC: top_shift = 1; break; - case BARCODE_RSS_EXPSTACK_CC: k = 1; - while((!(module_is_set(linear, 1, k - 1))) && module_is_set(linear, 1, k)) { - /* while((linear->encoded_data[1][k - 1] != '1') && (linear->encoded_data[1][k] != '0')) { */ - k++; - } - top_shift = k; - break; - } + if (test1 == 0) { + strcpy(numeric_part, "0"); + } else { + for (i = 0; i < test1; i++) { + numeric_part[i] = ninety[i]; + } + numeric_part[i] = '\0'; + } - if(top_shift != 0) { - /* Move the 2d component of the symbol horizontally */ - for(i = 0; i <= symbol->rows; i++) { - for(j = (symbol->width + top_shift); j >= top_shift; j--) { - if(module_is_set(symbol, i, j - top_shift)) { set_module(symbol, i, j); } else { unset_module(symbol, i, j); } - } - for(j = 0; j < top_shift; j++) { - unset_module(symbol, i, j); - } - } - } + numeric_value = atoi(numeric_part); - /* Merge linear and 2D components into one structure */ - for(i = 0; i <= linear->rows; i++) { - symbol->row_height[symbol->rows + i] = linear->row_height[i]; - for(j = 0; j <= linear->width; j++) { - if(module_is_set(linear, i, j)) { set_module(symbol, i + symbol->rows, j + bottom_shift); } else { unset_module(symbol, i + symbol->rows, j + bottom_shift); } - } - } - if((linear->width + bottom_shift) > symbol->width) { - symbol->width = linear->width + bottom_shift; - } - if((symbol->width + top_shift) > symbol->width) { - symbol->width += top_shift; - } - symbol->rows += linear->rows; - ustrcpy(symbol->text, (unsigned char *)linear->text); + table3_letter = -1; + if (numeric_value < 31) { + switch (ninety[test1]) { + case 'B': table3_letter = 0; + break; + case 'D': table3_letter = 1; + break; + case 'H': table3_letter = 2; + break; + case 'I': table3_letter = 3; + break; + case 'J': table3_letter = 4; + break; + case 'K': table3_letter = 5; + break; + case 'L': table3_letter = 6; + break; + case 'N': table3_letter = 7; + break; + case 'P': table3_letter = 8; + break; + case 'Q': table3_letter = 9; + break; + case 'R': table3_letter = 10; + break; + case 'S': table3_letter = 11; + break; + case 'T': table3_letter = 12; + break; + case 'V': table3_letter = 13; + break; + case 'W': table3_letter = 14; + break; + case 'Z': table3_letter = 15; + break; + } + } - ZBarcode_Delete(linear); + if (table3_letter != -1) { + /* Encoding can be done according to 5.2.2 c) 2) */ + /* five bit binary string representing value before letter */ + mask = 0x10; + for (j = 0; j < 5; j++) { + if ((numeric_value & mask) == 0x00) { + concat(binary_string, "0"); + } else { + concat(binary_string, "1"); + } + mask = mask >> 1; + } - return error_number; + /* followed by four bit representation of letter from Table 3 */ + mask = 0x08; + for (j = 0; j < 4; j++) { + if ((table3_letter & mask) == 0x00) { + concat(binary_string, "0"); + } else { + concat(binary_string, "1"); + } + mask = mask >> 1; + } + } else { + /* Encoding is done according to 5.2.2 c) 3) */ + concat(binary_string, "11111"); + /* ten bit representation of number */ + mask = 0x200; + for (j = 0; j < 10; j++) { + if ((numeric_value & mask) == 0x00) { + concat(binary_string, "0"); + } else { + concat(binary_string, "1"); + } + mask = mask >> 1; + } + + /* five bit representation of ASCII character */ + mask = 0x10; + for (j = 0; j < 5; j++) { + if (((ninety[test1] - 65) & mask) == 0x00) { + concat(binary_string, "0"); + } else { + concat(binary_string, "1"); + } + mask = mask >> 1; + } + } + + read_posn = test1 + 3; + } else { + /* Use general field encodation instead */ + concat(binary_string, "0"); + read_posn = 0; + } + } + + /* Now encode the rest of the AI 90 data field */ + if (ai90_mode == 2) { + /* Alpha encodation (section 5.2.3) */ + do { + if ((source[read_posn] >= '0') && (source[read_posn] <= '9')) { + mask = 0x10; + for (j = 0; j < 5; j++) { + if (((source[read_posn] + 4) & mask) == 0x00) { + concat(binary_string, "0"); + } else { + concat(binary_string, "1"); + } + mask = mask >> 1; + } + } + + if ((source[read_posn] >= 'A') && (source[read_posn] <= 'Z')) { + mask = 0x20; + for (j = 0; j < 6; j++) { + if (((source[read_posn] - 65) & mask) == 0x00) { + concat(binary_string, "0"); + } else { + concat(binary_string, "1"); + } + mask = mask >> 1; + } + } + + if (source[read_posn] == '[') { + concat(binary_string, "11111"); + } + + read_posn++; + } while ((source[read_posn - 1] != '[') && (source[read_posn - 1] != '\0')); + alpha_pad = 1; /* This is overwritten if a general field is encoded */ + } + + if (ai90_mode == 1) { + /* Alphanumeric mode */ + do { + if ((source[read_posn] >= '0') && (source[read_posn] <= '9')) { + mask = 0x10; + for (j = 0; j < 5; j++) { + if (((source[read_posn] - 43) & mask) == 0x00) { + concat(binary_string, "0"); + } else { + concat(binary_string, "1"); + } + mask = mask >> 1; + } + } + + if ((source[read_posn] >= 'A') && (source[read_posn] <= 'Z')) { + mask = 0x20; + for (j = 0; j < 6; j++) { + if (((source[read_posn] - 33) & mask) == 0x00) { + concat(binary_string, "0"); + } else { + concat(binary_string, "1"); + } + mask = mask >> 1; + } + } + + switch (source[read_posn]) { + case '[': concat(binary_string, "01111"); + break; + case '*': concat(binary_string, "111010"); + break; + case ',': concat(binary_string, "111011"); + break; + case '-': concat(binary_string, "111100"); + break; + case '.': concat(binary_string, "111101"); + break; + case '/': concat(binary_string, "111110"); + break; + } + + read_posn++; + } while ((source[read_posn - 1] != '[') && (source[read_posn - 1] != '\0')); + } + + read_posn += (2 * ai_crop); + + /* The compressed data field has been processed if appropriate - the + rest of the data (if any) goes into a general-purpose data compaction field */ + + j = 0; + if (fnc1_latch == 1) { + /* Encodation method "10" has been used but it is not followed by + AI 10, so a FNC1 character needs to be added */ + general_field[j] = '['; + j++; + } + + for (i = read_posn; i < strlen(source); i++) { + general_field[j] = source[i]; + j++; + } + general_field[j] = '\0'; + + if (strlen(general_field) != 0) { + alpha_pad = 0; + } + + latch = 0; + for (i = 0; i < strlen(general_field); i++) { + /* Table 13 - ISO/IEC 646 encodation */ + if ((general_field[i] < ' ') || (general_field[i] > 'z')) { + general_field_type[i] = INVALID_CHAR; + latch = 1; + } else { + general_field_type[i] = ISOIEC; + } + + if (general_field[i] == '#') { + general_field_type[i] = INVALID_CHAR; + latch = 1; + } + if (general_field[i] == '$') { + general_field_type[i] = INVALID_CHAR; + latch = 1; + } + if (general_field[i] == '@') { + general_field_type[i] = INVALID_CHAR; + latch = 1; + } + if (general_field[i] == 92) { + general_field_type[i] = INVALID_CHAR; + latch = 1; + } + if (general_field[i] == '^') { + general_field_type[i] = INVALID_CHAR; + latch = 1; + } + if (general_field[i] == 96) { + general_field_type[i] = INVALID_CHAR; + latch = 1; + } + + /* Table 12 - Alphanumeric encodation */ + if ((general_field[i] >= 'A') && (general_field[i] <= 'Z')) { + general_field_type[i] = ALPHA_OR_ISO; + } + if (general_field[i] == '*') { + general_field_type[i] = ALPHA_OR_ISO; + } + if (general_field[i] == ',') { + general_field_type[i] = ALPHA_OR_ISO; + } + if (general_field[i] == '-') { + general_field_type[i] = ALPHA_OR_ISO; + } + if (general_field[i] == '.') { + general_field_type[i] = ALPHA_OR_ISO; + } + if (general_field[i] == '/') { + general_field_type[i] = ALPHA_OR_ISO; + } + + /* Numeric encodation */ + if ((general_field[i] >= '0') && (general_field[i] <= '9')) { + general_field_type[i] = ANY_ENC; + } + if (general_field[i] == '[') { + /* FNC1 can be encoded in any system */ + general_field_type[i] = ANY_ENC; + } + + } + + general_field_type[strlen(general_field)] = '\0'; + + if (latch == 1) { + /* Invalid characters in input data */ + strcpy(symbol->errtxt, "Invalid characters in input data"); + return ZINT_ERROR_INVALID_DATA; + } + + for (i = 0; i < strlen(general_field); i++) { + if ((general_field_type[i] == ISOIEC) && (general_field[i + 1] == '[')) { + general_field_type[i + 1] = ISOIEC; + } + } + + for (i = 0; i < strlen(general_field); i++) { + if ((general_field_type[i] == ALPHA_OR_ISO) && (general_field[i + 1] == '[')) { + general_field_type[i + 1] = ALPHA_OR_ISO; + } + } + + latch = general_rules(general_field, general_field_type); + + i = 0; + do { + switch (general_field_type[i]) { + case NUMERIC: + + if (i != 0) { + if ((general_field_type[i - 1] != NUMERIC) && (general_field[i - 1] != '[')) { + concat(binary_string, "000"); /* Numeric latch */ + } + } + + if (general_field[i] != '[') { + d1 = ctoi(general_field[i]); + } else { + d1 = 10; + } + + if (general_field[i + 1] != '[') { + d2 = ctoi(general_field[i + 1]); + } else { + d2 = 10; + } + + value = (11 * d1) + d2 + 8; + + mask = 0x40; + for (j = 0; j < 7; j++) { + if ((value & mask) == 0x00) { + concat(binary_string, "0"); + } else { + concat(binary_string, "1"); + } + mask = mask >> 1; + } + + i += 2; + break; + + case ALPHA: + + if (i != 0) { + if ((general_field_type[i - 1] == NUMERIC) || (general_field[i - 1] == '[')) { + concat(binary_string, "0000"); /* Alphanumeric latch */ + } + if (general_field_type[i - 1] == ISOIEC) { + concat(binary_string, "00100"); /* ISO/IEC 646 latch */ + } + } + + if ((general_field[i] >= '0') && (general_field[i] <= '9')) { + + value = general_field[i] - 43; + + mask = 0x10; + for (j = 0; j < 5; j++) { + if ((value & mask) == 0x00) { + concat(binary_string, "0"); + } else { + concat(binary_string, "1"); + } + mask = mask >> 1; + } + } + + if ((general_field[i] >= 'A') && (general_field[i] <= 'Z')) { + + value = general_field[i] - 33; + + mask = 0x20; + for (j = 0; j < 6; j++) { + if ((value & mask) == 0x00) { + concat(binary_string, "0"); + } else { + concat(binary_string, "1"); + } + mask = mask >> 1; + } + } + + if (general_field[i] == '[') concat(binary_string, "01111"); /* FNC1/Numeric latch */ + if (general_field[i] == '*') concat(binary_string, "111010"); /* asterisk */ + if (general_field[i] == ',') concat(binary_string, "111011"); /* comma */ + if (general_field[i] == '-') concat(binary_string, "111100"); /* minus or hyphen */ + if (general_field[i] == '.') concat(binary_string, "111101"); /* period or full stop */ + if (general_field[i] == '/') concat(binary_string, "111110"); /* slash or solidus */ + + i++; + break; + + case ISOIEC: + + if (i != 0) { + if ((general_field_type[i - 1] == NUMERIC) || (general_field[i - 1] == '[')) { + concat(binary_string, "0000"); /* Alphanumeric latch */ + concat(binary_string, "00100"); /* ISO/IEC 646 latch */ + } + if (general_field_type[i - 1] == ALPHA) { + concat(binary_string, "00100"); /* ISO/IEC 646 latch */ + } + } + + if ((general_field[i] >= '0') && (general_field[i] <= '9')) { + + value = general_field[i] - 43; + + mask = 0x10; + for (j = 0; j < 5; j++) { + if ((value & mask) == 0x00) { + concat(binary_string, "0"); + } else { + concat(binary_string, "1"); + } + mask = mask >> 1; + } + } + + if ((general_field[i] >= 'A') && (general_field[i] <= 'Z')) { + + value = general_field[i] - 1; + + mask = 0x40; + for (j = 0; j < 7; j++) { + if ((value & mask) == 0x00) { + concat(binary_string, "0"); + } else { + concat(binary_string, "1"); + } + mask = mask >> 1; + } + } + + if ((general_field[i] >= 'a') && (general_field[i] <= 'z')) { + + value = general_field[i] - 7; + + mask = 0x40; + for (j = 0; j < 7; j++) { + if ((value & mask) == 0x00) { + concat(binary_string, "0"); + } else { + concat(binary_string, "1"); + } + mask = mask >> 1; + } + } + + if (general_field[i] == '[') concat(binary_string, "01111"); /* FNC1/Numeric latch */ + if (general_field[i] == '!') concat(binary_string, "11101000"); /* exclamation mark */ + if (general_field[i] == 34) concat(binary_string, "11101001"); /* quotation mark */ + if (general_field[i] == 37) concat(binary_string, "11101010"); /* percent sign */ + if (general_field[i] == '&') concat(binary_string, "11101011"); /* ampersand */ + if (general_field[i] == 39) concat(binary_string, "11101100"); /* apostrophe */ + if (general_field[i] == '(') concat(binary_string, "11101101"); /* left parenthesis */ + if (general_field[i] == ')') concat(binary_string, "11101110"); /* right parenthesis */ + if (general_field[i] == '*') concat(binary_string, "11101111"); /* asterisk */ + if (general_field[i] == '+') concat(binary_string, "11110000"); /* plus sign */ + if (general_field[i] == ',') concat(binary_string, "11110001"); /* comma */ + if (general_field[i] == '-') concat(binary_string, "11110010"); /* minus or hyphen */ + if (general_field[i] == '.') concat(binary_string, "11110011"); /* period or full stop */ + if (general_field[i] == '/') concat(binary_string, "11110100"); /* slash or solidus */ + if (general_field[i] == ':') concat(binary_string, "11110101"); /* colon */ + if (general_field[i] == ';') concat(binary_string, "11110110"); /* semicolon */ + if (general_field[i] == '<') concat(binary_string, "11110111"); /* less-than sign */ + if (general_field[i] == '=') concat(binary_string, "11111000"); /* equals sign */ + if (general_field[i] == '>') concat(binary_string, "11111001"); /* greater-than sign */ + if (general_field[i] == '?') concat(binary_string, "11111010"); /* question mark */ + if (general_field[i] == '_') concat(binary_string, "11111011"); /* underline or low line */ + if (general_field[i] == ' ') concat(binary_string, "11111100"); /* space */ + + i++; + break; + } + } while (i + latch < strlen(general_field)); + + binary_length = strlen(binary_string); + if (cc_mode == 1) { + /* CC-A 2D component - calculate remaining space */ + switch (*(cc_width)) { + case 2: + if (binary_length > 167) { + return ZINT_ERROR_TOO_LONG; + } + if (binary_length <= 167) { + target_bitsize = 167; + } + if (binary_length <= 138) { + target_bitsize = 138; + } + if (binary_length <= 118) { + target_bitsize = 118; + } + if (binary_length <= 108) { + target_bitsize = 108; + } + if (binary_length <= 88) { + target_bitsize = 88; + } + if (binary_length <= 78) { + target_bitsize = 78; + } + if (binary_length <= 59) { + target_bitsize = 59; + } + break; + case 3: + if (binary_length > 167) { + return ZINT_ERROR_TOO_LONG; + } + if (binary_length <= 167) { + target_bitsize = 167; + } + if (binary_length <= 138) { + target_bitsize = 138; + } + if (binary_length <= 118) { + target_bitsize = 118; + } + if (binary_length <= 98) { + target_bitsize = 98; + } + if (binary_length <= 78) { + target_bitsize = 78; + } + break; + case 4: + if (binary_length > 197) { + return ZINT_ERROR_TOO_LONG; + } + if (binary_length <= 197) { + target_bitsize = 197; + } + if (binary_length <= 167) { + target_bitsize = 167; + } + if (binary_length <= 138) { + target_bitsize = 138; + } + if (binary_length <= 108) { + target_bitsize = 108; + } + if (binary_length <= 78) { + target_bitsize = 78; + } + break; + } + } + + if (cc_mode == 2) { + /* CC-B 2D component - calculated from ISO/IEC 24728 Table 1 */ + switch (*(cc_width)) { + case 2: + if (binary_length > 336) { + return ZINT_ERROR_TOO_LONG; + } + if (binary_length <= 336) { + target_bitsize = 336; + } + if (binary_length <= 296) { + target_bitsize = 296; + } + if (binary_length <= 256) { + target_bitsize = 256; + } + if (binary_length <= 208) { + target_bitsize = 208; + } + if (binary_length <= 160) { + target_bitsize = 160; + } + if (binary_length <= 104) { + target_bitsize = 104; + } + if (binary_length <= 56) { + target_bitsize = 56; + } + break; + case 3: + if (binary_length > 768) { + return ZINT_ERROR_TOO_LONG; + } + if (binary_length <= 768) { + target_bitsize = 768; + } + if (binary_length <= 648) { + target_bitsize = 648; + } + if (binary_length <= 536) { + target_bitsize = 536; + } + if (binary_length <= 416) { + target_bitsize = 416; + } + if (binary_length <= 304) { + target_bitsize = 304; + } + if (binary_length <= 208) { + target_bitsize = 208; + } + if (binary_length <= 152) { + target_bitsize = 152; + } + if (binary_length <= 112) { + target_bitsize = 112; + } + if (binary_length <= 72) { + target_bitsize = 72; + } + if (binary_length <= 32) { + target_bitsize = 32; + } + break; + case 4: + if (binary_length > 1184) { + return ZINT_ERROR_TOO_LONG; + } + if (binary_length <= 1184) { + target_bitsize = 1184; + } + if (binary_length <= 1016) { + target_bitsize = 1016; + } + if (binary_length <= 840) { + target_bitsize = 840; + } + if (binary_length <= 672) { + target_bitsize = 672; + } + if (binary_length <= 496) { + target_bitsize = 496; + } + if (binary_length <= 352) { + target_bitsize = 352; + } + if (binary_length <= 264) { + target_bitsize = 264; + } + if (binary_length <= 208) { + target_bitsize = 208; + } + if (binary_length <= 152) { + target_bitsize = 152; + } + if (binary_length <= 96) { + target_bitsize = 96; + } + if (binary_length <= 56) { + target_bitsize = 56; + } + break; + } + } + + if (cc_mode == 3) { + /* CC-C 2D Component is a bit more complex! */ + int byte_length, codewords_used, ecc_level, ecc_codewords, rows; + int codewords_total, target_codewords, target_bytesize; + + byte_length = binary_length / 8; + if (binary_length % 8 != 0) { + byte_length++; + } + + codewords_used = (byte_length / 6) * 5; + codewords_used += byte_length % 6; + + ecc_level = 7; + if (codewords_used <= 1280) { + ecc_level = 6; + } + if (codewords_used <= 640) { + ecc_level = 5; + } + if (codewords_used <= 320) { + ecc_level = 4; + } + if (codewords_used <= 160) { + ecc_level = 3; + } + if (codewords_used <= 40) { + ecc_level = 2; + } + *(ecc) = ecc_level; + ecc_codewords = 1; + for (i = 1; i <= (ecc_level + 1); i++) { + ecc_codewords *= 2; + } + + codewords_used += ecc_codewords; + codewords_used += 3; + + if (codewords_used > symbol->option_3) { + return ZINT_ERROR_TOO_LONG; + } + + *(cc_width) = (lin_width - 62) / 17; + if ((codewords_used / *(cc_width)) > 90) { + /* stop the symbol from becoming too high */ + *(cc_width) = *(cc_width) + 1; + } + + rows = codewords_used / *(cc_width); + if (codewords_used % *(cc_width) != 0) { + rows++; + } + + codewords_total = *(cc_width) * rows; + + target_codewords = codewords_total - ecc_codewords; + target_codewords -= 3; + + target_bytesize = 6 * (target_codewords / 5); + target_bytesize += target_codewords % 5; + + target_bitsize = 8 * target_bytesize; + } + + remainder = binary_length - target_bitsize; + + if (latch == 1) { + i = 0; + /* There is still one more numeric digit to encode */ + + if ((remainder >= 4) && (remainder <= 6)) { + d1 = ctoi(general_field[i]); + d1++; + + mask = 0x08; + for (j = 0; j < 4; j++) { + if ((value & mask) == 0x00) { + concat(binary_string, "0"); + } else { + concat(binary_string, "1"); + } + mask = mask >> 1; + } + } else { + d1 = ctoi(general_field[i]); + d2 = 10; + + value = (11 * d1) + d2 + 8; + + mask = 0x40; + for (j = 0; j < 7; j++) { + if ((value & mask) == 0x00) { + concat(binary_string, "0"); + } else { + concat(binary_string, "1"); + } + mask = mask >> 1; + } + /* This may push the symbol up to the next size */ + } + } + + if (strlen(binary_string) > 11805) { /* (2361 * 5) */ + strcpy(symbol->errtxt, "Input too long"); + return ZINT_ERROR_TOO_LONG; + } + + /* all the code below is repeated from above - it needs to be calculated again because the + size of the symbol may have changed when adding data in the above sequence */ + + binary_length = strlen(binary_string); + if (cc_mode == 1) { + /* CC-A 2D component - calculate padding required */ + switch (*(cc_width)) { + case 2: + if (binary_length > 167) { + return ZINT_ERROR_TOO_LONG; + } + if (binary_length <= 167) { + target_bitsize = 167; + } + if (binary_length <= 138) { + target_bitsize = 138; + } + if (binary_length <= 118) { + target_bitsize = 118; + } + if (binary_length <= 108) { + target_bitsize = 108; + } + if (binary_length <= 88) { + target_bitsize = 88; + } + if (binary_length <= 78) { + target_bitsize = 78; + } + if (binary_length <= 59) { + target_bitsize = 59; + } + break; + case 3: + if (binary_length > 167) { + return ZINT_ERROR_TOO_LONG; + } + if (binary_length <= 167) { + target_bitsize = 167; + } + if (binary_length <= 138) { + target_bitsize = 138; + } + if (binary_length <= 118) { + target_bitsize = 118; + } + if (binary_length <= 98) { + target_bitsize = 98; + } + if (binary_length <= 78) { + target_bitsize = 78; + } + break; + case 4: + if (binary_length > 197) { + return ZINT_ERROR_TOO_LONG; + } + if (binary_length <= 197) { + target_bitsize = 197; + } + if (binary_length <= 167) { + target_bitsize = 167; + } + if (binary_length <= 138) { + target_bitsize = 138; + } + if (binary_length <= 108) { + target_bitsize = 108; + } + if (binary_length <= 78) { + target_bitsize = 78; + } + break; + } + } + + if (cc_mode == 2) { + /* CC-B 2D component */ + switch (*(cc_width)) { + case 2: + if (binary_length > 336) { + return ZINT_ERROR_TOO_LONG; + } + if (binary_length <= 336) { + target_bitsize = 336; + } + if (binary_length <= 296) { + target_bitsize = 296; + } + if (binary_length <= 256) { + target_bitsize = 256; + } + if (binary_length <= 208) { + target_bitsize = 208; + } + if (binary_length <= 160) { + target_bitsize = 160; + } + if (binary_length <= 104) { + target_bitsize = 104; + } + if (binary_length <= 56) { + target_bitsize = 56; + } + break; + case 3: + if (binary_length > 768) { + return ZINT_ERROR_TOO_LONG; + } + if (binary_length <= 768) { + target_bitsize = 768; + } + if (binary_length <= 648) { + target_bitsize = 648; + } + if (binary_length <= 536) { + target_bitsize = 536; + } + if (binary_length <= 416) { + target_bitsize = 416; + } + if (binary_length <= 304) { + target_bitsize = 304; + } + if (binary_length <= 208) { + target_bitsize = 208; + } + if (binary_length <= 152) { + target_bitsize = 152; + } + if (binary_length <= 112) { + target_bitsize = 112; + } + if (binary_length <= 72) { + target_bitsize = 72; + } + if (binary_length <= 32) { + target_bitsize = 32; + } + break; + case 4: + if (binary_length > 1184) { + return ZINT_ERROR_TOO_LONG; + } + if (binary_length <= 1184) { + target_bitsize = 1184; + } + if (binary_length <= 1016) { + target_bitsize = 1016; + } + if (binary_length <= 840) { + target_bitsize = 840; + } + if (binary_length <= 672) { + target_bitsize = 672; + } + if (binary_length <= 496) { + target_bitsize = 496; + } + if (binary_length <= 352) { + target_bitsize = 352; + } + if (binary_length <= 264) { + target_bitsize = 264; + } + if (binary_length <= 208) { + target_bitsize = 208; + } + if (binary_length <= 152) { + target_bitsize = 152; + } + if (binary_length <= 96) { + target_bitsize = 96; + } + if (binary_length <= 56) { + target_bitsize = 56; + } + break; + } + } + + if (cc_mode == 3) { + /* CC-C 2D Component is a bit more complex! */ + int byte_length, codewords_used, ecc_level, ecc_codewords, rows; + int codewords_total, target_codewords, target_bytesize; + + byte_length = binary_length / 8; + if (binary_length % 8 != 0) { + byte_length++; + } + + codewords_used = (byte_length / 6) * 5; + codewords_used += byte_length % 6; + + ecc_level = 7; + if (codewords_used <= 1280) { + ecc_level = 6; + } + if (codewords_used <= 640) { + ecc_level = 5; + } + if (codewords_used <= 320) { + ecc_level = 4; + } + if (codewords_used <= 160) { + ecc_level = 3; + } + if (codewords_used <= 40) { + ecc_level = 2; + } + *(ecc) = ecc_level; + ecc_codewords = 1; + for (i = 1; i <= (ecc_level + 1); i++) { + ecc_codewords *= 2; + } + + codewords_used += ecc_codewords; + codewords_used += 3; + + if (codewords_used > symbol->option_3) { + return ZINT_ERROR_TOO_LONG; + } + + *(cc_width) = (lin_width - 62) / 17; + if ((codewords_used / *(cc_width)) > 90) { + /* stop the symbol from becoming too high */ + *(cc_width) = *(cc_width) + 1; + } + + rows = codewords_used / *(cc_width); + if (codewords_used % *(cc_width) != 0) { + rows++; + } + + codewords_total = *(cc_width) * rows; + + target_codewords = codewords_total - ecc_codewords; + target_codewords -= 3; + + target_bytesize = 6 * (target_codewords / 5); + target_bytesize += target_codewords % 5; + + target_bitsize = 8 * target_bytesize; + } + + if (binary_length < target_bitsize) { + /* Now add padding to binary string */ + if (alpha_pad == 1) { + concat(binary_string, "11111"); + alpha_pad = 0; + /* Extra FNC1 character required after Alpha encodation (section 5.2.3) */ + } + + if ((strlen(general_field) != 0) && (general_field_type[strlen(general_field) - 1] == NUMERIC)) { + concat(binary_string, "0000"); + } + + while (strlen(binary_string) < target_bitsize) { + concat(binary_string, "00100"); + } + + if (strlen(binary_string) > target_bitsize) { + binary_string[target_bitsize] = '\0'; + } + } + + return 0; +} + +void add_leading_zeroes(struct zint_symbol *symbol) { + int with_addon = 0; + int first_len = 0, second_len = 0, zfirst_len = 0, zsecond_len = 0, i, h, n = 0; + + h = strlen(symbol->primary); + for (i = 0; i < h; i++) { + if (symbol->primary[i] == '+') { + with_addon = 1; + } else { + if (with_addon == 0) { + first_len++; + } else { + second_len++; + } + } + } + + /* Calculate target lengths */ + if (first_len <= 12) { + zfirst_len = 12; + } + if (first_len <= 7) { + zfirst_len = 7; + } + if (second_len <= 5) { + zsecond_len = 5; + } + if (second_len <= 2) { + zsecond_len = 2; + } + if (second_len == 0) { + zsecond_len = 0; + } + + /* Add leading zeroes */ + n = zfirst_len - first_len; + if (n > 0) { + memmove(symbol->primary + n, symbol->primary, h); + memset(symbol->primary, '0', n); + } + n += first_len + 1; + if (zsecond_len) { + memmove(symbol->primary + n + zsecond_len, symbol->primary + n, second_len); + memset(symbol->primary + n, '0', zsecond_len); + n += zsecond_len + second_len; + } + symbol->primary[n] = '\0'; +} + +int composite(struct zint_symbol *symbol, unsigned char source[], int length) { + int error_number, cc_mode, cc_width, ecc_level; + int j, i, k; + unsigned int rs = length + 1; + unsigned int bs = 20 * rs; + unsigned int pri_len; +#ifndef _MSC_VER + char reduced[rs]; + char binary_string[bs]; +#else + char* reduced = (char*) _alloca(rs); + char* binary_string = (char*) _alloca(bs); +#endif + struct zint_symbol *linear; + int top_shift, bottom_shift; + + error_number = 0; + pri_len = strlen(symbol->primary); + if (pri_len == 0) { + strcpy(symbol->errtxt, "No primary (linear) message in 2D composite"); + return ZINT_ERROR_INVALID_OPTION; + } + + if (length > 2990) { + strcpy(symbol->errtxt, "2D component input data too long"); + return ZINT_ERROR_TOO_LONG; + } + + linear = ZBarcode_Create(); /* Symbol contains the 2D component and Linear contains the rest */ + + error_number = gs1_verify(symbol, source, length, reduced); + if (error_number != 0) { + return error_number; + } + + cc_mode = symbol->option_1; + + if ((cc_mode == 3) && (symbol->symbology != BARCODE_EAN128_CC)) { + /* CC-C can only be used with a GS1-128 linear part */ + strcpy(symbol->errtxt, "Invalid mode (CC-C only valid with GS1-128 linear component)"); + return ZINT_ERROR_INVALID_OPTION; + } + + linear->symbology = symbol->symbology; + + if (linear->symbology != BARCODE_EAN128_CC) { + /* Set the "component linkage" flag in the linear component */ + linear->option_1 = 2; + } else { + /* GS1-128 needs to know which type of 2D component is used */ + linear->option_1 = cc_mode; + } + + switch (symbol->symbology) { + case BARCODE_EANX_CC: error_number = eanx(linear, (unsigned char *) symbol->primary, pri_len); + break; + case BARCODE_EAN128_CC: error_number = ean_128(linear, (unsigned char *) symbol->primary, pri_len); + break; + case BARCODE_RSS14_CC: error_number = rss14(linear, (unsigned char *) symbol->primary, pri_len); + break; + case BARCODE_RSS_LTD_CC: error_number = rsslimited(linear, (unsigned char *) symbol->primary, pri_len); + break; + case BARCODE_RSS_EXP_CC: error_number = rssexpanded(linear, (unsigned char *) symbol->primary, pri_len); + break; + case BARCODE_UPCA_CC: error_number = eanx(linear, (unsigned char *) symbol->primary, pri_len); + break; + case BARCODE_UPCE_CC: error_number = eanx(linear, (unsigned char *) symbol->primary, pri_len); + break; + case BARCODE_RSS14STACK_CC: error_number = rss14(linear, (unsigned char *) symbol->primary, pri_len); + break; + case BARCODE_RSS14_OMNI_CC: error_number = rss14(linear, (unsigned char *) symbol->primary, pri_len); + break; + case BARCODE_RSS_EXPSTACK_CC: error_number = rssexpanded(linear, (unsigned char *) symbol->primary, pri_len); + break; + } + + if (error_number != 0) { + strcpy(symbol->errtxt, linear->errtxt); + concat(symbol->errtxt, " in linear component"); + return error_number; + } + + switch (symbol->symbology) { + /* Determine width of 2D component according to ISO/IEC 24723 Table 1 */ + case BARCODE_EANX_CC: + switch (pri_len) { + case 7: /* EAN-8 */ + case 10: /* EAN-8 + 2 */ + case 13: /* EAN-8 + 5 */ + cc_width = 3; + break; + case 12: /* EAN-13 */ + case 15: /* EAN-13 + 2 */ + case 18: /* EAN-13 + 5 */ + cc_width = 4; + break; + } + break; + case BARCODE_EAN128_CC: cc_width = 4; + break; + case BARCODE_RSS14_CC: cc_width = 4; + break; + case BARCODE_RSS_LTD_CC: cc_width = 3; + break; + case BARCODE_RSS_EXP_CC: cc_width = 4; + break; + case BARCODE_UPCA_CC: cc_width = 4; + break; + case BARCODE_UPCE_CC: cc_width = 2; + break; + case BARCODE_RSS14STACK_CC: cc_width = 2; + break; + case BARCODE_RSS14_OMNI_CC: cc_width = 2; + break; + case BARCODE_RSS_EXPSTACK_CC: cc_width = 4; + break; + } + + memset(binary_string, 0, bs); + + if (cc_mode < 1 || cc_mode > 3) { + cc_mode = 1; + } + + if (cc_mode == 1) { + i = cc_binary_string(symbol, reduced, binary_string, cc_mode, &cc_width, &ecc_level, linear->width); + if (i == ZINT_ERROR_TOO_LONG) { + cc_mode = 2; + } + } + + if (cc_mode == 2) { + /* If the data didn't fit into CC-A it is recalculated for CC-B */ + i = cc_binary_string(symbol, reduced, binary_string, cc_mode, &cc_width, &ecc_level, linear->width); + if (i == ZINT_ERROR_TOO_LONG) { + if (symbol->symbology != BARCODE_EAN128_CC) { + return ZINT_ERROR_TOO_LONG; + } else { + cc_mode = 3; + } + } + } + + if (cc_mode == 3) { + /* If the data didn't fit in CC-B (and linear part is GS1-128) it is recalculated for CC-C */ + i = cc_binary_string(symbol, reduced, binary_string, cc_mode, &cc_width, &ecc_level, linear->width); + if (i == ZINT_ERROR_TOO_LONG) { + return ZINT_ERROR_TOO_LONG; + } + } + + switch (cc_mode) { + /* Note that ecc_level is only relevant to CC-C */ + case 1: error_number = cc_a(symbol, binary_string, cc_width); + break; + case 2: error_number = cc_b(symbol, binary_string, cc_width); + break; + case 3: error_number = cc_c(symbol, binary_string, cc_width, ecc_level); + break; + } + + if (error_number != 0) { + return ZINT_ERROR_ENCODING_PROBLEM; + } + + /* Merge the linear component with the 2D component */ + + top_shift = 0; + bottom_shift = 0; + + switch (symbol->symbology) { + /* Determine horizontal alignment (according to section 12.3) */ + case BARCODE_EANX_CC: + switch (pri_len) { + case 7: /* EAN-8 */ + case 10: /* EAN-8 + 2 */ + case 13: /* EAN-8 + 5 */ + bottom_shift = 13; + break; + case 12: /* EAN-13 */ + case 15: /* EAN-13 + 2 */ + case 18: /* EAN-13 + 5 */ + bottom_shift = 2; + break; + } + break; + case BARCODE_EAN128_CC: if (cc_mode == 3) { + bottom_shift = 7; + } + break; + case BARCODE_RSS14_CC: bottom_shift = 4; + break; + case BARCODE_RSS_LTD_CC: bottom_shift = 9; + break; + case BARCODE_RSS_EXP_CC: k = 1; + while ((!(module_is_set(linear, 1, k - 1))) && module_is_set(linear, 1, k)) { + k++; + } + top_shift = k; + break; + case BARCODE_UPCA_CC: bottom_shift = 2; + break; + case BARCODE_UPCE_CC: bottom_shift = 2; + break; + case BARCODE_RSS14STACK_CC: top_shift = 1; + break; + case BARCODE_RSS14_OMNI_CC: top_shift = 1; + break; + case BARCODE_RSS_EXPSTACK_CC: k = 1; + while ((!(module_is_set(linear, 1, k - 1))) && module_is_set(linear, 1, k)) { + k++; + } + top_shift = k; + break; + } + + if (top_shift != 0) { + /* Move the 2d component of the symbol horizontally */ + for (i = 0; i <= symbol->rows; i++) { + for (j = (symbol->width + top_shift); j >= top_shift; j--) { + if (module_is_set(symbol, i, j - top_shift)) { + set_module(symbol, i, j); + } else { + unset_module(symbol, i, j); + } + } + for (j = 0; j < top_shift; j++) { + unset_module(symbol, i, j); + } + } + } + + /* Merge linear and 2D components into one structure */ + for (i = 0; i <= linear->rows; i++) { + symbol->row_height[symbol->rows + i] = linear->row_height[i]; + for (j = 0; j <= linear->width; j++) { + if (module_is_set(linear, i, j)) { + set_module(symbol, i + symbol->rows, j + bottom_shift); + } else { + unset_module(symbol, i + symbol->rows, j + bottom_shift); + } + } + } + if ((linear->width + bottom_shift) > symbol->width) { + symbol->width = linear->width + bottom_shift; + } + if ((symbol->width + top_shift) > symbol->width) { + symbol->width += top_shift; + } + symbol->rows += linear->rows; + ustrcpy(symbol->text, (unsigned char *) linear->text); + + ZBarcode_Delete(linear); + + return error_number; } diff --git a/backend/composite.h b/backend/composite.h index 6cdf8332..ac86ee0b 100644 --- a/backend/composite.h +++ b/backend/composite.h @@ -2,20 +2,20 @@ /* libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart + Copyright (C) 2008-2016 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. + documentation and/or other materials provided with the distribution. 3. Neither the name of the project nor the names of its contributors may be used to endorse or promote products derived from this software - without specific prior written permission. + without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -26,9 +26,9 @@ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + */ #define NUMERIC 110 #define ALPHA 97 @@ -39,35 +39,35 @@ /* CC-A component coefficients from ISO/IEC 24728:2006 Annex F */ static const int ccaCoeffs[30] = { - /* k = 4 */ - 522, 568, 723, 809, + /* k = 4 */ + 522, 568, 723, 809, - /* k = 5 */ - 427, 919, 460, 155, 566, + /* k = 5 */ + 427, 919, 460, 155, 566, - /* k = 6 */ - 861, 285, 19, 803, 17, 766, + /* k = 6 */ + 861, 285, 19, 803, 17, 766, - /* k = 7 */ - 76, 925, 537, 597, 784, 691, 437, + /* k = 7 */ + 76, 925, 537, 597, 784, 691, 437, - /* k = 8 */ - 237, 308, 436, 284, 646, 653, 428, 379 + /* k = 8 */ + 237, 308, 436, 284, 646, 653, 428, 379 }; /* rows, error codewords, k-offset of valid CC-A sizes from ISO/IEC 24723:2006 Table 9 */ static const int ccaVariants[51] = { - 5, 6, 7, 8, 9, 10, 12, 4, 5, 6, 7, 8, 3, 4, 5, 6, 7, - 4, 4, 5, 5, 6, 6, 7, 4, 5, 6, 7, 7, 4, 5, 6, 7, 8, - 0, 0, 4, 4, 9, 9, 15, 0, 4, 9, 15, 15, 0, 4, 9, 15, 22 + 5, 6, 7, 8, 9, 10, 12, 4, 5, 6, 7, 8, 3, 4, 5, 6, 7, + 4, 4, 5, 5, 6, 6, 7, 4, 5, 6, 7, 7, 4, 5, 6, 7, 8, + 0, 0, 4, 4, 9, 9, 15, 0, 4, 9, 15, 15, 0, 4, 9, 15, 22 }; /* following is Left RAP, Centre RAP, Right RAP and Start Cluster from ISO/IEC 24723:2006 tables 10 and 11 */ static const int aRAPTable[68] = { - 39, 1, 32, 8, 14, 43, 20, 11, 1, 5, 15, 21, 40, 43, 46, 34, 29, - 0, 0, 0, 0, 0, 0, 0, 43, 33, 37, 47, 1, 20, 23, 26, 14, 9, - 19, 33, 12, 40, 46, 23, 52, 23, 13, 17, 27, 33, 52, 3, 6, 46, 41, - 6, 0, 3, 3, 3, 0, 3, 3, 0, 3, 6, 6, 0, 0, 0, 0, 3 + 39, 1, 32, 8, 14, 43, 20, 11, 1, 5, 15, 21, 40, 43, 46, 34, 29, + 0, 0, 0, 0, 0, 0, 0, 43, 33, 37, 47, 1, 20, 23, 26, 14, 9, + 19, 33, 12, 40, 46, 23, 52, 23, 13, 17, 27, 33, 52, 3, 6, 46, 41, + 6, 0, 3, 3, 3, 0, 3, 3, 0, 3, 6, 6, 0, 0, 0, 0, 3 }; /* Row Address Patterns are as defined in pdf417.h */ diff --git a/backend/dmatrix.c b/backend/dmatrix.c index ee27c993..89c7521f 100755 --- a/backend/dmatrix.c +++ b/backend/dmatrix.c @@ -2,28 +2,28 @@ /* libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart - + Copyright (C) 2009-2016 Robin Stuart + developed from and including some functions from: - IEC16022 bar code generation - Adrian Kennard, Andrews & Arnold Ltd - with help from Cliff Hones on the RS coding - - (c) 2004 Adrian Kennard, Andrews & Arnold Ltd - (c) 2006 Stefan Schmidt + IEC16022 bar code generation + Adrian Kennard, Andrews & Arnold Ltd + with help from Cliff Hones on the RS coding + + (c) 2004 Adrian Kennard, Andrews & Arnold Ltd + (c) 2006 Stefan Schmidt Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. + documentation and/or other materials provided with the distribution. 3. Neither the name of the project nor the names of its contributors may be used to endorse or promote products derived from this software - without specific prior written permission. + without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -34,1186 +34,1273 @@ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + */ #include #include #include #include -#include +#include #include #ifdef _MSC_VER -#include +#include #endif #include "reedsol.h" #include "common.h" #include "dmatrix.h" // Annex M placement alorithm low level -static void ecc200placementbit(int *array, int NR, int NC, int r, int c, int p, char b) -{ - if (r < 0) { - r += NR; - c += 4 - ((NR + 4) % 8); - } - if (c < 0) { - c += NC; - r += 4 - ((NC + 4) % 8); - } - // Necessary for 26x32,26x40,26x48,36x120,36x144,72x120,72x144 - if (r >= NR) { - #ifdef DEBUG - fprintf(stderr,"r >= NR:%i,%i at r=%i->",p,b,r); - #endif - r -= NR; - #ifdef DEBUG - fprintf(stderr,"%i,c=%i\n",r,c); - #endif - } - #ifdef DEBUG - if(0 != array[r * NC + c] ){ - int a = array[r * NC + c]; - fprintf(stderr,"Double:%i,%i->%i,%i at r=%i,c=%i\n",a >> 3, a & 7, p,b,r,c); - return; - } - #endif - // Check index limits - assert( r < NR ); - assert( c < NC ); - // Check double-assignment - assert( 0 == array[r * NC + c] ); - array[r * NC + c] = (p << 3) + b; +static void ecc200placementbit(int *array, int NR, int NC, int r, int c, int p, char b) { + if (r < 0) { + r += NR; + c += 4 - ((NR + 4) % 8); + } + if (c < 0) { + c += NC; + r += 4 - ((NC + 4) % 8); + } + // Necessary for 26x32,26x40,26x48,36x120,36x144,72x120,72x144 + if (r >= NR) { +#ifdef DEBUG + fprintf(stderr, "r >= NR:%i,%i at r=%i->", p, b, r); +#endif + r -= NR; +#ifdef DEBUG + fprintf(stderr, "%i,c=%i\n", r, c); +#endif + } +#ifdef DEBUG + if (0 != array[r * NC + c]) { + int a = array[r * NC + c]; + fprintf(stderr, "Double:%i,%i->%i,%i at r=%i,c=%i\n", a >> 3, a & 7, p, b, r, c); + return; + } +#endif + // Check index limits + assert(r < NR); + assert(c < NC); + // Check double-assignment + assert(0 == array[r * NC + c]); + array[r * NC + c] = (p << 3) + b; } -static void ecc200placementblock(int *array, int NR, int NC, int r, - int c, int p) -{ - ecc200placementbit(array, NR, NC, r - 2, c - 2, p, 7); - ecc200placementbit(array, NR, NC, r - 2, c - 1, p, 6); - ecc200placementbit(array, NR, NC, r - 1, c - 2, p, 5); - ecc200placementbit(array, NR, NC, r - 1, c - 1, p, 4); - ecc200placementbit(array, NR, NC, r - 1, c - 0, p, 3); - ecc200placementbit(array, NR, NC, r - 0, c - 2, p, 2); - ecc200placementbit(array, NR, NC, r - 0, c - 1, p, 1); - ecc200placementbit(array, NR, NC, r - 0, c - 0, p, 0); +static void ecc200placementblock(int *array, int NR, int NC, int r, int c, int p) { + ecc200placementbit(array, NR, NC, r - 2, c - 2, p, 7); + ecc200placementbit(array, NR, NC, r - 2, c - 1, p, 6); + ecc200placementbit(array, NR, NC, r - 1, c - 2, p, 5); + ecc200placementbit(array, NR, NC, r - 1, c - 1, p, 4); + ecc200placementbit(array, NR, NC, r - 1, c - 0, p, 3); + ecc200placementbit(array, NR, NC, r - 0, c - 2, p, 2); + ecc200placementbit(array, NR, NC, r - 0, c - 1, p, 1); + ecc200placementbit(array, NR, NC, r - 0, c - 0, p, 0); } -static void ecc200placementcornerA(int *array, int NR, int NC, int p) -{ - ecc200placementbit(array, NR, NC, NR - 1, 0, p, 7); - ecc200placementbit(array, NR, NC, NR - 1, 1, p, 6); - ecc200placementbit(array, NR, NC, NR - 1, 2, p, 5); - ecc200placementbit(array, NR, NC, 0, NC - 2, p, 4); - ecc200placementbit(array, NR, NC, 0, NC - 1, p, 3); - ecc200placementbit(array, NR, NC, 1, NC - 1, p, 2); - ecc200placementbit(array, NR, NC, 2, NC - 1, p, 1); - ecc200placementbit(array, NR, NC, 3, NC - 1, p, 0); +static void ecc200placementcornerA(int *array, int NR, int NC, int p) { + ecc200placementbit(array, NR, NC, NR - 1, 0, p, 7); + ecc200placementbit(array, NR, NC, NR - 1, 1, p, 6); + ecc200placementbit(array, NR, NC, NR - 1, 2, p, 5); + ecc200placementbit(array, NR, NC, 0, NC - 2, p, 4); + ecc200placementbit(array, NR, NC, 0, NC - 1, p, 3); + ecc200placementbit(array, NR, NC, 1, NC - 1, p, 2); + ecc200placementbit(array, NR, NC, 2, NC - 1, p, 1); + ecc200placementbit(array, NR, NC, 3, NC - 1, p, 0); } -static void ecc200placementcornerB(int *array, int NR, int NC, int p) -{ - ecc200placementbit(array, NR, NC, NR - 3, 0, p, 7); - ecc200placementbit(array, NR, NC, NR - 2, 0, p, 6); - ecc200placementbit(array, NR, NC, NR - 1, 0, p, 5); - ecc200placementbit(array, NR, NC, 0, NC - 4, p, 4); - ecc200placementbit(array, NR, NC, 0, NC - 3, p, 3); - ecc200placementbit(array, NR, NC, 0, NC - 2, p, 2); - ecc200placementbit(array, NR, NC, 0, NC - 1, p, 1); - ecc200placementbit(array, NR, NC, 1, NC - 1, p, 0); +static void ecc200placementcornerB(int *array, int NR, int NC, int p) { + ecc200placementbit(array, NR, NC, NR - 3, 0, p, 7); + ecc200placementbit(array, NR, NC, NR - 2, 0, p, 6); + ecc200placementbit(array, NR, NC, NR - 1, 0, p, 5); + ecc200placementbit(array, NR, NC, 0, NC - 4, p, 4); + ecc200placementbit(array, NR, NC, 0, NC - 3, p, 3); + ecc200placementbit(array, NR, NC, 0, NC - 2, p, 2); + ecc200placementbit(array, NR, NC, 0, NC - 1, p, 1); + ecc200placementbit(array, NR, NC, 1, NC - 1, p, 0); } -static void ecc200placementcornerC(int *array, int NR, int NC, int p) -{ - ecc200placementbit(array, NR, NC, NR - 3, 0, p, 7); - ecc200placementbit(array, NR, NC, NR - 2, 0, p, 6); - ecc200placementbit(array, NR, NC, NR - 1, 0, p, 5); - ecc200placementbit(array, NR, NC, 0, NC - 2, p, 4); - ecc200placementbit(array, NR, NC, 0, NC - 1, p, 3); - ecc200placementbit(array, NR, NC, 1, NC - 1, p, 2); - ecc200placementbit(array, NR, NC, 2, NC - 1, p, 1); - ecc200placementbit(array, NR, NC, 3, NC - 1, p, 0); +static void ecc200placementcornerC(int *array, int NR, int NC, int p) { + ecc200placementbit(array, NR, NC, NR - 3, 0, p, 7); + ecc200placementbit(array, NR, NC, NR - 2, 0, p, 6); + ecc200placementbit(array, NR, NC, NR - 1, 0, p, 5); + ecc200placementbit(array, NR, NC, 0, NC - 2, p, 4); + ecc200placementbit(array, NR, NC, 0, NC - 1, p, 3); + ecc200placementbit(array, NR, NC, 1, NC - 1, p, 2); + ecc200placementbit(array, NR, NC, 2, NC - 1, p, 1); + ecc200placementbit(array, NR, NC, 3, NC - 1, p, 0); } -static void ecc200placementcornerD(int *array, int NR, int NC, int p) -{ - ecc200placementbit(array, NR, NC, NR - 1, 0, p, 7); - ecc200placementbit(array, NR, NC, NR - 1, NC - 1, p, 6); - ecc200placementbit(array, NR, NC, 0, NC - 3, p, 5); - ecc200placementbit(array, NR, NC, 0, NC - 2, p, 4); - ecc200placementbit(array, NR, NC, 0, NC - 1, p, 3); - ecc200placementbit(array, NR, NC, 1, NC - 3, p, 2); - ecc200placementbit(array, NR, NC, 1, NC - 2, p, 1); - ecc200placementbit(array, NR, NC, 1, NC - 1, p, 0); +static void ecc200placementcornerD(int *array, int NR, int NC, int p) { + ecc200placementbit(array, NR, NC, NR - 1, 0, p, 7); + ecc200placementbit(array, NR, NC, NR - 1, NC - 1, p, 6); + ecc200placementbit(array, NR, NC, 0, NC - 3, p, 5); + ecc200placementbit(array, NR, NC, 0, NC - 2, p, 4); + ecc200placementbit(array, NR, NC, 0, NC - 1, p, 3); + ecc200placementbit(array, NR, NC, 1, NC - 3, p, 2); + ecc200placementbit(array, NR, NC, 1, NC - 2, p, 1); + ecc200placementbit(array, NR, NC, 1, NC - 1, p, 0); } // Annex M placement alorithm main function -static void ecc200placement(int *array, int NR, int NC) -{ - int r, c, p; - // invalidate - for (r = 0; r < NR; r++) - for (c = 0; c < NC; c++) - array[r * NC + c] = 0; - // start - p = 1; - r = 4; - c = 0; - do { - // check corner - if (r == NR && !c) - ecc200placementcornerA(array, NR, NC, p++); - if (r == NR - 2 && !c && NC % 4) - ecc200placementcornerB(array, NR, NC, p++); - if (r == NR - 2 && !c && (NC % 8) == 4) - ecc200placementcornerC(array, NR, NC, p++); - if (r == NR + 4 && c == 2 && !(NC % 8)) - ecc200placementcornerD(array, NR, NC, p++); - // up/right - do { - if (r < NR && c >= 0 && !array[r * NC + c]) - ecc200placementblock(array, NR, NC, r, c, p++); - r -= 2; - c += 2; - } - while (r >= 0 && c < NC); - r++; - c += 3; - // down/left - do { - if (r >= 0 && c < NC && !array[r * NC + c]) - ecc200placementblock(array, NR, NC, r, c, p++); - r += 2; - c -= 2; - } - while (r < NR && c >= 0); - r += 3; - c++; - } - while (r < NR || c < NC); - // unfilled corner - if (!array[NR * NC - 1]) - array[NR * NC - 1] = array[NR * NC - NC - 2] = 1; +static void ecc200placement(int *array, int NR, int NC) { + int r, c, p; + // invalidate + for (r = 0; r < NR; r++) + for (c = 0; c < NC; c++) + array[r * NC + c] = 0; + // start + p = 1; + r = 4; + c = 0; + do { + // check corner + if (r == NR && !c) + ecc200placementcornerA(array, NR, NC, p++); + if (r == NR - 2 && !c && NC % 4) + ecc200placementcornerB(array, NR, NC, p++); + if (r == NR - 2 && !c && (NC % 8) == 4) + ecc200placementcornerC(array, NR, NC, p++); + if (r == NR + 4 && c == 2 && !(NC % 8)) + ecc200placementcornerD(array, NR, NC, p++); + // up/right + do { + if (r < NR && c >= 0 && !array[r * NC + c]) + ecc200placementblock(array, NR, NC, r, c, p++); + r -= 2; + c += 2; + } while (r >= 0 && c < NC); + r++; + c += 3; + // down/left + do { + if (r >= 0 && c < NC && !array[r * NC + c]) + ecc200placementblock(array, NR, NC, r, c, p++); + r += 2; + c -= 2; + } while (r < NR && c >= 0); + r += 3; + c++; + } while (r < NR || c < NC); + // unfilled corner + if (!array[NR * NC - 1]) + array[NR * NC - 1] = array[NR * NC - NC - 2] = 1; } // calculate and append ecc code, and if necessary interleave -static void ecc200(unsigned char *binary, int bytes, int datablock, int rsblock, int skew) -{ - int blocks = (bytes + 2) / datablock, b; - int n, p; - rs_init_gf(0x12d); - rs_init_code(rsblock, 1); - for (b = 0; b < blocks; b++) { - unsigned char buf[256], ecc[256]; - p = 0; - for (n = b; n < bytes; n += blocks) - buf[p++] = binary[n]; - rs_encode(p, buf, ecc); - p = rsblock - 1; // comes back reversed - for (n = b; n < rsblock * blocks; n += blocks) { - if (skew) { - /* Rotate ecc data to make 144x144 size symbols acceptable */ - /* See http://groups.google.com/group/postscriptbarcode/msg/5ae8fda7757477da */ - if(b < 8) { - binary[bytes + n + 2] = ecc[p--]; - } else { - binary[bytes + n - 8] = ecc[p--]; - } - } else { - binary[bytes + n] = ecc[p--]; - } - } - } - rs_free(); +static void ecc200(unsigned char *binary, int bytes, int datablock, int rsblock, int skew) { + int blocks = (bytes + 2) / datablock, b; + int n, p; + rs_init_gf(0x12d); + rs_init_code(rsblock, 1); + for (b = 0; b < blocks; b++) { + unsigned char buf[256], ecc[256]; + p = 0; + for (n = b; n < bytes; n += blocks) + buf[p++] = binary[n]; + rs_encode(p, buf, ecc); + p = rsblock - 1; // comes back reversed + for (n = b; n < rsblock * blocks; n += blocks) { + if (skew) { + /* Rotate ecc data to make 144x144 size symbols acceptable */ + /* See http://groups.google.com/group/postscriptbarcode/msg/5ae8fda7757477da */ + if (b < 8) { + binary[bytes + n + 2] = ecc[p--]; + } else { + binary[bytes + n - 8] = ecc[p--]; + } + } else { + binary[bytes + n] = ecc[p--]; + } + } + } + rs_free(); } -int isX12(unsigned char source) -{ - if(source == 13) { return 1; } - if(source == 42) { return 1; } - if(source == 62) { return 1; } - if(source == 32) { return 1; } - if((source >= '0') && (source <= '9')) { return 1; } - if((source >= 'A') && (source <= 'Z')) { return 1; } +/* Return true (1) if a character is valid in X12 set */ +int isX12(unsigned char source) { + if (source == 13) { + return 1; + } + if (source == 42) { + return 1; + } + if (source == 62) { + return 1; + } + if (source == 32) { + return 1; + } + if ((source >= '0') && (source <= '9')) { + return 1; + } + if ((source >= 'A') && (source <= 'Z')) { + return 1; + } - return 0; + return 0; } -void dminsert(char binary_string[], int posn, char newbit) -{ /* Insert a character into the middle of a string at position posn */ - int i, end; +/* Insert a character into the middle of a string at position posn */ +void dminsert(char binary_string[], int posn, char newbit) { + int i, end; - end = strlen(binary_string); - for(i = end; i > posn; i--) { - binary_string[i] = binary_string[i - 1]; - } - binary_string[posn] = newbit; + end = strlen(binary_string); + for (i = end; i > posn; i--) { + binary_string[i] = binary_string[i - 1]; + } + binary_string[posn] = newbit; } -void insert_value(unsigned char binary_stream[], int posn, int streamlen, char newbit) -{ - int i; +void insert_value(unsigned char binary_stream[], int posn, int streamlen, char newbit) { + int i; - for(i = streamlen; i > posn; i--) { - binary_stream[i] = binary_stream[i - 1]; - } - binary_stream[posn] = newbit; + for (i = streamlen; i > posn; i--) { + binary_stream[i] = binary_stream[i - 1]; + } + binary_stream[posn] = newbit; } int p_r_6_2_1(unsigned char inputData[], int position, int sourcelen) { - /* Annex P section (r)(6)(ii)(I) - "If one of the three X12 terminator/separator characters first - occurs in the yet to be processed data before a non-X12 character..." - */ - - int i; - int nonX12Position = 0; - int specialX12Position = 0; - int retval = 0; - - for (i = position; i < sourcelen; i++) { - if (nonX12Position == 0) { - if (isX12(i) == 1) { - nonX12Position = i; - } + /* Annex P section (r)(6)(ii)(I) + "If one of the three X12 terminator/separator characters first + occurs in the yet to be processed data before a non-X12 character..." + */ + + int i; + int nonX12Position = 0; + int specialX12Position = 0; + int retval = 0; + + for (i = position; i < sourcelen; i++) { + if (nonX12Position == 0) { + if (isX12(i) == 1) { + nonX12Position = i; } - - if (specialX12Position == 0) { - if ((inputData[i] == (char) 13) || + } + + if (specialX12Position == 0) { + if ((inputData[i] == (char) 13) || (inputData[i] == '*') || (inputData[i] == '>')) { - specialX12Position = i; - } + specialX12Position = i; } } - - if ((nonX12Position != 0) && (specialX12Position != 0)) { - if (specialX12Position < nonX12Position) { - retval = 1; - } + } + + if ((nonX12Position != 0) && (specialX12Position != 0)) { + if (specialX12Position < nonX12Position) { + retval = 1; } - - return retval; + } + + return retval; } -int look_ahead_test(unsigned char inputData[], int sourcelen, int position, int current_mode, int gs1) -{ - /* 'look ahead test' from Annex P */ +/* 'look ahead test' from Annex P */ +int look_ahead_test(unsigned char inputData[], int sourcelen, int position, int current_mode, int gs1) { + float ascii_count, c40_count, text_count, x12_count, edf_count, b256_count, best_count; + int sp, best_scheme; - float ascii_count, c40_count, text_count, x12_count, edf_count, b256_count, best_count; - int sp, best_scheme; - - best_scheme = DM_NULL; - - /* step (j) */ - if(current_mode == DM_ASCII) { - ascii_count = 0.0; - c40_count = 1.0; - text_count = 1.0; - x12_count = 1.0; - edf_count = 1.0; - b256_count = 1.25; - } else { - ascii_count = 1.0; - c40_count = 2.0; - text_count = 2.0; - x12_count = 2.0; - edf_count = 2.0; - b256_count = 2.25; - } + best_scheme = DM_NULL; - switch(current_mode) { - case DM_C40: c40_count = 0.0; break; - case DM_TEXT: text_count = 0.0; break; - case DM_X12: x12_count = 0.0; break; - case DM_EDIFACT: edf_count = 0.0; break; - case DM_BASE256: b256_count = 0.0; break; - } + /* step (j) */ + if (current_mode == DM_ASCII) { + ascii_count = 0.0; + c40_count = 1.0; + text_count = 1.0; + x12_count = 1.0; + edf_count = 1.0; + b256_count = 1.25; + } else { + ascii_count = 1.0; + c40_count = 2.0; + text_count = 2.0; + x12_count = 2.0; + edf_count = 2.0; + b256_count = 2.25; + } - sp = position; + switch (current_mode) { + case DM_C40: c40_count = 0.0; + break; + case DM_TEXT: text_count = 0.0; + break; + case DM_X12: x12_count = 0.0; + break; + case DM_EDIFACT: edf_count = 0.0; + break; + case DM_BASE256: b256_count = 0.0; + break; + } - do { - if(sp == (sourcelen - 1)) { - /* At the end of data ... step (k) */ - ascii_count = ceil(ascii_count); - b256_count = ceil(b256_count); - edf_count = ceil(edf_count); - text_count = ceil(text_count); - x12_count = ceil(x12_count); - c40_count = ceil(c40_count); + sp = position; - best_count = c40_count; - best_scheme = DM_C40; // (k)(7) + do { + if (sp == (sourcelen - 1)) { + /* At the end of data ... step (k) */ + ascii_count = ceil(ascii_count); + b256_count = ceil(b256_count); + edf_count = ceil(edf_count); + text_count = ceil(text_count); + x12_count = ceil(x12_count); + c40_count = ceil(c40_count); - if (x12_count < best_count) { - best_count = x12_count; - best_scheme = DM_X12; // (k)(6) - } + best_count = c40_count; + best_scheme = DM_C40; // (k)(7) - if (text_count < best_count) { - best_count = text_count; - best_scheme = DM_TEXT; // (k)(5) - } + if (x12_count < best_count) { + best_count = x12_count; + best_scheme = DM_X12; // (k)(6) + } - if (edf_count < best_count) { - best_count = edf_count; - best_scheme = DM_EDIFACT; // (k)(4) - } + if (text_count < best_count) { + best_count = text_count; + best_scheme = DM_TEXT; // (k)(5) + } - if (b256_count < best_count) { - best_count = b256_count; - best_scheme = DM_BASE256; // (k)(3) - } + if (edf_count < best_count) { + best_count = edf_count; + best_scheme = DM_EDIFACT; // (k)(4) + } - if (ascii_count <= best_count) { - best_scheme = DM_ASCII; // (k)(2) - } + if (b256_count < best_count) { + best_count = b256_count; + best_scheme = DM_BASE256; // (k)(3) + } + + if (ascii_count <= best_count) { + best_scheme = DM_ASCII; // (k)(2) + } + } else { + + /* ascii ... step (l) */ + if ((inputData[sp] >= '0') && (inputData[sp] <= '9')) { + ascii_count += 0.5; // (l)(1) } else { - - /* ascii ... step (l) */ - if ((inputData[sp] >= '0') && (inputData[sp] <= '9')) { - ascii_count += 0.5; // (l)(1) + if (inputData[sp] > 127) { + ascii_count = ceil(ascii_count) + 2.0; // (l)(2) } else { - if (inputData[sp] > 127) { - ascii_count = ceil(ascii_count) + 2.0; // (l)(2) - } else { - ascii_count = ceil(ascii_count) + 1.0; // (l)(3) - } - } - - /* c40 ... step (m) */ - if ((inputData[sp] == ' ') || - (((inputData[sp] >= '0') && (inputData[sp] <= '9')) || - ((inputData[sp] >= 'A') && (inputData[sp] <= 'Z')))) { - c40_count += (2.0 / 3.0); // (m)(1) - } else { - if (inputData[sp] > 127) { - c40_count += (8.0 / 3.0); // (m)(2) - } else { - c40_count += (4.0 / 3.0); // (m)(3) - } - } - - /* text ... step (n) */ - if ((inputData[sp] == ' ') || - (((inputData[sp] >= '0') && (inputData[sp] <= '9')) || - ((inputData[sp] >= 'a') && (inputData[sp] <= 'z')))) { - text_count += (2.0 / 3.0); // (n)(1) - } else { - if (inputData[sp] > 127) { - text_count += (8.0 / 3.0); // (n)(2) - } else { - text_count += (4.0 / 3.0); // (n)(3) - } - } - - /* x12 ... step (o) */ - if (isX12(inputData[sp])) { - x12_count += (2.0 / 3.0); // (o)(1) - } else { - if (inputData[sp] > 127) { - x12_count += (13.0 / 3.0); // (o)(2) - } else { - x12_count += (10.0 / 3.0); // (o)(3) - } - } - - /* edifact ... step (p) */ - if ((inputData[sp] >= ' ') && (inputData[sp] <= '^')) { - edf_count += (3.0 / 4.0); // (p)(1) - } else { - if (inputData[sp] > 127) { - edf_count += (17.0 / 4.0); // (p)(2) - } else { - edf_count += (13.0 / 4.0); // (p)(3) - } - } - if ((gs1 == 1) && (inputData[sp] == '[')) { - edf_count += 6.0; - } - - /* base 256 ... step (q) */ - if ((gs1 == 1) && (inputData[sp] == '[')) { - b256_count += 4.0; // (q)(1) - } else { - b256_count += 1.0; // (q)(2) + ascii_count = ceil(ascii_count) + 1.0; // (l)(3) } } + /* c40 ... step (m) */ + if ((inputData[sp] == ' ') || + (((inputData[sp] >= '0') && (inputData[sp] <= '9')) || + ((inputData[sp] >= 'A') && (inputData[sp] <= 'Z')))) { + c40_count += (2.0 / 3.0); // (m)(1) + } else { + if (inputData[sp] > 127) { + c40_count += (8.0 / 3.0); // (m)(2) + } else { + c40_count += (4.0 / 3.0); // (m)(3) + } + } - if (sp > (position + 3)) { - /* 4 data characters processed ... step (r) */ + /* text ... step (n) */ + if ((inputData[sp] == ' ') || + (((inputData[sp] >= '0') && (inputData[sp] <= '9')) || + ((inputData[sp] >= 'a') && (inputData[sp] <= 'z')))) { + text_count += (2.0 / 3.0); // (n)(1) + } else { + if (inputData[sp] > 127) { + text_count += (8.0 / 3.0); // (n)(2) + } else { + text_count += (4.0 / 3.0); // (n)(3) + } + } - /* step (r)(6) */ - if (((c40_count + 1.0) < ascii_count) && - ((c40_count + 1.0) < b256_count) && - ((c40_count + 1.0) < edf_count) && - ((c40_count + 1.0) < text_count)) { + /* x12 ... step (o) */ + if (isX12(inputData[sp])) { + x12_count += (2.0 / 3.0); // (o)(1) + } else { + if (inputData[sp] > 127) { + x12_count += (13.0 / 3.0); // (o)(2) + } else { + x12_count += (10.0 / 3.0); // (o)(3) + } + } - if (c40_count < x12_count) { + /* edifact ... step (p) */ + if ((inputData[sp] >= ' ') && (inputData[sp] <= '^')) { + edf_count += (3.0 / 4.0); // (p)(1) + } else { + if (inputData[sp] > 127) { + edf_count += (17.0 / 4.0); // (p)(2) + } else { + edf_count += (13.0 / 4.0); // (p)(3) + } + } + if ((gs1 == 1) && (inputData[sp] == '[')) { + edf_count += 6.0; + } + + /* base 256 ... step (q) */ + if ((gs1 == 1) && (inputData[sp] == '[')) { + b256_count += 4.0; // (q)(1) + } else { + b256_count += 1.0; // (q)(2) + } + } + + + if (sp > (position + 3)) { + /* 4 data characters processed ... step (r) */ + + /* step (r)(6) */ + if (((c40_count + 1.0) < ascii_count) && + ((c40_count + 1.0) < b256_count) && + ((c40_count + 1.0) < edf_count) && + ((c40_count + 1.0) < text_count)) { + + if (c40_count < x12_count) { + best_scheme = DM_C40; + } + + if (c40_count == x12_count) { + if (p_r_6_2_1(inputData, sp, sourcelen) == 1) { + // Test (r)(6)(ii)(i) + best_scheme = DM_X12; + } else { best_scheme = DM_C40; } - - if (c40_count == x12_count) { - if (p_r_6_2_1(inputData, sp, sourcelen) == 1) { - // Test (r)(6)(ii)(i) - best_scheme = DM_X12; - } else { - best_scheme = DM_C40; - } - } } - - /* step (r)(5) */ - if (((x12_count + 1.0) < ascii_count) && - ((x12_count + 1.0) < b256_count) && - ((x12_count + 1.0) < edf_count) && - ((x12_count + 1.0) < text_count) && - ((x12_count + 1.0) < c40_count)) { - best_scheme = DM_X12; - } - - /* step (r)(4) */ - if (((text_count + 1.0) < ascii_count) && - ((text_count + 1.0) < b256_count) && - ((text_count + 1.0) < edf_count) && - ((text_count + 1.0) < x12_count) && - ((text_count + 1.0) < c40_count)) { - best_scheme = DM_TEXT; - } - - /* step (r)(3) */ - if (((edf_count + 1.0) < ascii_count) && - ((edf_count + 1.0) < b256_count) && - ((edf_count + 1.0) < text_count) && - ((edf_count + 1.0) < x12_count) && - ((edf_count + 1.0) < c40_count)) { - best_scheme = DM_EDIFACT; - } - - /* step (r)(2) */ - if (((b256_count + 1.0) <= ascii_count) || - (((b256_count + 1.0) < edf_count) && - ((b256_count + 1.0) < text_count) && - ((b256_count + 1.0) < x12_count) && - ((b256_count + 1.0) < c40_count))) { - best_scheme = DM_BASE256; - } - - /* step (r)(1) */ - if (((ascii_count + 1.0) <= b256_count) && - ((ascii_count + 1.0) <= edf_count) && - ((ascii_count + 1.0) <= text_count) && - ((ascii_count + 1.0) <= x12_count) && - ((ascii_count + 1.0) <= c40_count)) { - best_scheme = DM_ASCII; - } } - sp++; - } while (best_scheme == DM_NULL); // step (s) - - return best_scheme; + /* step (r)(5) */ + if (((x12_count + 1.0) < ascii_count) && + ((x12_count + 1.0) < b256_count) && + ((x12_count + 1.0) < edf_count) && + ((x12_count + 1.0) < text_count) && + ((x12_count + 1.0) < c40_count)) { + best_scheme = DM_X12; + } + + /* step (r)(4) */ + if (((text_count + 1.0) < ascii_count) && + ((text_count + 1.0) < b256_count) && + ((text_count + 1.0) < edf_count) && + ((text_count + 1.0) < x12_count) && + ((text_count + 1.0) < c40_count)) { + best_scheme = DM_TEXT; + } + + /* step (r)(3) */ + if (((edf_count + 1.0) < ascii_count) && + ((edf_count + 1.0) < b256_count) && + ((edf_count + 1.0) < text_count) && + ((edf_count + 1.0) < x12_count) && + ((edf_count + 1.0) < c40_count)) { + best_scheme = DM_EDIFACT; + } + + /* step (r)(2) */ + if (((b256_count + 1.0) <= ascii_count) || + (((b256_count + 1.0) < edf_count) && + ((b256_count + 1.0) < text_count) && + ((b256_count + 1.0) < x12_count) && + ((b256_count + 1.0) < c40_count))) { + best_scheme = DM_BASE256; + } + + /* step (r)(1) */ + if (((ascii_count + 1.0) <= b256_count) && + ((ascii_count + 1.0) <= edf_count) && + ((ascii_count + 1.0) <= text_count) && + ((ascii_count + 1.0) <= x12_count) && + ((ascii_count + 1.0) <= c40_count)) { + best_scheme = DM_ASCII; + } + } + + sp++; + } while (best_scheme == DM_NULL); // step (s) + + return best_scheme; } -int dm200encode(struct zint_symbol *symbol, unsigned char source[], unsigned char target[], int *last_mode, int *length_p, int process_buffer[], int *process_p) -{ - /* Encodes data using ASCII, C40, Text, X12, EDIFACT or Base 256 modes as appropriate */ - /* Supports encoding FNC1 in supporting systems */ +/* Encodes data using ASCII, C40, Text, X12, EDIFACT or Base 256 modes as appropriate + Supports encoding FNC1 in supporting systems */ +int dm200encode(struct zint_symbol *symbol, unsigned char source[], unsigned char target[], int *last_mode, int *length_p, int process_buffer[], int *process_p) { - int sp, tp, i, gs1; - int current_mode, next_mode; - int inputlen = *length_p; - int debug = 0; + + int sp, tp, i, gs1; + int current_mode, next_mode; + int inputlen = *length_p; + int debug = 0; #ifndef _MSC_VER - char binary[2 * inputlen]; + char binary[2 * inputlen]; #else - char* binary = (char*)_alloca(2 * inputlen); + char* binary = (char*) _alloca(2 * inputlen); #endif - sp = 0; - tp = 0; - memset(process_buffer, 0, 8); - *process_p = 0; - strcpy(binary, ""); + sp = 0; + tp = 0; + memset(process_buffer, 0, 8); + *process_p = 0; + strcpy(binary, ""); - /* step (a) */ - current_mode = DM_ASCII; - next_mode = DM_ASCII; + /* step (a) */ + current_mode = DM_ASCII; + next_mode = DM_ASCII; - if(symbol->input_mode == GS1_MODE) { gs1 = 1; } else { gs1 = 0; } + if (symbol->input_mode == GS1_MODE) { + gs1 = 1; + } else { + gs1 = 0; + } - if(gs1) { - target[tp] = 232; tp++; - concat(binary, " "); - if(debug) printf("FN1 "); - } /* FNC1 */ + if (gs1) { + target[tp] = 232; + tp++; + concat(binary, " "); + if (debug) printf("FN1 "); + } /* FNC1 */ - if(symbol->output_options & READER_INIT) { - if(gs1) { - strcpy(symbol->errtxt, "Cannot encode in GS1 mode and Reader Initialisation at the same time"); - return ZINT_ERROR_INVALID_OPTION; - } else { - target[tp] = 234; tp++; /* Reader Programming */ - concat(binary, " "); - if(debug) printf("RP "); - } - } - - /* Check for Macro05/Macro06 */ - /* "[)>[RS]05[GS]...[RS][EOT]" -> CW 236 */ - /* "[)>[RS]06[GS]...[RS][EOT]" -> CW 237 */ - if (tp == 0 && sp == 0 && inputlen >= 9 - && source[0] == '[' && source[1] == ')' && source[2] == '>' - && source[3] == '\x1e' && source[4] == '0' - && (source[5] == '5' || source[5] == '6') - && source[6] == '\x1d' - && source[inputlen-2] == '\x1e' && source[inputlen-1] == '\x04' ) - { - /* Output macro Codeword */ - if (source[5] == '5') { - target[tp] = 236; - if(debug) printf("Macro05 "); - } else { - target[tp] = 237; - if(debug) printf("Macro06 "); - } - tp++; - concat(binary, " "); - /* Remove macro characters from input string */ - sp = 7; - inputlen -= 2; - *length_p -= 2; - } - + if (symbol->output_options & READER_INIT) { + if (gs1) { + strcpy(symbol->errtxt, "Cannot encode in GS1 mode and Reader Initialisation at the same time"); + return ZINT_ERROR_INVALID_OPTION; + } else { + target[tp] = 234; + tp++; /* Reader Programming */ + concat(binary, " "); + if (debug) printf("RP "); + } + } - while (sp < inputlen) { + /* Check for Macro05/Macro06 */ + /* "[)>[RS]05[GS]...[RS][EOT]" -> CW 236 */ + /* "[)>[RS]06[GS]...[RS][EOT]" -> CW 237 */ + if (tp == 0 && sp == 0 && inputlen >= 9 + && source[0] == '[' && source[1] == ')' && source[2] == '>' + && source[3] == '\x1e' && source[4] == '0' + && (source[5] == '5' || source[5] == '6') + && source[6] == '\x1d' + && source[inputlen - 2] == '\x1e' && source[inputlen - 1] == '\x04') { + /* Output macro Codeword */ + if (source[5] == '5') { + target[tp] = 236; + if (debug) printf("Macro05 "); + } else { + target[tp] = 237; + if (debug) printf("Macro06 "); + } + tp++; + concat(binary, " "); + /* Remove macro characters from input string */ + sp = 7; + inputlen -= 2; + *length_p -= 2; + } - current_mode = next_mode; - /* step (b) - ASCII encodation */ - if(current_mode == DM_ASCII) { - next_mode = DM_ASCII; + while (sp < inputlen) { - if(istwodigits(source, sp) && ((sp + 1) != inputlen)) { - target[tp] = (10 * ctoi(source[sp])) + ctoi(source[sp + 1]) + 130; - if(debug) printf("N%d ", target[tp] - 130); - tp++; concat(binary, " "); - sp += 2; - } else { - next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1); + current_mode = next_mode; - if(next_mode != DM_ASCII) { - switch(next_mode) { - case DM_C40: target[tp] = 230; tp++; concat(binary, " "); - if(debug) printf("C40 "); break; - case DM_TEXT: target[tp] = 239; tp++; concat(binary, " "); - if(debug) printf("TEX "); break; - case DM_X12: target[tp] = 238; tp++; concat(binary, " "); - if(debug) printf("X12 "); break; - case DM_EDIFACT: target[tp] = 240; tp++; concat(binary, " "); - if(debug) printf("EDI "); break; - case DM_BASE256: target[tp] = 231; tp++; concat(binary, " "); - if(debug) printf("BAS "); break; - } - } else { - if(source[sp] > 127) { - target[tp] = 235; /* FNC4 */ - if(debug) printf("FN4 "); - tp++; - target[tp] = (source[sp] - 128) + 1; - if(debug) printf("A%02X ", target[tp] - 1); - tp++; concat(binary, " "); - } else { - if(gs1 && (source[sp] == '[')) { - target[tp] = 232; /* FNC1 */ - if(debug) printf("FN1 "); - } else { - target[tp] = source[sp] + 1; - if(debug) printf("A%02X ", target[tp] - 1); - } - tp++; - concat(binary, " "); - } - sp++; - } - } + /* step (b) - ASCII encodation */ + if (current_mode == DM_ASCII) { + next_mode = DM_ASCII; - } + if (istwodigits(source, sp) && ((sp + 1) != inputlen)) { + target[tp] = (10 * ctoi(source[sp])) + ctoi(source[sp + 1]) + 130; + if (debug) printf("N%d ", target[tp] - 130); + tp++; + concat(binary, " "); + sp += 2; + } else { + next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1); - /* step (c) C40 encodation */ - if(current_mode == DM_C40) { - int shift_set, value; + if (next_mode != DM_ASCII) { + switch (next_mode) { + case DM_C40: target[tp] = 230; + tp++; + concat(binary, " "); + if (debug) printf("C40 "); + break; + case DM_TEXT: target[tp] = 239; + tp++; + concat(binary, " "); + if (debug) printf("TEX "); + break; + case DM_X12: target[tp] = 238; + tp++; + concat(binary, " "); + if (debug) printf("X12 "); + break; + case DM_EDIFACT: target[tp] = 240; + tp++; + concat(binary, " "); + if (debug) printf("EDI "); + break; + case DM_BASE256: target[tp] = 231; + tp++; + concat(binary, " "); + if (debug) printf("BAS "); + break; + } + } else { + if (source[sp] > 127) { + target[tp] = 235; /* FNC4 */ + if (debug) printf("FN4 "); + tp++; + target[tp] = (source[sp] - 128) + 1; + if (debug) printf("A%02X ", target[tp] - 1); + tp++; + concat(binary, " "); + } else { + if (gs1 && (source[sp] == '[')) { + target[tp] = 232; /* FNC1 */ + if (debug) printf("FN1 "); + } else { + target[tp] = source[sp] + 1; + if (debug) printf("A%02X ", target[tp] - 1); + } + tp++; + concat(binary, " "); + } + sp++; + } + } - next_mode = DM_C40; - if(*process_p == 0) { - next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1); - } + } - if(next_mode != DM_C40) { - target[tp] = 254; tp++; concat(binary, " "); /* Unlatch */ - next_mode = DM_ASCII; - if (debug) printf("ASC "); - } else { - if(source[sp] > 127) { - process_buffer[*process_p] = 1; (*process_p)++; - process_buffer[*process_p] = 30; (*process_p)++; /* Upper Shift */ - shift_set = c40_shift[source[sp] - 128]; - value = c40_value[source[sp] - 128]; - } else { - shift_set = c40_shift[source[sp]]; - value = c40_value[source[sp]]; - } + /* step (c) C40 encodation */ + if (current_mode == DM_C40) { + int shift_set, value; - if(gs1 && (source[sp] == '[')) { - shift_set = 2; - value = 27; /* FNC1 */ - } + next_mode = DM_C40; + if (*process_p == 0) { + next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1); + } - if(shift_set != 0) { - process_buffer[*process_p] = shift_set - 1; (*process_p)++; - } - process_buffer[*process_p] = value; (*process_p)++; + if (next_mode != DM_C40) { + target[tp] = 254; + tp++; + concat(binary, " "); /* Unlatch */ + next_mode = DM_ASCII; + if (debug) printf("ASC "); + } else { + if (source[sp] > 127) { + process_buffer[*process_p] = 1; + (*process_p)++; + process_buffer[*process_p] = 30; + (*process_p)++; /* Upper Shift */ + shift_set = c40_shift[source[sp] - 128]; + value = c40_value[source[sp] - 128]; + } else { + shift_set = c40_shift[source[sp]]; + value = c40_value[source[sp]]; + } - if(*process_p >= 3) { - int iv; + if (gs1 && (source[sp] == '[')) { + shift_set = 2; + value = 27; /* FNC1 */ + } - iv = (1600 * process_buffer[0]) + (40 * process_buffer[1]) + (process_buffer[2]) + 1; - target[tp] = iv / 256; tp++; - target[tp] = iv % 256; tp++; - concat(binary, " "); - if (debug) printf("[%d %d %d] ", process_buffer[0], process_buffer[1], process_buffer[2]); + if (shift_set != 0) { + process_buffer[*process_p] = shift_set - 1; + (*process_p)++; + } + process_buffer[*process_p] = value; + (*process_p)++; - process_buffer[0] = process_buffer[3]; - process_buffer[1] = process_buffer[4]; - process_buffer[2] = process_buffer[5]; - process_buffer[3] = 0; - process_buffer[4] = 0; - process_buffer[5] = 0; - *process_p -= 3; - } - sp++; - } - } + if (*process_p >= 3) { + int iv; - /* step (d) Text encodation */ - if(current_mode == DM_TEXT) { - int shift_set, value; + iv = (1600 * process_buffer[0]) + (40 * process_buffer[1]) + (process_buffer[2]) + 1; + target[tp] = iv / 256; + tp++; + target[tp] = iv % 256; + tp++; + concat(binary, " "); + if (debug) printf("[%d %d %d] ", process_buffer[0], process_buffer[1], process_buffer[2]); - next_mode = DM_TEXT; - if(*process_p == 0) { - next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1); - } + process_buffer[0] = process_buffer[3]; + process_buffer[1] = process_buffer[4]; + process_buffer[2] = process_buffer[5]; + process_buffer[3] = 0; + process_buffer[4] = 0; + process_buffer[5] = 0; + *process_p -= 3; + } + sp++; + } + } - if(next_mode != DM_TEXT) { - target[tp] = 254; tp++; concat(binary, " ");/* Unlatch */ - next_mode = DM_ASCII; - if (debug) printf("ASC "); - } else { - if(source[sp] > 127) { - process_buffer[*process_p] = 1; (*process_p)++; - process_buffer[*process_p] = 30; (*process_p)++; /* Upper Shift */ - shift_set = text_shift[source[sp] - 128]; - value = text_value[source[sp] - 128]; - } else { - shift_set = text_shift[source[sp]]; - value = text_value[source[sp]]; - } + /* step (d) Text encodation */ + if (current_mode == DM_TEXT) { + int shift_set, value; - if(gs1 && (source[sp] == '[')) { - shift_set = 2; - value = 27; /* FNC1 */ - } + next_mode = DM_TEXT; + if (*process_p == 0) { + next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1); + } - if(shift_set != 0) { - process_buffer[*process_p] = shift_set - 1; (*process_p)++; - } - process_buffer[*process_p] = value; (*process_p)++; - - if(*process_p >= 3) { - int iv; - - iv = (1600 * process_buffer[0]) + (40 * process_buffer[1]) + (process_buffer[2]) + 1; - target[tp] = iv / 256; tp++; - target[tp] = iv % 256; tp++; - concat(binary, " "); - if (debug) printf("[%d %d %d] ", process_buffer[0], process_buffer[1], process_buffer[2]); - - process_buffer[0] = process_buffer[3]; - process_buffer[1] = process_buffer[4]; - process_buffer[2] = process_buffer[5]; - process_buffer[3] = 0; - process_buffer[4] = 0; - process_buffer[5] = 0; - *process_p -= 3; - } - sp++; - } - } + if (next_mode != DM_TEXT) { + target[tp] = 254; + tp++; + concat(binary, " "); /* Unlatch */ + next_mode = DM_ASCII; + if (debug) printf("ASC "); + } else { + if (source[sp] > 127) { + process_buffer[*process_p] = 1; + (*process_p)++; + process_buffer[*process_p] = 30; + (*process_p)++; /* Upper Shift */ + shift_set = text_shift[source[sp] - 128]; + value = text_value[source[sp] - 128]; + } else { + shift_set = text_shift[source[sp]]; + value = text_value[source[sp]]; + } - /* step (e) X12 encodation */ - if(current_mode == DM_X12) { - int value = 0; + if (gs1 && (source[sp] == '[')) { + shift_set = 2; + value = 27; /* FNC1 */ + } - next_mode = DM_X12; - if(*process_p == 0) { - next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1); - } + if (shift_set != 0) { + process_buffer[*process_p] = shift_set - 1; + (*process_p)++; + } + process_buffer[*process_p] = value; + (*process_p)++; - if(next_mode != DM_X12) { - target[tp] = 254; tp++; concat(binary, " ");/* Unlatch */ - next_mode = DM_ASCII; - if (debug) printf("ASC "); - } else { - if(source[sp] == 13) { value = 0; } - if(source[sp] == '*') { value = 1; } - if(source[sp] == '>') { value = 2; } - if(source[sp] == ' ') { value = 3; } - if((source[sp] >= '0') && (source[sp] <= '9')) { value = (source[sp] - '0') + 4; } - if((source[sp] >= 'A') && (source[sp] <= 'Z')) { value = (source[sp] - 'A') + 14; } + if (*process_p >= 3) { + int iv; - process_buffer[*process_p] = value; (*process_p)++; + iv = (1600 * process_buffer[0]) + (40 * process_buffer[1]) + (process_buffer[2]) + 1; + target[tp] = iv / 256; + tp++; + target[tp] = iv % 256; + tp++; + concat(binary, " "); + if (debug) printf("[%d %d %d] ", process_buffer[0], process_buffer[1], process_buffer[2]); - if(*process_p >= 3) { - int iv; + process_buffer[0] = process_buffer[3]; + process_buffer[1] = process_buffer[4]; + process_buffer[2] = process_buffer[5]; + process_buffer[3] = 0; + process_buffer[4] = 0; + process_buffer[5] = 0; + *process_p -= 3; + } + sp++; + } + } - iv = (1600 * process_buffer[0]) + (40 * process_buffer[1]) + (process_buffer[2]) + 1; - target[tp] = iv / 256; tp++; - target[tp] = iv % 256; tp++; - concat(binary, " "); - if (debug) printf("[%d %d %d] ", process_buffer[0], process_buffer[1], process_buffer[2]); + /* step (e) X12 encodation */ + if (current_mode == DM_X12) { + int value = 0; - process_buffer[0] = process_buffer[3]; - process_buffer[1] = process_buffer[4]; - process_buffer[2] = process_buffer[5]; - process_buffer[3] = 0; - process_buffer[4] = 0; - process_buffer[5] = 0; - *process_p -= 3; - } - sp++; - } - } + next_mode = DM_X12; + if (*process_p == 0) { + next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1); + } - /* step (f) EDIFACT encodation */ - if(current_mode == DM_EDIFACT) { - int value = 0; + if (next_mode != DM_X12) { + target[tp] = 254; + tp++; + concat(binary, " "); /* Unlatch */ + next_mode = DM_ASCII; + if (debug) printf("ASC "); + } else { + if (source[sp] == 13) { + value = 0; + } + if (source[sp] == '*') { + value = 1; + } + if (source[sp] == '>') { + value = 2; + } + if (source[sp] == ' ') { + value = 3; + } + if ((source[sp] >= '0') && (source[sp] <= '9')) { + value = (source[sp] - '0') + 4; + } + if ((source[sp] >= 'A') && (source[sp] <= 'Z')) { + value = (source[sp] - 'A') + 14; + } - next_mode = DM_EDIFACT; - if(*process_p == 3) { - next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1); - } + process_buffer[*process_p] = value; + (*process_p)++; - if(next_mode != DM_EDIFACT) { - process_buffer[*process_p] = 31; (*process_p)++; - next_mode = DM_ASCII; - } else { - if((source[sp] >= '@') && (source[sp] <= '^')) { value = source[sp] - '@'; } - if((source[sp] >= ' ') && (source[sp] <= '?')) { value = source[sp]; } - /* possibility put an assertion here for invalid character (none of the ifs trigger) */ + if (*process_p >= 3) { + int iv; - process_buffer[*process_p] = value; (*process_p)++; - sp++; - } + iv = (1600 * process_buffer[0]) + (40 * process_buffer[1]) + (process_buffer[2]) + 1; + target[tp] = iv / 256; + tp++; + target[tp] = iv % 256; + tp++; + concat(binary, " "); + if (debug) printf("[%d %d %d] ", process_buffer[0], process_buffer[1], process_buffer[2]); - if(*process_p >= 4) { - target[tp] = (process_buffer[0] << 2) + ((process_buffer[1] & 0x30) >> 4); tp++; - target[tp] = ((process_buffer[1] & 0x0f) << 4) + ((process_buffer[2] & 0x3c) >> 2); tp++; - target[tp] = ((process_buffer[2] & 0x03) << 6) + process_buffer[3]; tp++; - concat(binary, " "); - if (debug) printf("[%d %d %d %d] ", process_buffer[0], process_buffer[1], process_buffer[2], process_buffer[3]); + process_buffer[0] = process_buffer[3]; + process_buffer[1] = process_buffer[4]; + process_buffer[2] = process_buffer[5]; + process_buffer[3] = 0; + process_buffer[4] = 0; + process_buffer[5] = 0; + *process_p -= 3; + } + sp++; + } + } - process_buffer[0] = process_buffer[4]; - process_buffer[1] = process_buffer[5]; - process_buffer[2] = process_buffer[6]; - process_buffer[3] = process_buffer[7]; - process_buffer[4] = 0; - process_buffer[5] = 0; - process_buffer[6] = 0; - process_buffer[7] = 0; - *process_p -= 4; - } - } + /* step (f) EDIFACT encodation */ + if (current_mode == DM_EDIFACT) { + int value = 0; - /* step (g) Base 256 encodation */ - if(current_mode == DM_BASE256) { - next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1); + next_mode = DM_EDIFACT; + if (*process_p == 3) { + next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1); + } - if(next_mode == DM_BASE256) { - target[tp] = source[sp]; - if(debug) printf("B%02X ", target[tp]); - tp++; - sp++; - concat(binary, "b"); - } else { - next_mode = DM_ASCII; - if(debug) printf("ASC "); - } - } + if (next_mode != DM_EDIFACT) { + process_buffer[*process_p] = 31; + (*process_p)++; + next_mode = DM_ASCII; + } else { + if ((source[sp] >= '@') && (source[sp] <= '^')) { + value = source[sp] - '@'; + } + if ((source[sp] >= ' ') && (source[sp] <= '?')) { + value = source[sp]; + } + /* possibility put an assertion here for invalid character (none of the ifs trigger) */ - if(tp > 1558) { - return 0; - } + process_buffer[*process_p] = value; + (*process_p)++; + sp++; + } - } /* while */ + if (*process_p >= 4) { + target[tp] = (process_buffer[0] << 2) + ((process_buffer[1] & 0x30) >> 4); + tp++; + target[tp] = ((process_buffer[1] & 0x0f) << 4) + ((process_buffer[2] & 0x3c) >> 2); + tp++; + target[tp] = ((process_buffer[2] & 0x03) << 6) + process_buffer[3]; + tp++; + concat(binary, " "); + if (debug) printf("[%d %d %d %d] ", process_buffer[0], process_buffer[1], process_buffer[2], process_buffer[3]); - /* Add length and randomising algorithm to b256 */ - i = 0; - while (i < tp) { - if(binary[i] == 'b') { - if((i == 0) || ((i != 0) && (binary[i - 1] != 'b'))) { - /* start of binary data */ - int binary_count; /* length of b256 data */ + process_buffer[0] = process_buffer[4]; + process_buffer[1] = process_buffer[5]; + process_buffer[2] = process_buffer[6]; + process_buffer[3] = process_buffer[7]; + process_buffer[4] = 0; + process_buffer[5] = 0; + process_buffer[6] = 0; + process_buffer[7] = 0; + *process_p -= 4; + } + } - for(binary_count = 0; binary[binary_count + i] == 'b'; binary_count++); + /* step (g) Base 256 encodation */ + if (current_mode == DM_BASE256) { + next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1); - if(binary_count <= 249) { - dminsert(binary, i, 'b'); - insert_value(target, i, tp, binary_count); tp++; - } else { - dminsert(binary, i, 'b'); - dminsert(binary, i + 1, 'b'); - insert_value(target, i, tp, (binary_count / 250) + 249); tp++; - insert_value(target, i + 1, tp, binary_count % 250); tp++; - } - } - } - i++; - } + if (next_mode == DM_BASE256) { + target[tp] = source[sp]; + if (debug) printf("B%02X ", target[tp]); + tp++; + sp++; + concat(binary, "b"); + } else { + next_mode = DM_ASCII; + if (debug) printf("ASC "); + } + } - for(i = 0; i < tp; i++) { - if(binary[i] == 'b') { - int prn, temp; + if (tp > 1558) { + return 0; + } - prn = ((149 * (i + 1)) % 255) + 1; - temp = target[i] + prn; - if (temp <= 255) { target[i] = temp; } else { target[i] = temp - 256; } - } - } + } /* while */ - *(last_mode) = current_mode; - return tp; + /* Add length and randomising algorithm to b256 */ + i = 0; + while (i < tp) { + if (binary[i] == 'b') { + if ((i == 0) || ((i != 0) && (binary[i - 1] != 'b'))) { + /* start of binary data */ + int binary_count; /* length of b256 data */ + + for (binary_count = 0; binary[binary_count + i] == 'b'; binary_count++); + + if (binary_count <= 249) { + dminsert(binary, i, 'b'); + insert_value(target, i, tp, binary_count); + tp++; + } else { + dminsert(binary, i, 'b'); + dminsert(binary, i + 1, 'b'); + insert_value(target, i, tp, (binary_count / 250) + 249); + tp++; + insert_value(target, i + 1, tp, binary_count % 250); + tp++; + } + } + } + i++; + } + + for (i = 0; i < tp; i++) { + if (binary[i] == 'b') { + int prn, temp; + + prn = ((149 * (i + 1)) % 255) + 1; + temp = target[i] + prn; + if (temp <= 255) { + target[i] = temp; + } else { + target[i] = temp - 256; + } + } + } + + *(last_mode) = current_mode; + return tp; } -int dm200encode_remainder(unsigned char target[], int target_length, unsigned char source[], int inputlen, int last_mode, int process_buffer[], int process_p, int symbols_left) -{ - int debug = 0; +int dm200encode_remainder(unsigned char target[], int target_length, unsigned char source[], int inputlen, int last_mode, int process_buffer[], int process_p, int symbols_left) { + int debug = 0; - switch (last_mode) - { - case DM_C40: - case DM_TEXT: - if (symbols_left == process_p) // No unlatch required! - { - if (process_p == 1) // 1 data character left to encode. - { - target[target_length] = source[inputlen - 1] + 1; target_length++; - } + switch (last_mode) { + case DM_C40: + case DM_TEXT: + if (symbols_left == process_p) // No unlatch required! + { + if (process_p == 1) // 1 data character left to encode. + { + target[target_length] = source[inputlen - 1] + 1; + target_length++; + } - if (process_p == 2) // 2 data characters left to encode. - { - // Pad with shift 1 value (0) and encode as double. - int intValue = (1600 * process_buffer[0]) + (40 * process_buffer[1]) + 1; // ie (0 + 1). - target[target_length] = (unsigned char)(intValue / 256); target_length++; - target[target_length] = (unsigned char)(intValue % 256); target_length++; - } - } + if (process_p == 2) // 2 data characters left to encode. + { + // Pad with shift 1 value (0) and encode as double. + int intValue = (1600 * process_buffer[0]) + (40 * process_buffer[1]) + 1; // ie (0 + 1). + target[target_length] = (unsigned char) (intValue / 256); + target_length++; + target[target_length] = (unsigned char) (intValue % 256); + target_length++; + } + } - if (symbols_left > process_p) - { - target[target_length] = (254); target_length++; // Unlatch and encode remaining data in ascii. - if (process_p == 1 || (process_p == 2 && process_buffer[0] < 3)) // Check for a shift value. - { - target[target_length] = source[inputlen - 1] + 1; target_length++; - } + if (symbols_left > process_p) { + target[target_length] = (254); + target_length++; // Unlatch and encode remaining data in ascii. + if (process_p == 1 || (process_p == 2 && process_buffer[0] < 3)) // Check for a shift value. + { + target[target_length] = source[inputlen - 1] + 1; + target_length++; + } + else if (process_p == 2) { + target[target_length] = source[inputlen - 2] + 1; + target_length++; + target[target_length] = source[inputlen - 1] + 1; + target_length++; + } + } + break; - else if (process_p == 2) - { - target[target_length] = source[inputlen - 2] + 1; target_length++; - target[target_length] = source[inputlen - 1] + 1; target_length++; - } - } - break; + case DM_X12: + if (symbols_left == process_p) // Unlatch not required! + { + if (process_p == 1) // 1 data character left to encode. + { + target[target_length] = source[inputlen - 1] + 1; + target_length++; + } - case DM_X12: - if (symbols_left == process_p) // Unlatch not required! - { - if (process_p == 1) // 1 data character left to encode. - { - target[target_length] = source[inputlen - 1] + 1; target_length++; - } + if (process_p == 2) { + // Encode last 2 bytes as ascii. + target[target_length] = source[inputlen - 2] + 1; + target_length++; + target[target_length] = source[inputlen - 1] + 1; + target_length++; + } + } - if (process_p == 2) - { - // Encode last 2 bytes as ascii. - target[target_length] = source[inputlen - 2] + 1; target_length++; - target[target_length] = source[inputlen - 1] + 1; target_length++; - } - } + if (symbols_left > process_p) // Unlatch and encode remaining data in ascii. + { + target[target_length] = (254); + target_length++; // Unlatch. + if (process_p == 1) { + target[target_length] = source[inputlen - 1] + 1; + target_length++; + } - if (symbols_left > process_p) // Unlatch and encode remaining data in ascii. - { - target[target_length] = (254); target_length++; // Unlatch. - if (process_p == 1) - { - target[target_length] = source[inputlen - 1] + 1; target_length++; - } + if (process_p == 2) { + target[target_length] = source[inputlen - 2] + 1; + target_length++; + target[target_length] = source[inputlen - 1] + 1; + target_length++; + } + } + break; - if (process_p == 2) - { - target[target_length] = source[inputlen - 2] + 1; target_length++; - target[target_length] = source[inputlen - 1] + 1; target_length++; - } - } - break; + case DM_EDIFACT: + if (symbols_left == process_p) // Unlatch not required! + { + if (process_p == 1) { + target[target_length] = source[inputlen - 1] + 1; + target_length++; + } - case DM_EDIFACT: - if (symbols_left == process_p) // Unlatch not required! - { - if (process_p == 1) - { - target[target_length] = source[inputlen - 1] + 1; target_length++; - } + if (process_p == 2) { + target[target_length] = source[inputlen - 2] + 1; + target_length++; + target[target_length] = source[inputlen - 1] + 1; + target_length++; + } - if (process_p == 2) - { - target[target_length] = source[inputlen - 2] + 1; target_length++; - target[target_length] = source[inputlen - 1] + 1; target_length++; - } + if (process_p == 3) // Append edifact unlatch value (31) and encode as triple. + { + target[target_length] = (unsigned char) ((process_buffer[0] << 2) + ((process_buffer[1] & 0x30) >> 4)); + target_length++; + target[target_length] = (unsigned char) (((process_buffer[1] & 0x0f) << 4) + ((process_buffer[2] & 0x3c) >> 2)); + target_length++; + target[target_length] = (unsigned char) (((process_buffer[2] & 0x03) << 6) + 31); + target_length++; + } + } - if (process_p == 3) // Append edifact unlatch value (31) and encode as triple. - { - target[target_length] = (unsigned char)((process_buffer[0] << 2) + ((process_buffer[1] & 0x30) >> 4)); target_length++; - target[target_length] = (unsigned char)(((process_buffer[1] & 0x0f) << 4) + ((process_buffer[2] & 0x3c) >> 2)); target_length++; - target[target_length] = (unsigned char)(((process_buffer[2] & 0x03) << 6) + 31); target_length++; - } - } + if (symbols_left > process_p) // Unlatch and encode remaining data in ascii. + { + // Edifact unlatch. + if (symbols_left < 3) { + target[target_length] = 31; + target_length++; + } + else + target[target_length] = (31 << 2); + target_length++; - if (symbols_left > process_p) // Unlatch and encode remaining data in ascii. - { - // Edifact unlatch. - if (symbols_left < 3) - { - target[target_length] = 31; target_length++; - } + if (process_p == 1) { + target[target_length] = source[inputlen - 1] + 1; + target_length++; + } - else - target[target_length] = (31 << 2); target_length++; + if (process_p == 2) { + target[target_length] = source[inputlen - 2] + 1; + target_length++; + target[target_length] = source[inputlen - 1] + 1; + target_length++; + } - if (process_p == 1) - { - target[target_length] = source[inputlen - 1] + 1; target_length++; - } + if (process_p == 3) { + target[target_length] = source[inputlen - 3] + 1; + target_length++; + target[target_length] = source[inputlen - 2] + 1; + target_length++; + target[target_length] = source[inputlen - 1] + 1; + target_length++; + } + } + break; + } - if (process_p == 2) - { - target[target_length] = source[inputlen - 2] + 1; target_length++; - target[target_length] = source[inputlen - 1] + 1; target_length++; - } + if (debug) { + int i; + printf("\n\n"); + for (i = 0; i < target_length; i++) + printf("%03d ", target[i]); - if (process_p == 3) - { - target[target_length] = source[inputlen - 3] + 1; target_length++; - target[target_length] = source[inputlen - 2] + 1; target_length++; - target[target_length] = source[inputlen - 1] + 1; target_length++; - } - } - break; - } + printf("\n"); + } - if(debug) - { - int i; - printf("\n\n"); - for(i = 0; i < target_length; i++) - printf("%03d ", target[i]); - - printf("\n"); - } - - return target_length; - } - -void add_tail(unsigned char target[], int tp, int tail_length) -{ - /* add pad bits */ - int i, prn, temp; - - for(i = tail_length; i > 0; i--) { - if(i == tail_length) { - target[tp] = 129; tp++; /* Pad */ - } else { - prn = ((149 * (tp + 1)) % 253) + 1; - temp = 129 + prn; - if(temp <= 254) { - target[tp] = temp; tp++; - } else { - target[tp] = temp - 254; tp++; - } - } - } + return target_length; } -int data_matrix_200(struct zint_symbol *symbol, unsigned char source[], int length) -{ - int inputlen, i, skew = 0; - unsigned char binary[2200]; - int binlen; - int process_buffer[8]; /* holds remaining data to finalised */ - int process_p; /* number of characters left to finalise */ - int symbolsize, optionsize, calcsize; - int taillength, error_number = 0; - int H, W, FH, FW, datablock, bytes, rsblock; - int last_mode; - unsigned char *grid = 0; - int symbols_left; - inputlen = length; +/* add pad bits */ +void add_tail(unsigned char target[], int tp, int tail_length) { + int i, prn, temp; - /* inputlen may be decremented by 2 if macro character is used */ - binlen = dm200encode(symbol, source, binary, &last_mode, &inputlen, process_buffer, &process_p); + for (i = tail_length; i > 0; i--) { + if (i == tail_length) { + target[tp] = 129; + tp++; /* Pad */ + } else { + prn = ((149 * (tp + 1)) % 253) + 1; + temp = 129 + prn; + if (temp <= 254) { + target[tp] = temp; + tp++; + } else { + target[tp] = temp - 254; + tp++; + } + } + } +} - if(binlen == 0) { - strcpy(symbol->errtxt, "Data too long to fit in symbol"); - return ZINT_ERROR_TOO_LONG; - } +int data_matrix_200(struct zint_symbol *symbol, unsigned char source[], int length) { + int inputlen, i, skew = 0; + unsigned char binary[2200]; + int binlen; + int process_buffer[8]; /* holds remaining data to finalised */ + int process_p; /* number of characters left to finalise */ + int symbolsize, optionsize, calcsize; + int taillength, error_number = 0; + int H, W, FH, FW, datablock, bytes, rsblock; + int last_mode; + unsigned char *grid = 0; + int symbols_left; + inputlen = length; - if((symbol->option_2 >= 1) && (symbol->option_2 <= DMSIZESCOUNT)) { - optionsize = intsymbol[symbol->option_2 - 1]; - } else { - optionsize = -1; - } + /* inputlen may be decremented by 2 if macro character is used */ + binlen = dm200encode(symbol, source, binary, &last_mode, &inputlen, process_buffer, &process_p); - calcsize = DMSIZESCOUNT-1; - for(i = DMSIZESCOUNT-1; i > -1; i--) { - if(matrixbytes[i] >= (binlen + process_p)) // Allow for the remaining data characters. - { - calcsize = i; - } - } + if (binlen == 0) { + strcpy(symbol->errtxt, "Data too long to fit in symbol"); + return ZINT_ERROR_TOO_LONG; + } - /* Skip rectangular symbols in square only mode */ - while(symbol->option_3 == DM_SQUARE && matrixH[calcsize] != matrixW[calcsize]) { - calcsize++; - } + if ((symbol->option_2 >= 1) && (symbol->option_2 <= DMSIZESCOUNT)) { + optionsize = intsymbol[symbol->option_2 - 1]; + } else { + optionsize = -1; + } - symbolsize = optionsize; - if(calcsize > optionsize) { - symbolsize = calcsize; - if(optionsize != -1) { - /* flag an error */ - error_number = ZINT_WARN_INVALID_OPTION; - strcpy(symbol->errtxt, "Data does not fit in selected symbol size"); - } - } + calcsize = DMSIZESCOUNT - 1; + for (i = DMSIZESCOUNT - 1; i > -1; i--) { + if (matrixbytes[i] >= (binlen + process_p)) { + // Allow for the remaining data characters + calcsize = i; + } + } - // Now we know the symbol size we can handle the remaining data in the process buffer. - symbols_left = matrixbytes[symbolsize] - binlen; + /* Skip rectangular symbols in square only mode */ + while (symbol->option_3 == DM_SQUARE && matrixH[calcsize] != matrixW[calcsize]) { + calcsize++; + } + + symbolsize = optionsize; + if (calcsize > optionsize) { + symbolsize = calcsize; + if (optionsize != -1) { + /* flag an error */ + error_number = ZINT_WARN_INVALID_OPTION; + strcpy(symbol->errtxt, "Data does not fit in selected symbol size"); + } + } + + // Now we know the symbol size we can handle the remaining data in the process buffer. + symbols_left = matrixbytes[symbolsize] - binlen; binlen = dm200encode_remainder(binary, binlen, source, inputlen, last_mode, process_buffer, process_p, symbols_left); - H = matrixH[symbolsize]; - W = matrixW[symbolsize]; - FH = matrixFH[symbolsize]; - FW = matrixFW[symbolsize]; - bytes = matrixbytes[symbolsize]; - datablock = matrixdatablock[symbolsize]; - rsblock = matrixrsblock[symbolsize]; + H = matrixH[symbolsize]; + W = matrixW[symbolsize]; + FH = matrixFH[symbolsize]; + FW = matrixFW[symbolsize]; + bytes = matrixbytes[symbolsize]; + datablock = matrixdatablock[symbolsize]; + rsblock = matrixrsblock[symbolsize]; - taillength = bytes - binlen; + taillength = bytes - binlen; - if(taillength != 0) { - add_tail(binary, binlen, taillength); - } + if (taillength != 0) { + add_tail(binary, binlen, taillength); + } - // ecc code - if(symbolsize == INTSYMBOL144) { skew = 1; } - ecc200(binary, bytes, datablock, rsblock, skew); - // Print Codewords - #ifdef DEBUG - { - int CWCount; - if (skew) - CWCount = 1558+620; - else - CWCount = bytes + rsblock * (bytes / datablock); - printf("Codewords (%i):",CWCount); - for (int posCur = 0;posCur < CWCount;posCur++) - printf(" %3i",binary[posCur]); - puts("\n"); - } - #endif - { // placement - int x, y, NC, NR, *places; - NC = W - 2 * (W / FW); - NR = H - 2 * (H / FH); - places = (int*)malloc(NC * NR * sizeof(int)); - ecc200placement(places, NR, NC); - grid = (unsigned char*)malloc(W * H); - memset(grid, 0, W * H); - for (y = 0; y < H; y += FH) { - for (x = 0; x < W; x++) - grid[y * W + x] = 1; - for (x = 0; x < W; x += 2) - grid[(y + FH - 1) * W + x] = 1; - } - for (x = 0; x < W; x += FW) { - for (y = 0; y < H; y++) - grid[y * W + x] = 1; - for (y = 0; y < H; y += 2) - grid[y * W + x + FW - 1] = 1; - } - #ifdef DEBUG - // Print position matrix as in standard - for (y = NR-1; y >= 0; y--) { - for (x = 0; x < NC; x++) { - if (x != 0) - fprintf (stderr, "|"); - int v = places[(NR - y - 1) * NC + x]; - fprintf(stderr,"%3d.%2d",(v>>3),8-(v&7)); - } - fprintf (stderr, "\n"); - } - #endif - for (y = 0; y < NR; y++) { - for (x = 0; x < NC; x++) { - int v = places[(NR - y - 1) * NC + x]; - //fprintf (stderr, "%4d", v); - if (v == 1 || (v > 7 && (binary[(v >> 3) - 1] & (1 << (v & 7))))) - grid[(1 + y + 2 * (y / (FH - 2))) * W + 1 + x + 2 * (x / (FW - 2))] = 1; - } - //fprintf (stderr, "\n"); - } - for(y = H - 1; y >= 0; y--) { - int x; - for(x = 0; x < W; x++) { - if(grid[W * y + x]) { - set_module(symbol, (H - y) - 1, x); - } - } - symbol->row_height[(H - y) - 1] = 1; - } - free(grid); - free(places); - } + // ecc code + if (symbolsize == INTSYMBOL144) { + skew = 1; + } + ecc200(binary, bytes, datablock, rsblock, skew); + // Print Codewords +#ifdef DEBUG + { + int CWCount; + if (skew) + CWCount = 1558 + 620; + else + CWCount = bytes + rsblock * (bytes / datablock); + printf("Codewords (%i):", CWCount); + for (int posCur = 0; posCur < CWCount; posCur++) + printf(" %3i", binary[posCur]); + puts("\n"); + } +#endif + { // placement + int x, y, NC, NR, *places; + NC = W - 2 * (W / FW); + NR = H - 2 * (H / FH); + places = (int*) malloc(NC * NR * sizeof (int)); + ecc200placement(places, NR, NC); + grid = (unsigned char*) malloc(W * H); + memset(grid, 0, W * H); + for (y = 0; y < H; y += FH) { + for (x = 0; x < W; x++) + grid[y * W + x] = 1; + for (x = 0; x < W; x += 2) + grid[(y + FH - 1) * W + x] = 1; + } + for (x = 0; x < W; x += FW) { + for (y = 0; y < H; y++) + grid[y * W + x] = 1; + for (y = 0; y < H; y += 2) + grid[y * W + x + FW - 1] = 1; + } +#ifdef DEBUG + // Print position matrix as in standard + for (y = NR - 1; y >= 0; y--) { + for (x = 0; x < NC; x++) { + if (x != 0) + fprintf(stderr, "|"); + int v = places[(NR - y - 1) * NC + x]; + fprintf(stderr, "%3d.%2d", (v >> 3), 8 - (v & 7)); + } + fprintf(stderr, "\n"); + } +#endif + for (y = 0; y < NR; y++) { + for (x = 0; x < NC; x++) { + int v = places[(NR - y - 1) * NC + x]; + //fprintf (stderr, "%4d", v); + if (v == 1 || (v > 7 && (binary[(v >> 3) - 1] & (1 << (v & 7))))) + grid[(1 + y + 2 * (y / (FH - 2))) * W + 1 + x + 2 * (x / (FW - 2))] = 1; + } + //fprintf (stderr, "\n"); + } + for (y = H - 1; y >= 0; y--) { + int x; + for (x = 0; x < W; x++) { + if (grid[W * y + x]) { + set_module(symbol, (H - y) - 1, x); + } + } + symbol->row_height[(H - y) - 1] = 1; + } + free(grid); + free(places); + } - symbol->rows = H; - symbol->width = W; + symbol->rows = H; + symbol->width = W; - return error_number; + return error_number; } -int dmatrix(struct zint_symbol *symbol, unsigned char source[], int length) -{ - int error_number; +int dmatrix(struct zint_symbol *symbol, unsigned char source[], int length) { + int error_number; - if(symbol->option_1 <= 1) { - /* ECC 200 */ - error_number = data_matrix_200(symbol, source, length); - } else { - /* ECC 000 - 140 */ - strcpy(symbol->errtxt, "Older Data Matrix standards are no longer supported"); - error_number = ZINT_ERROR_INVALID_OPTION; - } + if (symbol->option_1 <= 1) { + /* ECC 200 */ + error_number = data_matrix_200(symbol, source, length); + } else { + /* ECC 000 - 140 */ + strcpy(symbol->errtxt, "Older Data Matrix standards are no longer supported"); + error_number = ZINT_ERROR_INVALID_OPTION; + } - return error_number; + return error_number; } diff --git a/backend/dmatrix.h b/backend/dmatrix.h index 19705a2e..3df50596 100644 --- a/backend/dmatrix.h +++ b/backend/dmatrix.h @@ -2,7 +2,7 @@ /* libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart + Copyright (C) 2009-2016 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -28,7 +28,7 @@ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + */ /* Containes Extended Rectangular Data Matrix (DMRE) @@ -41,11 +41,10 @@ #ifndef __IEC16022ECC200_H #define __IEC16022ECC200_H #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif /* __cplusplus */ -extern int data_matrix_200(struct zint_symbol *symbol, unsigned char source[], int length); + extern int data_matrix_200(struct zint_symbol *symbol, unsigned char source[], int length); #ifdef __cplusplus } @@ -62,28 +61,32 @@ extern int data_matrix_200(struct zint_symbol *symbol, unsigned char source[], i #define DM_BASE256 6 static const int c40_shift[] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; - + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 +}; + static const int c40_value[] = { - 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, - 3,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,4,5,6,7,8,9,10,11,12,13, - 15,16,17,18,19,20,21,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39, - 22,23,24,25,26,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 }; - + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 15, 16, 17, 18, 19, 20, 21, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 22, 23, 24, 25, 26, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 +}; + static const int text_shift[] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 2, 2, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3 }; + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3 +}; static const int text_value[] = { - 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, - 3,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,4,5,6,7,8,9,10,11,12,13, - 15,16,17,18,19,20,21,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26, - 22,23,24,25,26,0,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,27,28,29,30,31 }; + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 15, 16, 17, 18, 19, 20, 21, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 22, 23, 24, 25, 26, 0, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 27, 28, 29, 30, 31 +}; // Activate DMRE Extensions //#define DMRE @@ -92,20 +95,21 @@ static const int text_value[] = { // Position in option array [symbol option value - 1] // The position in the option array is by increasing total data codewords with square first - + static const int intsymbol[] = { - 0, /* 1: 10x10 , 3*/ 1, /* 2: 12x12 , 5*/ 3, /* 3: 14x14 , 8*/ 5, /* 4: 16x16 , 12*/ - 7, /* 5: 18x18 , 18*/ 9, /* 6: 20x20 , 22*/ 12, /* 7: 22x22 , 30*/ 14, /* 8: 24x24 , 36*/ - 16, /* 9: 26x26 , 44*/ 21, /* 10: 32x32 , 62*/ 25, /* 11: 36x36 , 86*/ 28, /* 12: 40x40 ,114*/ - 30, /* 13: 44x44 ,144*/ 31, /* 14: 48x48 ,174*/ 32, /* 15: 52x52 ,204*/ 33, /* 16: 64x64 ,280*/ - 34, /* 17: 72x72 ,368*/ 35, /* 18: 80x80 ,456*/ 36, /* 19: 88x88 ,576*/ 37, /* 20: 96x96 ,696*/ - 38, /* 21:104x104,816*/ 39, /* 22:120x120,1050*/40, /* 23:132x132,1304*/41, /* 24:144x144,1558*/ - 2, /* 25: 8x18 , 5*/ 4, /* 26: 8x32 , 10*/ 6, /* 27: 12x26 , 16*/ 10, /* 28: 12x36 , 22*/ - 13, /* 29: 16x36 , 32*/ 17, /* 30: 16x48 , 49*/ 8, /* 31: 8x48 , 18*/ 11, /* 32: 8x64 , 24*/ - 15, /* 33: 12x64 , 43*/ 22, /* 34: 16x64 , 62*/ 18, /* 35: 24x32 , 49*/ 20, /* 36: 24x36 , 55*/ - 24, /* 37: 24x48 , 80*/ 27, /* 38: 24x64 ,108*/ 19, /* 39: 26x32 , 52*/ 23, /* 40: 26x40 , 70*/ - 26, /* 41: 26x48 , 90*/ 29, /* 42: 26x64 ,118*/ - 0 }; + 0, /* 1: 10x10 , 3*/ 1, /* 2: 12x12 , 5*/ 3, /* 3: 14x14 , 8*/ 5, /* 4: 16x16 , 12*/ + 7, /* 5: 18x18 , 18*/ 9, /* 6: 20x20 , 22*/ 12, /* 7: 22x22 , 30*/ 14, /* 8: 24x24 , 36*/ + 16, /* 9: 26x26 , 44*/ 21, /* 10: 32x32 , 62*/ 25, /* 11: 36x36 , 86*/ 28, /* 12: 40x40 ,114*/ + 30, /* 13: 44x44 ,144*/ 31, /* 14: 48x48 ,174*/ 32, /* 15: 52x52 ,204*/ 33, /* 16: 64x64 ,280*/ + 34, /* 17: 72x72 ,368*/ 35, /* 18: 80x80 ,456*/ 36, /* 19: 88x88 ,576*/ 37, /* 20: 96x96 ,696*/ + 38, /* 21:104x104,816*/ 39, /* 22:120x120,1050*/40, /* 23:132x132,1304*/41, /* 24:144x144,1558*/ + 2, /* 25: 8x18 , 5*/ 4, /* 26: 8x32 , 10*/ 6, /* 27: 12x26 , 16*/ 10, /* 28: 12x36 , 22*/ + 13, /* 29: 16x36 , 32*/ 17, /* 30: 16x48 , 49*/ 8, /* 31: 8x48 , 18*/ 11, /* 32: 8x64 , 24*/ + 15, /* 33: 12x64 , 43*/ 22, /* 34: 16x64 , 62*/ 18, /* 35: 24x32 , 49*/ 20, /* 36: 24x36 , 55*/ + 24, /* 37: 24x48 , 80*/ 27, /* 38: 24x64 ,108*/ 19, /* 39: 26x32 , 52*/ 23, /* 40: 26x40 , 70*/ + 26, /* 41: 26x48 , 90*/ 29, /* 42: 26x64 ,118*/ + 0 +}; // Number of DM Sizes #define DMSIZESCOUNT 42 @@ -115,120 +119,121 @@ static const int intsymbol[] = { // Horizontal matrix size static const int matrixH[] = { -/*0*/ 10, /* 10x10 ,3 */ 12, /* 12x12 ,5 */ 8, /* 8x18 ,5 */ 14, /* 14x14 , 8 */ -/*4*/ 8, /* 8x32 ,10 */ 16, /* 16x16 ,12 */ 12, /* 12x26 ,16 */ 18, /* 18x18 ,18 */ -/*8*/ 8, /* 8x48 ,18 */ 20, /* 20x20 ,22 */ 12, /* 12x36 ,22 */ 8, /* 8x64 ,24 */ -/*12*/ 22, /* 22x22 ,30 */ 16, /* 16x36 ,32 */ 24, /* 24x24 ,36 */ 12, /* 12x64 ,43 */ -/*16*/ 26, /* 26x26 ,44 */ 16, /* 16x48 ,49 */ 24, /* 24x32 ,49 */ 26, /* 26x32 ,52 */ -/*20*/ 24, /* 24x36 ,55 */ 32, /* 32x32 ,62 */ 16, /* 16x64 ,62 */ 26, /* 26x40 ,70 */ -/*24*/ 24, /* 24x48 ,80 */ 36, /* 36x36 ,86 */ 26, /* 26x48 ,90 */ 24, /* 24x64 ,108*/ -/*28*/ 40, /* 40x40 ,114*/ 26, /* 26x64 ,118*/ 44, /* 44x44 ,144*/ 48, /* 48x48,174 */ -/*32*/ 52, /* 52x52,204 */ 64, /* 64x64,280 */ 72, /* 72x72,368 */ 80, /* 80x80,456 */ -/*36*/ 88, /* 88x88,576 */ 96, /* 96x96,696 */ 104,/*104x104,816*/ 120,/*120x120,1050*/ -/*40*/ 132,/*132x132,1304*/144/*144x144,1558*/ - }; + /*0*/ 10, /* 10x10 ,3 */ 12, /* 12x12 ,5 */ 8, /* 8x18 ,5 */ 14, /* 14x14 , 8 */ + /*4*/ 8, /* 8x32 ,10 */ 16, /* 16x16 ,12 */ 12, /* 12x26 ,16 */ 18, /* 18x18 ,18 */ + /*8*/ 8, /* 8x48 ,18 */ 20, /* 20x20 ,22 */ 12, /* 12x36 ,22 */ 8, /* 8x64 ,24 */ + /*12*/ 22, /* 22x22 ,30 */ 16, /* 16x36 ,32 */ 24, /* 24x24 ,36 */ 12, /* 12x64 ,43 */ + /*16*/ 26, /* 26x26 ,44 */ 16, /* 16x48 ,49 */ 24, /* 24x32 ,49 */ 26, /* 26x32 ,52 */ + /*20*/ 24, /* 24x36 ,55 */ 32, /* 32x32 ,62 */ 16, /* 16x64 ,62 */ 26, /* 26x40 ,70 */ + /*24*/ 24, /* 24x48 ,80 */ 36, /* 36x36 ,86 */ 26, /* 26x48 ,90 */ 24, /* 24x64 ,108*/ + /*28*/ 40, /* 40x40 ,114*/ 26, /* 26x64 ,118*/ 44, /* 44x44 ,144*/ 48, /* 48x48,174 */ + /*32*/ 52, /* 52x52,204 */ 64, /* 64x64,280 */ 72, /* 72x72,368 */ 80, /* 80x80,456 */ + /*36*/ 88, /* 88x88,576 */ 96, /* 96x96,696 */ 104, /*104x104,816*/ 120, /*120x120,1050*/ + /*40*/ 132, /*132x132,1304*/144/*144x144,1558*/ +}; // Vertical matrix sizes static const int matrixW[] = { -/*0*/ 10, /* 10x10 */ 12, /* 12x12 */ 18, /* 8x18 */ 14, /* 14x14 */ -/*4*/ 32, /* 8x32 */ 16, /* 16x16 */ 26, /* 12x26 */ 18, /* 18x18 */ -/*8*/ 48, /* 8x48 */ 20, /* 20x20 */ 36, /* 12x36 */ 64, /* 8x64 */ -/*12*/ 22, /* 22x22 */ 36, /* 16x36 */ 24, /* 24x24 */ 64, /* 12x64 */ -/*16*/ 26, /* 26x26 */ 48, /* 16x48 */ 32, /* 24x32 */ 32, /* 26x32 */ -/*20*/ 36, /* 24x36 */ 32, /* 32x32 */ 64, /* 16x64 */ 40, /* 26x40 */ -/*24*/ 48, /* 24x48 */ 36, /* 36x36 */ 48, /* 26x48 */ 64, /* 24x64 */ -/*28*/ 40, /* 40x40 */ 64, /* 26x64 */ 44, /* 44x44 */ 48, /* 48x48 */ -/*32*/ 52, /* 52x52 */ 64, /* 64x64 */ 72, /* 72x72 */ 80, /* 80x80 */ -/*36*/ 88, /* 88x88 */ 96, /* 96x96 */ 104,/*104x104*/ 120,/*120x120*/ -/*40*/ 132,/*132x132*/ 144 /*144x144*/ - }; + /*0*/ 10, /* 10x10 */ 12, /* 12x12 */ 18, /* 8x18 */ 14, /* 14x14 */ + /*4*/ 32, /* 8x32 */ 16, /* 16x16 */ 26, /* 12x26 */ 18, /* 18x18 */ + /*8*/ 48, /* 8x48 */ 20, /* 20x20 */ 36, /* 12x36 */ 64, /* 8x64 */ + /*12*/ 22, /* 22x22 */ 36, /* 16x36 */ 24, /* 24x24 */ 64, /* 12x64 */ + /*16*/ 26, /* 26x26 */ 48, /* 16x48 */ 32, /* 24x32 */ 32, /* 26x32 */ + /*20*/ 36, /* 24x36 */ 32, /* 32x32 */ 64, /* 16x64 */ 40, /* 26x40 */ + /*24*/ 48, /* 24x48 */ 36, /* 36x36 */ 48, /* 26x48 */ 64, /* 24x64 */ + /*28*/ 40, /* 40x40 */ 64, /* 26x64 */ 44, /* 44x44 */ 48, /* 48x48 */ + /*32*/ 52, /* 52x52 */ 64, /* 64x64 */ 72, /* 72x72 */ 80, /* 80x80 */ + /*36*/ 88, /* 88x88 */ 96, /* 96x96 */ 104, /*104x104*/ 120, /*120x120*/ + /*40*/ 132, /*132x132*/ 144 /*144x144*/ +}; // Horizontal submodule size (including subfinder) static const int matrixFH[] = { -/*0*/ 10, /* 10x10 */ 12, /* 12x12 */ 8, /* 8x18 */ 14, /* 14x14 */ -/*4*/ 8, /* 8x32 */ 16, /* 16x16 */ 12, /* 12x26 */ 18, /* 18x18 */ -/*8*/ 8, /* 8x48 */ 20, /* 20x20 */ 12, /* 12x36 */ 8, /* 8x64 */ -/*12*/ 22, /* 22x22 */ 16, /* 16x36 */ 24, /* 24x24 */ 12, /* 12x64 */ -/*16*/ 26, /* 26x26 */ 16, /* 16x48 */ 24, /* 24x32 */ 26, /* 26x32 */ -/*20*/ 24, /* 24x36 */ 16, /* 32x32 */ 16, /* 16x64 */ 26, /* 26x40 */ -/*24*/ 24, /* 24x48 */ 18, /* 36x36 */ 26, /* 26x48 */ 24, /* 24x64 */ -/*28*/ 20, /* 40x40 */ 26, /* 26x64 */ 22, /* 44x44 */ 24, /* 48x48 */ -/*32*/ 26, /* 52x52 */ 16, /* 64x64 */ 18, /* 72x72 */ 20, /* 80x80 */ -/*36*/ 22, /* 88x88 */ 24, /* 96x96 */ 26, /*104x104*/ 20, /*120x120*/ -/*40*/ 22, /*132x132*/ 24 /*144x144*/ - }; + /*0*/ 10, /* 10x10 */ 12, /* 12x12 */ 8, /* 8x18 */ 14, /* 14x14 */ + /*4*/ 8, /* 8x32 */ 16, /* 16x16 */ 12, /* 12x26 */ 18, /* 18x18 */ + /*8*/ 8, /* 8x48 */ 20, /* 20x20 */ 12, /* 12x36 */ 8, /* 8x64 */ + /*12*/ 22, /* 22x22 */ 16, /* 16x36 */ 24, /* 24x24 */ 12, /* 12x64 */ + /*16*/ 26, /* 26x26 */ 16, /* 16x48 */ 24, /* 24x32 */ 26, /* 26x32 */ + /*20*/ 24, /* 24x36 */ 16, /* 32x32 */ 16, /* 16x64 */ 26, /* 26x40 */ + /*24*/ 24, /* 24x48 */ 18, /* 36x36 */ 26, /* 26x48 */ 24, /* 24x64 */ + /*28*/ 20, /* 40x40 */ 26, /* 26x64 */ 22, /* 44x44 */ 24, /* 48x48 */ + /*32*/ 26, /* 52x52 */ 16, /* 64x64 */ 18, /* 72x72 */ 20, /* 80x80 */ + /*36*/ 22, /* 88x88 */ 24, /* 96x96 */ 26, /*104x104*/ 20, /*120x120*/ + /*40*/ 22, /*132x132*/ 24 /*144x144*/ +}; // Vertical submodule size (including subfinder) static const int matrixFW[] = { -/*0*/ 10, /* 10x10 */ 12, /* 12x12 */ 18, /* 8x18 */ 14, /* 14x14 */ -/*4*/ 16, /* 8x32 */ 16, /* 16x16 */ 26, /* 12x26 */ 18, /* 18x18 */ -/*8*/ 24, /* 8x48 */ 20, /* 20x20 */ 18, /* 12x36 */ 16, /* 8x64 */ -/*12*/ 22, /* 22x22 */ 18, /* 16x36 */ 24, /* 24x24 */ 16, /* 12x64 */ -/*16*/ 26, /* 26x26 */ 24, /* 16x48 */ 16, /* 24x32 */ 16, /* 26x32 */ -/*20*/ 18, /* 24x36 */ 16, /* 32x32 */ 16, /* 16x64 */ 20, /* 26x40 */ -/*24*/ 24, /* 24x48 */ 18, /* 36x36 */ 24, /* 26x48 */ 16, /* 24x64 */ -/*28*/ 20, /* 40x40 */ 16, /* 26x64 */ 22, /* 44x44 */ 24, /* 48x48 */ -/*32*/ 26, /* 52x52 */ 16, /* 64x64 */ 18, /* 72x72 */ 20, /* 80x80 */ -/*36*/ 22, /* 88x88 */ 24, /* 96x96 */ 26, /*104x104*/ 20, /*120x120*/ -/*40*/ 22, /*132x132*/ 24 /*144x144*/ - }; + /*0*/ 10, /* 10x10 */ 12, /* 12x12 */ 18, /* 8x18 */ 14, /* 14x14 */ + /*4*/ 16, /* 8x32 */ 16, /* 16x16 */ 26, /* 12x26 */ 18, /* 18x18 */ + /*8*/ 24, /* 8x48 */ 20, /* 20x20 */ 18, /* 12x36 */ 16, /* 8x64 */ + /*12*/ 22, /* 22x22 */ 18, /* 16x36 */ 24, /* 24x24 */ 16, /* 12x64 */ + /*16*/ 26, /* 26x26 */ 24, /* 16x48 */ 16, /* 24x32 */ 16, /* 26x32 */ + /*20*/ 18, /* 24x36 */ 16, /* 32x32 */ 16, /* 16x64 */ 20, /* 26x40 */ + /*24*/ 24, /* 24x48 */ 18, /* 36x36 */ 24, /* 26x48 */ 16, /* 24x64 */ + /*28*/ 20, /* 40x40 */ 16, /* 26x64 */ 22, /* 44x44 */ 24, /* 48x48 */ + /*32*/ 26, /* 52x52 */ 16, /* 64x64 */ 18, /* 72x72 */ 20, /* 80x80 */ + /*36*/ 22, /* 88x88 */ 24, /* 96x96 */ 26, /*104x104*/ 20, /*120x120*/ + /*40*/ 22, /*132x132*/ 24 /*144x144*/ +}; // Total Data Codewords static const int matrixbytes[] = { -/*0*/ 3, /* 10x10 */ 5, /* 12x12 */ 5, /* 8x18 */ 8, /* 14x14 */ -/*4*/ 10, /* 8x32 */ 12, /* 16x16 */ 16, /* 12x26 */ 18, /* 18x18 */ -/*8*/ 18, /* 8x48 */ 22, /* 20x20 */ 22, /* 12x36 */ 24, /* 8x64 */ -/*12*/ 30, /* 22x22 */ 32, /* 16x36 */ 36, /* 24x24 */ 43, /* 12x64 */ -/*16*/ 44, /* 26x26 */ 49, /* 16x48 */ 49, /* 24x32 */ 52, /* 26x32 */ -/*20*/ 55, /* 24x36 */ 62, /* 32x32 */ 62, /* 16x64 */ 70, /* 26x40 */ -/*24*/ 80, /* 24x48 */ 86, /* 36x36 */ 90, /* 26x48 */ 108, /* 24x64 */ -/*28*/ 114, /* 40x40 */ 118, /* 26x64 */ 144, /* 44x44 */ 174, /* 48x48 */ -/*32*/ 204, /* 52x52 */ 280, /* 64x64 */ 368, /* 72x72 */ 456, /* 80x80 */ -/*36*/ 576, /* 88x88 */ 696, /* 96x96 */ 816, /*104x104*/ 1050, /*120x120*/ -/*40*/ 1304, /*132x132*/ 1558 /*144x144*/ - }; + /*0*/ 3, /* 10x10 */ 5, /* 12x12 */ 5, /* 8x18 */ 8, /* 14x14 */ + /*4*/ 10, /* 8x32 */ 12, /* 16x16 */ 16, /* 12x26 */ 18, /* 18x18 */ + /*8*/ 18, /* 8x48 */ 22, /* 20x20 */ 22, /* 12x36 */ 24, /* 8x64 */ + /*12*/ 30, /* 22x22 */ 32, /* 16x36 */ 36, /* 24x24 */ 43, /* 12x64 */ + /*16*/ 44, /* 26x26 */ 49, /* 16x48 */ 49, /* 24x32 */ 52, /* 26x32 */ + /*20*/ 55, /* 24x36 */ 62, /* 32x32 */ 62, /* 16x64 */ 70, /* 26x40 */ + /*24*/ 80, /* 24x48 */ 86, /* 36x36 */ 90, /* 26x48 */ 108, /* 24x64 */ + /*28*/ 114, /* 40x40 */ 118, /* 26x64 */ 144, /* 44x44 */ 174, /* 48x48 */ + /*32*/ 204, /* 52x52 */ 280, /* 64x64 */ 368, /* 72x72 */ 456, /* 80x80 */ + /*36*/ 576, /* 88x88 */ 696, /* 96x96 */ 816, /*104x104*/ 1050, /*120x120*/ + /*40*/ 1304, /*132x132*/ 1558 /*144x144*/ +}; // Data Codewords per RS-Block static const int matrixdatablock[] = { -/*0*/ 3, /* 10x10 */ 5, /* 12x12 */ 5, /* 8x18 */ 8, /* 14x14 */ -/*4*/ 10, /* 8x32 */ 12, /* 16x16 */ 16, /* 12x26 */ 18, /* 18x18 */ -/*8*/ 18, /* 8x48 */ 22, /* 20x20 */ 22, /* 12x36 */ 24, /* 8x64 */ -/*12*/ 30, /* 22x22 */ 32, /* 16x36 */ 36, /* 24x24 */ 43, /* 12x64 */ -/*16*/ 44, /* 26x26 */ 49, /* 16x48 */ 49, /* 24x32 */ 52, /* 26x32 */ -/*20*/ 55, /* 24x36 */ 62, /* 32x32 */ 62, /* 16x64 */ 70, /* 26x40 */ -/*24*/ 80, /* 24x48 */ 86, /* 36x36 */ 90, /* 26x48 */ 108,/* 24x64 */ -/*28*/ 114,/* 40x40 */ 118,/* 26x64 */ 144,/* 44x44 */ 174,/* 48x48 */ -/*32*/ 102,/* 52x52 */ 140,/* 64x64 */ 92, /* 72x72 */ 114,/* 80x80 */ -/*36*/ 144,/* 88x88 */ 174,/* 96x96 */ 136,/*104x104*/ 175,/*120x120*/ -/*40*/ 163,/*132x132*/ 156 /*144x144*/ - }; + /*0*/ 3, /* 10x10 */ 5, /* 12x12 */ 5, /* 8x18 */ 8, /* 14x14 */ + /*4*/ 10, /* 8x32 */ 12, /* 16x16 */ 16, /* 12x26 */ 18, /* 18x18 */ + /*8*/ 18, /* 8x48 */ 22, /* 20x20 */ 22, /* 12x36 */ 24, /* 8x64 */ + /*12*/ 30, /* 22x22 */ 32, /* 16x36 */ 36, /* 24x24 */ 43, /* 12x64 */ + /*16*/ 44, /* 26x26 */ 49, /* 16x48 */ 49, /* 24x32 */ 52, /* 26x32 */ + /*20*/ 55, /* 24x36 */ 62, /* 32x32 */ 62, /* 16x64 */ 70, /* 26x40 */ + /*24*/ 80, /* 24x48 */ 86, /* 36x36 */ 90, /* 26x48 */ 108, /* 24x64 */ + /*28*/ 114, /* 40x40 */ 118, /* 26x64 */ 144, /* 44x44 */ 174, /* 48x48 */ + /*32*/ 102, /* 52x52 */ 140, /* 64x64 */ 92, /* 72x72 */ 114, /* 80x80 */ + /*36*/ 144, /* 88x88 */ 174, /* 96x96 */ 136, /*104x104*/ 175, /*120x120*/ + /*40*/ 163, /*132x132*/ 156 /*144x144*/ +}; // ECC Codewords per RS-Block static const int matrixrsblock[] = { -/*0*/ 5, /* 10x10 */ 7, /* 12x12 */ 7, /* 8x18 */ 10, /* 14x14 */ -/*4*/ 11, /* 8x32 */ 12, /* 16x16 */ 14, /* 12x26 */ 14, /* 18x18 */ -/*8*/ 15, /* 8x48 */ 18, /* 20x20 */ 18, /* 12x36 */ 18, /* 8x64 */ -/*12*/ 20, /* 22x22 */ 24, /* 16x36 */ 24, /* 24x24 */ 27, /* 12x64 */ -/*16*/ 28, /* 26x26 */ 28, /* 16x48 */ 28, /* 24x32 */ 32, /* 26x32 */ -/*20*/ 33, /* 24x36 */ 36, /* 32x32 */ 36, /* 16x64 */ 38, /* 26x40 */ -/*24*/ 41, /* 24x48 */ 42, /* 36x36 */ 42, /* 26x48 */ 46, /* 24x64 */ -/*28*/ 48, /* 40x40 */ 50, /* 26x64 */ 56, /* 44x44 */ 68, /* 48x48 */ -/*32*/ 42, /* 52x52 */ 56, /* 64x64 */ 36, /* 72x72 */ 48, /* 80x80 */ -/*36*/ 56, /* 88x88 */ 68, /* 96x96 */ 56, /*104x104*/ 68, /*120x120*/ -/*40*/ 62, /*132x132*/ 62 /*144x144*/ - }; + /*0*/ 5, /* 10x10 */ 7, /* 12x12 */ 7, /* 8x18 */ 10, /* 14x14 */ + /*4*/ 11, /* 8x32 */ 12, /* 16x16 */ 14, /* 12x26 */ 14, /* 18x18 */ + /*8*/ 15, /* 8x48 */ 18, /* 20x20 */ 18, /* 12x36 */ 18, /* 8x64 */ + /*12*/ 20, /* 22x22 */ 24, /* 16x36 */ 24, /* 24x24 */ 27, /* 12x64 */ + /*16*/ 28, /* 26x26 */ 28, /* 16x48 */ 28, /* 24x32 */ 32, /* 26x32 */ + /*20*/ 33, /* 24x36 */ 36, /* 32x32 */ 36, /* 16x64 */ 38, /* 26x40 */ + /*24*/ 41, /* 24x48 */ 42, /* 36x36 */ 42, /* 26x48 */ 46, /* 24x64 */ + /*28*/ 48, /* 40x40 */ 50, /* 26x64 */ 56, /* 44x44 */ 68, /* 48x48 */ + /*32*/ 42, /* 52x52 */ 56, /* 64x64 */ 36, /* 72x72 */ 48, /* 80x80 */ + /*36*/ 56, /* 88x88 */ 68, /* 96x96 */ 56, /*104x104*/ 68, /*120x120*/ + /*40*/ 62, /*132x132*/ 62 /*144x144*/ +}; #else // No Rectangular extensions static const int intsymbol[] = { - 0,1,3,5,7,8,10,12,13,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,2,4,6,9,11,14 }; + 0, 1, 3, 5, 7, 8, 10, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 2, 4, 6, 9, 11, 14 +}; // Number of DM Sizes #define DMSIZESCOUNT 30 @@ -236,33 +241,40 @@ static const int intsymbol[] = { #define INTSYMBOL144 29 static const int matrixH[] = { - 10, 12, 8, 14, 8, 16, 12, 18, 20, 12, 22, 16, 24, 26, 16, 32, 36, 40, 44, 48, - 52, 64, 72, 80, 88, 96, 104, 120, 132, 144 }; + 10, 12, 8, 14, 8, 16, 12, 18, 20, 12, 22, 16, 24, 26, 16, 32, 36, 40, 44, 48, + 52, 64, 72, 80, 88, 96, 104, 120, 132, 144 +}; static const int matrixW[] = { - 10, 12, 18, 14, 32, 16, 26, 18, 20, 36, 22, 36, 24, 26, 48, 32, 36, 40, 44, - 48, 52, 64, 72, 80, 88, 96, 104, 120, 132, 144 }; + 10, 12, 18, 14, 32, 16, 26, 18, 20, 36, 22, 36, 24, 26, 48, 32, 36, 40, 44, + 48, 52, 64, 72, 80, 88, 96, 104, 120, 132, 144 +}; static const int matrixFH[] = { - 10, 12, 8, 14, 8, 16, 12, 18, 20, 12, 22, 16, 24, 26, 16, 16, 18, 20, 22, 24, - 26, 16, 18, 20, 22, 24, 26, 20, 22, 24 }; + 10, 12, 8, 14, 8, 16, 12, 18, 20, 12, 22, 16, 24, 26, 16, 16, 18, 20, 22, 24, + 26, 16, 18, 20, 22, 24, 26, 20, 22, 24 +}; static const int matrixFW[] = { - 10, 12, 18, 14, 16, 16, 26, 18, 20, 18, 22, 18, 24, 26, 24, 16, 18, 20, 22, - 24, 26, 16, 18, 20, 22, 24, 26, 20, 22, 24 }; + 10, 12, 18, 14, 16, 16, 26, 18, 20, 18, 22, 18, 24, 26, 24, 16, 18, 20, 22, + 24, 26, 16, 18, 20, 22, 24, 26, 20, 22, 24 +}; static const int matrixbytes[] = { - 3, 5, 5, 8, 10, 12, 16, 18, 22, 22, 30, 32, 36, 44, 49, 62, 86, 114, 144, - 174, 204, 280, 368, 456, 576, 696, 816, 1050, 1304, 1558 }; + 3, 5, 5, 8, 10, 12, 16, 18, 22, 22, 30, 32, 36, 44, 49, 62, 86, 114, 144, + 174, 204, 280, 368, 456, 576, 696, 816, 1050, 1304, 1558 +}; static const int matrixdatablock[] = { - 3, 5, 5, 8, 10, 12, 16, 18, 22, 22, 30, 32, 36, 44, 49, 62, 86, 114, 144, - 174, 102, 140, 92, 114, 144, 174, 136, 175, 163, 156 }; - + 3, 5, 5, 8, 10, 12, 16, 18, 22, 22, 30, 32, 36, 44, 49, 62, 86, 114, 144, + 174, 102, 140, 92, 114, 144, 174, 136, 175, 163, 156 +}; + static const int matrixrsblock[] = { - 5, 7, 7, 10, 11, 12, 14, 14, 18, 18, 20, 24, 24, 28, 28, 36, 42, 48, 56, 68, - 42, 56, 36, 48, 56, 68, 56, 68, 62, 62 }; + 5, 7, 7, 10, 11, 12, 14, 14, 18, 18, 20, 24, 24, 28, 28, 36, 42, 48, 56, 68, + 42, 56, 36, 48, 56, 68, 56, 68, 62, 62 +}; #endif -#endif /* __IEC16022ECC200_H */ +#endif diff --git a/backend/font.h b/backend/font.h index a4bde85b..4bbf311f 100644 --- a/backend/font.h +++ b/backend/font.h @@ -2,20 +2,20 @@ /* libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart + Copyright (C) 2008-2016 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. + documentation and/or other materials provided with the distribution. 3. Neither the name of the project nor the names of its contributors may be used to endorse or promote products derived from this software - without specific prior written permission. + without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -26,1677 +26,1677 @@ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + */ /* This file contains the pixel-by-pixel representation of the "Misc Fixed" font at 10 point size processed by the Gimp */ static const int ascii_font[9310] = { - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,1,1,1,1,0,1,0,0,0, - 0,0,0,0,1,1,1,1,0,0,0,0,1,1,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1, - 0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1, - 0,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0, - 1,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0, - 0,0,1,0,0,0,0,1,1,1,1,0,0,1,1,1, - 1,1,1,0,0,0,0,0,1,0,0,1,1,1,1,1, - 1,0,0,0,1,1,1,0,0,1,1,1,1,1,1,0, - 0,1,1,1,1,0,0,0,1,1,1,1,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0, - 0,1,1,0,0,0,1,1,1,1,0,0,0,0,1,1, - 1,1,0,0,1,1,1,1,0,0,0,1,1,1,1,1, - 1,0,1,1,1,1,1,1,0,0,1,1,1,1,0,0, - 1,0,0,0,0,1,0,0,1,1,1,1,1,0,0,0, - 0,1,1,1,0,1,0,0,0,0,1,0,1,0,0,0, - 0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,1, - 0,0,1,1,1,1,0,0,1,1,1,1,1,0,0,0, - 1,1,1,1,0,0,1,1,1,1,1,0,0,0,1,1, - 1,1,0,0,1,1,1,1,1,1,1,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,1,0,0,0,1,0, - 1,0,0,0,0,1,0,0,1,0,0,0,1,0,1,1, - 1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,0, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, - 0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0, - 1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, - 0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,1, - 0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1, - 0,1,0,0,0,1,1,1,1,0,0,1,0,0,1,0, - 1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0, - 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0, - 0,1,1,0,0,0,1,0,0,0,0,1,0,0,0,0, - 0,0,1,0,0,0,0,1,1,0,0,1,0,0,0,0, - 0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0, - 1,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0, - 0,1,0,0,0,0,1,0,0,1,0,0,0,1,0,0, - 1,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0, - 0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0, - 0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0, - 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, - 0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0, - 0,0,0,1,1,0,0,1,1,0,1,0,0,0,0,1, - 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,1,0,0,0,1,0, - 1,0,0,0,0,1,0,0,1,0,0,0,1,0,0,0, - 0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0, - 0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, - 0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0, - 1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, - 0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,1,0,0,1,0,1, - 0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1, - 0,1,0,0,1,0,0,1,0,1,0,1,0,0,1,1, - 0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0, - 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0, - 0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0, - 1,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0, - 0,1,0,0,0,0,1,0,1,0,0,1,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0, - 1,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0, - 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 0,1,0,0,0,0,1,0,1,0,0,1,1,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0, - 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, - 0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,0, - 0,0,0,1,1,0,0,1,1,0,1,1,0,0,0,1, - 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,1,0,0,0,1,0, - 0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0, - 0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0, - 0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1, - 1,1,1,0,1,0,0,1,0,1,0,0,1,1,1,0, - 0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1, - 0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0, - 0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, - 1,0,0,0,0,0,1,0,1,0,0,1,1,1,1,1, - 0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0, - 1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,1, - 0,0,0,1,1,1,1,1,1,0,0,0,0,1,0,0, - 0,0,0,0,0,1,0,0,1,0,1,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0, - 0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0, - 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, - 0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,0, - 0,0,0,1,0,1,1,0,1,0,1,1,0,0,0,1, - 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,1,0,0,0,1,0, - 0,1,0,0,1,0,0,0,0,1,0,1,0,0,0,0, - 0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,0,0,1,0,1,1,1,0,0,0,1,1, - 1,1,0,0,0,1,1,1,0,1,0,0,1,1,1,1, - 0,0,0,0,1,0,0,0,0,0,1,1,1,0,1,0, - 1,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0, - 0,0,1,1,0,1,0,0,0,1,0,0,0,0,0,1, - 0,0,0,0,1,1,0,1,0,0,1,0,1,1,1,0, - 0,0,1,1,1,1,0,0,1,0,1,1,1,0,0,0, - 1,1,1,0,1,0,1,0,1,1,1,0,0,0,1,1, - 1,1,0,0,1,1,1,1,1,0,0,1,0,0,0,0, - 1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0, - 1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,1, - 1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0, - 0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, - 1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0, - 0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1, - 1,1,0,0,0,1,0,0,1,0,0,1,0,0,0,0, - 1,0,1,0,1,1,1,0,0,0,0,0,1,0,0,0, - 0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, - 0,1,0,0,0,0,0,1,1,0,0,0,0,0,1,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,0,0,1,0,0,0,1,0,1,0,0,1,0,1, - 0,0,0,0,1,0,1,1,1,1,0,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,1,1,1,1,0, - 0,0,1,1,1,1,0,0,0,1,0,0,0,0,0,0, - 1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,0, - 0,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0, - 0,0,0,1,0,1,1,0,1,0,1,0,1,0,0,1, - 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,0,1,1, - 0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0, - 1,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0, - 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, - 0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,1,0,1,1,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,1,1,0,1,0,0,0,0, - 1,0,1,1,1,1,1,0,0,1,0,0,0,1,0,0, - 1,1,0,0,0,1,0,0,0,0,1,0,0,0,0,0, - 0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,1, - 0,0,0,0,1,0,1,0,1,0,1,1,0,0,0,1, - 0,1,0,0,0,0,1,0,1,1,0,0,0,1,0,1, - 0,0,0,1,1,0,1,1,0,0,0,1,0,1,0,0, - 0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0, - 1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0, - 1,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0, - 0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,1,0,0,0,0,1,1,1,0,0,0,0,1,0,0, - 0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, - 0,1,0,0,0,0,1,1,1,1,1,0,0,0,0,0, - 0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0, - 0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0, - 0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0, - 1,0,1,1,0,0,0,1,0,0,0,0,1,0,0,0, - 0,1,0,0,1,0,0,0,1,1,1,0,1,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,1,0,0,0,1,0,1,0,0,1,0,1, - 1,1,1,1,1,0,1,0,0,0,1,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0, - 0,0,1,0,0,0,0,0,0,1,0,0,1,1,1,0, - 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, - 0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,0, - 0,0,0,1,0,0,0,0,1,0,1,0,0,1,0,1, - 0,1,0,0,0,0,1,0,1,1,1,1,1,0,0,1, - 0,0,0,0,1,0,1,1,1,1,1,0,0,0,0,0, - 1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0, - 1,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0, - 0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0, - 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0, - 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, - 0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,1, - 0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,1, - 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,0,1,0, - 0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0, - 1,0,0,1,0,0,0,1,0,0,1,0,1,0,1,0, - 0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0, - 0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1, - 1,1,1,0,0,0,0,1,0,1,0,0,0,1,1,1, - 0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, - 1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0, - 0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0, - 0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0, - 1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,0, - 0,0,0,0,1,0,0,0,1,0,1,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0, - 0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0, - 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, - 0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,0, - 0,0,0,1,0,0,0,0,1,0,1,0,0,0,1,1, - 0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,1, - 1,1,0,0,1,0,1,0,0,1,0,0,0,0,0,0, - 0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0, - 1,0,0,1,0,0,1,0,0,0,1,0,1,0,1,0, - 0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,1, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,1,1,1,1,1, - 1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0, - 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, - 0,0,0,1,0,1,1,1,0,0,0,0,0,0,0,1, - 0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,1, - 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1, - 1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0, - 1,0,0,0,1,0,1,0,0,0,1,0,1,0,1,0, - 0,0,1,1,0,0,0,1,0,0,0,0,1,0,0,0, - 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,1,0,0,1,0,0,1,0,1,0,0,1,1,0,0, - 1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1, - 0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0, - 0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0, - 0,0,1,0,1,1,1,1,1,1,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0, - 1,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0, - 0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0, - 1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0, - 0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0, - 0,0,0,1,0,0,0,0,1,0,1,0,0,0,1,1, - 0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,1, - 0,0,1,0,1,0,1,0,0,0,1,0,0,1,0,0, - 0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0, - 1,0,0,0,1,1,0,0,0,0,1,0,1,0,1,0, - 0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,1, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0, - 0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,0, - 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, - 0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,1, - 0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,1, - 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0, - 1,0,0,0,1,0,1,0,0,0,1,0,1,0,1,0, - 0,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0, - 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,1,0,0,1,0,0,1,0,1,0,1,0,1,0,0, - 1,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0, - 0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0, - 0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0, - 0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,1,0,0,0,0,0, - 1,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0, - 1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1, - 0,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0, - 0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0, - 0,0,1,0,0,0,0,0,0,1,0,0,0,1,1,0, - 1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0, - 0,0,1,0,0,1,0,0,0,0,1,0,1,0,0,0, - 0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,1, - 0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,1, - 0,0,0,1,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0, - 1,0,0,0,1,1,0,0,0,0,1,0,1,0,1,0, - 1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,1,0,1,1,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,1,1,0,1,0,0,0,0, - 1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0, - 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, - 0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1, - 0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,1, - 0,1,0,0,0,0,1,0,1,1,0,0,0,1,0,1, - 0,0,0,1,1,0,1,0,0,0,0,0,0,1,0,0, - 0,0,1,0,0,0,1,0,0,1,0,1,0,0,0,1, - 1,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0, - 1,0,0,0,0,1,0,0,1,1,1,0,1,0,0,1, - 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,1,0,0,0,1,1,1,1,0,0,1,0,0,1,1, - 0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0, - 0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0, - 1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,1, - 1,1,0,0,0,0,0,0,1,0,0,0,1,1,1,1, - 0,0,0,1,1,1,1,0,0,0,1,0,0,0,0,0, - 0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,0, - 0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0, - 0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0, - 0,0,0,0,1,0,0,0,0,0,1,1,1,1,0,1, - 0,0,0,0,1,0,1,1,1,1,0,0,0,0,1,1, - 1,1,0,0,1,1,1,1,0,0,0,1,1,1,1,1, - 1,0,1,0,0,0,0,0,0,0,1,1,1,0,1,0, - 1,0,0,0,0,1,0,0,1,1,1,1,1,0,0,1, - 1,1,0,0,0,1,0,0,0,0,1,0,1,1,1,1, - 1,1,0,1,0,0,0,0,1,0,1,0,0,0,0,1, - 0,0,1,1,1,1,0,0,1,0,0,0,0,0,0,0, - 1,1,1,1,0,0,1,0,0,0,0,1,0,0,1,1, - 1,1,0,0,0,0,0,1,0,0,0,0,1,1,1,1, - 0,0,0,0,1,1,0,0,0,0,0,1,0,1,0,0, - 1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,1, - 1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0, - 1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,0,1,0,1,1,1,0,0,0,1,1, - 1,1,0,0,0,1,1,1,0,1,0,0,1,1,1,1, - 0,0,0,0,1,0,0,0,0,1,0,1,1,1,0,0, - 1,0,0,0,0,1,0,0,1,1,1,1,1,0,0,1, - 0,0,0,1,0,1,0,0,0,0,1,0,0,1,1,1, - 1,1,0,0,1,0,0,0,1,0,1,0,0,0,0,1, - 0,0,1,1,1,1,0,0,1,0,1,1,1,0,0,0, - 1,1,1,0,1,0,1,0,0,0,0,0,0,0,1,1, - 1,1,0,0,0,0,0,1,1,0,0,0,1,1,1,0, - 1,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0, - 1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,1, - 1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0, - 0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, - 0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0, - 0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1, - 0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, + 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, + 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, + 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, + 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, + 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, + 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, + 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, + 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, + 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, + 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, + 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, + 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, + 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, + 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, + 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, + 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, + 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, + 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, + 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, + 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, + 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, + 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, + 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, + 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, + 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, + 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, + 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, + 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, + 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, + 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, + 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, + 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, + 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, + 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, + 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, + 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, + 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, + 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, + 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, + 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, + 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, + 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, + 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, + 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, + 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, + 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, + 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, + 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0 }; static const int ascii_ext_font[9310] = { - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, - 0,0,1,0,0,0,0,0,1,1,0,0,0,0,1,1, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0, - 1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0, - 1,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0, - 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0, - 0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0, - 0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0, - 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0, - 0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0, - 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1, - 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, - 0,1,0,0,0,0,0,1,0,0,1,0,0,1,0,0, - 1,1,0,0,0,1,0,0,1,0,0,0,0,1,1,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1, - 0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1, - 0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,1, - 0,0,0,0,0,1,0,0,1,0,0,1,0,0,1,1, - 0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, - 1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0, - 1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0, - 0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,1, - 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1, - 0,0,1,1,1,1,1,0,0,1,0,0,1,0,0,0, - 0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,0, - 0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0, - 1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1, - 0,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, - 0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0, - 0,0,0,1,0,0,0,0,1,1,0,0,0,0,1,1, - 0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0, - 1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, - 1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0, - 1,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0, - 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, - 0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1, - 0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, - 0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,0, - 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,1, - 0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, - 0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1, - 0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,0, - 0,1,0,1,1,0,0,0,1,0,0,0,1,0,0,1, - 0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0, - 0,1,1,0,0,0,0,0,1,1,0,0,0,0,0,1, - 1,0,0,0,0,0,1,1,0,0,0,0,0,1,1,0, - 0,0,0,1,0,1,0,0,0,1,0,0,0,0,1,0, - 1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1, - 1,1,1,1,0,1,1,1,1,1,1,0,0,1,1,1, - 1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1, - 0,0,1,1,1,1,1,0,0,1,0,0,0,1,0,1, - 1,0,0,0,1,0,0,1,1,1,1,0,0,0,1,1, - 1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,1, - 0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0, - 1,0,0,0,1,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, - 0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0, - 0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0, - 0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0, - 1,1,0,0,0,1,0,0,1,0,0,0,0,1,1,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1, - 0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,1, - 0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,1, - 0,0,0,0,0,1,0,0,1,0,0,1,0,0,1,1, - 0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, - 1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0, - 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, - 0,0,1,0,0,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1, - 0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,1, - 0,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0, - 0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1, - 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1, - 0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1, - 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1, - 0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0, - 1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, - 0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0, - 1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0, - 0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1, - 0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,0, - 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, - 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1, - 1,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0, - 1,0,0,1,0,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, - 0,1,0,0,1,0,0,0,1,0,1,1,1,1,1,0, - 0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,1, - 0,0,0,0,0,1,1,1,1,0,0,0,0,0,1,0, - 0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0, - 0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,1, - 0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, - 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, - 1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0, - 1,0,0,0,1,0,0,1,0,0,0,0,1,1,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0, - 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, - 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1, - 0,1,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,1,0,0,0,0,0,1, - 1,0,0,1,0,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, - 0,1,0,0,0,1,0,1,0,0,1,0,0,0,0,1, - 0,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0, - 1,1,1,1,0,0,0,1,1,1,1,0,0,0,1,1, - 1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,1, - 0,0,0,1,1,1,1,1,0,0,1,1,1,1,0,0, - 0,1,1,1,1,0,0,0,1,1,1,1,0,0,0,1, - 1,1,1,0,0,0,1,1,1,1,0,0,0,0,1,1, - 0,0,0,0,0,1,1,0,0,0,0,0,1,1,0,0, - 0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,1, - 0,1,1,1,0,0,0,1,1,1,1,0,0,0,1,1, - 1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,1, - 0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0, - 0,1,1,1,1,0,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, - 0,1,0,1,0,0,0,0,1,0,1,0,1,1,1,0, - 0,1,0,0,0,0,1,0,0, - 0,0,1,0,0,0,1,0,1,0,0,1,0,0,0,1, - 0,0,0,0,0,1,0,0,1,0,0,0,1,1,1,1, - 1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0, - 0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0, - 1,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0, - 0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,1,1,0,1,0,0, - 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,1,1,1,1,1,0,1,0,0,0,0,0,0, - 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, - 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, - 0,0,0,0,1,0,0,0,1,1,1,1,0,0,1,1, - 0,1,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,1,0,0,0,1,0, - 1,0,0,1,0,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, - 0,1,0,0,0,1,0,1,0,0,1,0,0,0,0,1, - 0,0,1,1,1,0,0,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,1,0,0,1,1,0,0,0,0,1,0, - 1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1, - 1,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0, - 1,0,0,1,0,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, - 0,1,0,1,0,0,0,0,1,0,1,1,0,0,0,1, - 0,1,0,0,0,0,1,0,0, - 0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,1, - 1,1,0,0,0,1,0,0,1,0,0,0,0,0,1,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0, - 0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0, - 0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0, - 0,0,0,0,1,1,1,1,0,0,1,1,0,0,1,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,1, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 1,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1, - 1,1,1,0,0,0,0,1,0,1,0,0,0,0,1,0, - 0,1,0,0,0,1,0,1,0,0,0,0,1,0,0,1, - 0,0,0,1,0,0,0,0,1,1,1,1,1,1,0,1, - 1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1, - 1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1, - 1,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0, - 1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1, - 1,1,1,0,0,1,1,1,1,1,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1, - 0,0,1,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0, - 1,0,1,0,0,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, - 0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1, - 0,0,1,0,0,1,0,0,0,0,0,1,1,1,0,0, - 0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0, - 1,1,1,0,0,0,0,1,1,1,0,0,0,0,1,1, - 1,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0, - 1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0, - 1,0,0,1,0,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, - 0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,1, - 0,0,1,0,0,0,1,0,0, - 0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1, - 0,0,0,0,0,1,1,1,1,0,0,0,1,1,1,1, - 1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0, - 0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1, - 1,1,1,1,0,1,0,1,0,0,0,0,0,1,1,1, - 1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0, - 1,1,0,0,0,1,1,0,1,0,0,1,0,0,1,1, - 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0, - 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, - 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1, - 0,0,1,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0, - 1,0,1,0,0,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, - 0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1, - 0,0,1,0,0,0,1,0,0,1,1,0,0,1,0,0, - 1,1,0,0,1,0,0,1,1,0,0,1,0,0,1,1, - 0,0,1,0,0,1,1,0,0,1,0,0,1,1,0,0, - 1,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0, - 1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1, - 1,1,1,1,0,1,1,1,1,1,1,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0, - 1,0,1,0,0,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, - 0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,1, - 0,0,1,0,0,1,0,0,0, - 0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1, - 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0, - 0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0, - 0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,0, - 0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0, - 0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,1, - 0,1,0,0,1,0,0,0,1,0,0,1,0,1,0,1, - 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,1,0,0,0,1,0,0,0,0,1,0, - 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, - 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1, - 0,0,1,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0, - 1,0,1,0,0,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, - 0,1,0,0,0,0,1,0,0,0,1,1,1,1,1,0, - 0,0,1,0,0,0,1,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0, - 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, - 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,1,1,1,1,1,1,0, - 1,0,1,0,0,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, - 0,1,0,0,0,1,0,1,0,0,1,0,0,0,0,1, - 0,0,0,1,0,1,0,0,0, - 0,0,1,0,0,0,1,0,1,0,0,1,0,0,1,1, - 1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0, - 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0, - 0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0, - 0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1, - 1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,1, - 1,1,0,1,0,0,0,1,0,0,1,0,0,1,1,1, - 0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,1,0,0,0,1,0,0,0,0,1,0, - 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, - 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1, - 0,0,0,1,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,1,0,0,0,1,0, - 1,1,0,0,0,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, - 0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0, - 0,0,1,0,0,0,1,0,1,0,0,0,1,1,0,1, - 0,0,0,1,1,0,1,0,0,0,1,1,0,1,0,0, - 0,1,1,0,1,0,0,0,1,1,0,1,0,0,0,1, - 1,0,1,0,0,1,0,0,1,1,0,0,0,0,1,0, - 1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0, - 1,1,0,0,0,1,0,1,0,0,0,1,1,0,1,0, - 0,0,1,1,0,1,0,0,0,1,1,0,1,0,0,0, - 1,1,0,0,0,1,1,1,0,0,1,1,0,0,0,1, - 0,0,0,1,1,1,0,0,0, - 0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,1, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,0,0,0,1,0,0,0,0,1,1,1,1,0,0, - 0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, - 0,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, - 1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0, - 0,1,0,1,0,0,1,1,1,0,0,0,0,0,0,1, - 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,1,1,1,0,0,1,1,1,1,0,0, - 1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1, - 1,1,1,1,0,1,1,1,1,1,1,0,0,1,1,1, - 1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1, - 0,0,1,1,1,1,1,0,0,1,1,1,1,0,0,1, - 0,0,0,1,1,0,0,1,1,1,1,0,0,0,1,1, - 1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,1, - 0,0,0,1,1,1,1,0,0,1,0,0,0,0,0,1, - 0,1,1,1,1,0,0,0,1,1,1,1,0,0,0,1, - 1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1, - 1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0, - 0,1,1,1,1,1,0,0,0,1,1,1,0,1,0,0, - 1,1,1,0,1,0,0,1,1,1,0,1,0,0,1,1, - 1,0,1,0,0,1,1,1,0,1,0,0,1,1,1,0, - 1,0,0,1,1,1,1,1,0,0,1,1,1,1,0,0, - 0,1,1,1,1,0,0,0,1,1,1,1,0,0,0,1, - 1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1, - 1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1, - 0,0,1,1,1,1,1,0,0,0,1,1,1,0,0,1, - 0,0,0,0,1,0,0,1,1,1,1,0,0,0,1,1, - 1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,1, - 0,0,0,1,1,1,1,0,0,0,0,1,1,0,0,0, - 0,1,1,1,1,0,0,0,1,1,1,0,1,0,0,1, - 1,1,0,1,0,0,1,1,1,0,1,0,0,1,1,1, - 0,1,0,0,0,0,1,0,0,0,1,0,1,1,1,0, - 0,0,0,0,1,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0, - 0,1,0,0,1,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0, - 0,0,1,1,0,0,0,0,0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, + 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, + 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, + 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, + 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, + 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, + 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, + 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, + 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, + 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, + 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, + 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, + 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, + 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, + 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, + 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, + 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, + 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, + 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, + 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, + 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, + 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, + 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, + 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, + 0, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, + 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, + 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, + 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, + 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, + 0, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, + 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, + 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, + 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, + 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, + 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, + 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, + 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, + 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, + 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, + 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, + 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, + 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, + 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, + 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, + 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, + 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, + 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, + 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, + 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, + 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, + 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, + 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, + 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, + 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, + 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, + 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, + 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, + 0, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, + 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, + 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, + 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, + 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, + 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, + 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, + 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, + 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, + 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, + 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, + 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, + 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, + 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, + 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 0, 0, 0, 0, 0 }; static const int small_font[] = { - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,0,1,0,0,0,1,1,0,0,1,1,1,1,0,0, - 0,1,0,0,1,1,1,1,0,0,1,1,0,0,1,1, - 1,1,0,0,1,1,0,0,0,1,1,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0, - 0,1,1,0,0,1,1,1,0,0,0,1,1,0,0,1, - 1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,1, - 1,0,0,1,0,0,1,0,0,1,1,1,0,0,0,0, - 1,0,1,0,0,1,0,1,0,0,0,0,1,0,0,1, - 0,1,0,0,1,0,0,1,1,0,0,1,1,1,0,0, - 0,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0, - 1,1,1,0,1,0,0,1,0,1,0,0,1,0,1,0, - 0,1,0,1,0,0,1,0,0,1,0,1,0,1,1,1, - 1,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1, - 0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0, - 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, - 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0, - 1,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0, - 0,0,1,0,1,0,0,0,0,0,0, - 0,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0, - 1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0, - 1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0, - 1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0, - 0,1,1,0,0,1,0,0,1,0,0,0,0,1,0,0, - 1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0, - 0,1,0,1,0,0,1,0,1,0,0,1,0,0,1,1, - 0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0, - 0,0,1,0,0,0,0,1,0,1,0,1,0,0,1,0, - 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1, - 0,0,1,0,1,0,0,0,0,1,0,0,0,0,1,0, - 0,1,0,1,0,0,1,0,0,0,1,0,0,0,0,0, - 1,0,1,0,1,0,0,1,0,0,0,0,1,1,1,1, - 0,1,1,0,1,0,1,0,0,1,0,1,0,0,1,0, - 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,0, - 0,1,0,0,1,0,0,1,0,1,0,0,1,0,1,0, - 0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0, - 1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1, - 0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0, - 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0, - 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0, - 0,1,0,1,0,0,0,0,0,0,0, - 0,0,1,0,0,0,1,0,1,0,1,1,1,1,1,1, - 0,1,0,0,0,0,1,0,0,1,0,1,0,0,0,0, - 1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1, - 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0, - 0,0,1,0,0,0,0,0,1,0,0,1,1,0,0,1, - 0,1,0,0,1,1,1,0,0,1,1,1,0,0,0,0, - 1,0,0,0,1,1,0,0,1,0,0,1,0,0,1,1, - 0,0,0,1,1,0,0,0,0,1,0,0,1,1,1,1, - 0,0,0,1,0,0,0,0,0,1,0,1,0,1,1,0, - 1,0,0,1,0,1,1,1,0,0,1,0,0,0,0,1, - 0,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0, - 0,0,0,1,1,1,1,0,0,0,1,0,0,0,0,0, - 1,0,1,1,0,0,0,1,0,0,0,0,1,1,1,1, - 0,1,1,0,1,0,1,0,0,1,0,1,0,0,1,0, - 1,0,0,1,0,1,0,0,1,0,0,1,0,0,0,0, - 0,1,0,0,1,0,0,1,0,1,0,0,1,0,1,0, - 0,1,0,0,1,1,0,0,0,1,0,1,0,0,0,1, - 0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,1,1,1,0,1,1,1,0,0,0,1,1,0,0,0, - 1,1,1,0,0,1,1,0,0,0,1,0,0,0,0,1, - 1,1,0,1,1,1,0,0,0,1,1,0,0,0,0,0, - 1,0,1,0,1,0,0,0,0,1,0,0,1,0,1,0, - 0,1,1,1,0,0,0,1,1,0,0,1,1,1,0,0, - 0,1,1,1,0,1,1,1,0,0,0,1,1,1,0,1, - 1,1,0,0,1,0,0,1,0,0,1,0,1,0,1,0, - 0,1,0,1,0,0,1,0,1,0,0,1,0,1,1,1, - 1,0,0,1,1,0,0,0,0,1,0,0,0,0,1,1, - 0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0, - 1,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0, - 0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,1, - 1,0,1,1,1,1,1,0,0,0,0,0,1,1,1,1, - 0,0,0,0,0,0,0,1,0,0,0,0,1,0,1,0, - 0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,1, - 1,1,1,0,0,0,0,1,0,1,0,0,1,0,0,0, - 1,0,0,1,0,0,1,0,0,1,1,1,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,1,0,0,1,0,1,1,0, - 1,1,1,1,0,1,0,0,1,0,1,0,0,0,0,1, - 0,0,1,0,1,0,0,0,0,1,0,0,0,0,1,0, - 1,1,0,1,0,0,1,0,0,0,1,0,0,0,0,0, - 1,0,1,1,0,0,0,1,0,0,0,0,1,0,0,1, - 0,1,0,1,1,0,1,0,0,1,0,1,1,1,0,0, - 1,0,0,1,0,1,1,1,0,0,0,0,1,0,0,0, - 0,1,0,0,1,0,0,1,0,1,0,0,1,0,1,1, - 1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0, - 0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, - 0,0,1,0,1,0,1,1,0,1,1,1,0,0,1,0, - 0,1,0,1,0,0,1,0,0,0,1,0,0,0,0,0, - 1,0,1,1,0,0,0,0,0,1,0,0,1,1,1,1, - 0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0, - 1,0,0,1,0,1,0,0,1,0,1,1,0,0,0,0, - 1,0,0,0,1,0,0,1,0,0,1,0,1,0,1,0, - 0,1,0,0,1,1,0,0,1,0,0,1,0,0,0,1, - 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0, - 0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0, - 0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0, - 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1, - 0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0, - 0,0,1,1,0,0,1,0,0,0,0,0,1,0,1,0, - 0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0, - 0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1, - 0,0,0,1,0,0,1,0,0,0,0,1,0,0,1,1, - 0,0,0,1,1,0,0,0,0,1,0,0,1,1,1,1, - 0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0, - 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1, - 0,0,1,0,1,0,0,0,0,1,0,0,0,0,1,0, - 0,1,0,1,0,0,1,0,0,0,1,0,0,1,0,0, - 1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,1, - 0,1,0,1,1,0,1,0,0,1,0,1,0,0,0,0, - 1,1,0,1,0,1,0,1,0,0,1,0,0,1,0,0, - 0,1,0,0,1,0,0,1,0,0,1,1,0,0,1,1, - 1,1,0,1,0,0,1,0,0,0,1,0,0,1,0,0, - 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,0,1,1,0,1,0,0,1,0,1,0,0,0,0,1, - 0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,1, - 1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0, - 1,0,1,0,1,0,0,0,0,1,0,0,1,0,0,1, - 0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0, - 1,0,0,1,0,1,0,0,0,0,0,0,1,1,0,0, - 1,0,0,0,1,0,0,1,0,0,1,0,1,0,1,1, - 1,1,0,0,1,1,0,0,0,1,0,1,0,0,1,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0, - 0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0, - 1,1,1,0,0,0,0,1,0,0,1,0,1,0,0,0, - 0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0, - 1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0, - 0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0, - 0,1,1,1,0,1,1,1,1,0,0,1,1,0,0,0, - 0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1, - 0,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1, - 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0, - 0,0,1,0,0,0,0,0,1,0,0,0,1,1,0,0, - 1,0,0,1,0,1,1,1,0,0,0,1,1,0,0,1, - 1,1,0,0,1,1,1,1,0,1,0,0,0,0,0,1, - 1,1,0,1,0,0,1,0,0,1,1,1,0,0,1,1, - 0,0,1,0,0,1,0,1,1,1,1,0,1,0,0,1, - 0,1,0,0,1,0,0,1,1,0,0,1,0,0,0,0, - 0,1,1,0,0,1,0,0,1,0,0,1,1,0,0,0, - 0,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0, - 0,1,0,1,0,0,1,0,0,0,1,0,0,1,1,1, - 1,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1, - 0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0, - 0,1,0,1,0,1,1,1,0,0,0,1,1,0,0,0, - 1,1,1,0,0,1,1,0,0,0,1,0,0,0,1,0, - 0,0,0,1,0,0,1,0,0,1,1,1,0,0,1,0, - 1,0,1,0,0,1,0,0,1,1,1,0,1,0,0,1, - 0,1,0,0,1,0,0,1,1,0,0,1,1,1,0,0, - 0,1,1,1,0,1,0,0,0,0,1,1,1,0,0,0, - 0,1,1,0,0,1,1,1,0,0,0,1,0,0,1,1, - 1,1,0,1,0,0,1,0,0,0,1,0,0,1,1,1, - 1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0, - 0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, - 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, + 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, + 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, + 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, + 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, + 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, + 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, + 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, + 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, + 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, + 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, + 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, + 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, + 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, + 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, + 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, + 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, + 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, + 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, + 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, + 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, + 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, + 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, + 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, + 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, + 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, + 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, + 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, + 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, + 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, + 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, + 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, + 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, + 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, + 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, + 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, + 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, + 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, + 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, + 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, + 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, + 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, + 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, + 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, + 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, + 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, + 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, + 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, + 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, + 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, + 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, + 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, + 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, + 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, + 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, + 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, + 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, + 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, + 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, + 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, + 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, + 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, + 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, + 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, + 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, + 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, + 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, + 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; static const int small_font_extended[] = { - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, - 1,1,0,0,1,0,1,0,0,1,1,1,0,0,1,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,1,1,0,1,1,1,1,0,0,0,1,0,0, - 0,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0, - 0,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0, - 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0, - 0,1,1,0,0,0,0,0,1,0,0,0,1,1,0,0, - 0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,1, - 0,0,1,0,0,1,1,0,0,0,1,1,1,0,0,1, - 1,0,0,1,1,1,1,0,1,1,1,1,0,1,1,1, - 1,0,1,1,1,1,0,0,1,1,1,0,0,1,1,1, - 0,0,1,1,1,0,0,1,1,1,0,1,1,1,0,0, - 1,0,1,1,0,0,1,1,0,0,0,1,1,0,0,0, - 1,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0, - 0,0,0,0,1,1,1,0,1,0,0,1,0,1,0,0, - 1,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1, - 0,1,0,0,0,0,0,1,1,0,0,0,1,0,0,0, - 0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0, - 1,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0, - 0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0, - 0,0,0,1,0,0,0,1,0,1,0,0,1,0,0,0, - 0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0, - 1,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1, - 0,0,0,1,1,0,0,0,1,0,1,0,0,0,1,0, - 0,0,0,0,0,0,0,1,0,1,0, - 0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,1, - 0,0,0,1,0,1,0,1,0,0,0,1,0,0,0,1, - 0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,0, - 0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0, - 1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0, - 0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,1, - 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0, - 0,1,1,0,0,0,0,0,0,0,0,1,0,0,1,0, - 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,0, - 1,1,0,0,0,1,1,0,0,1,0,1,0,0,1,0, - 0,1,0,1,0,0,0,0,1,0,0,0,0,1,0,0, - 0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0, - 0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0, - 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1, - 0,0,1,0,1,0,0,1,0,0,1,1,0,0,0,0, - 0,0,0,1,0,1,1,0,1,0,0,1,0,1,0,0, - 1,0,1,0,0,1,0,0,0,0,0,0,0,1,0,1, - 0,1,1,1,0,0,1,0,0,1,0,0,0,1,0,0, - 0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0, - 0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,1, - 0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0, - 0,0,1,0,1,0,0,0,0,0,0,0,0,1,1,0, - 1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0, - 0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1, - 1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,1,1,1,0,0,1,0,0,0,0, - 1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1, - 1,0,0,0,0,0,0,0,1,0,1,0,1,0,1,1, - 0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, - 0,1,1,1,0,1,0,0,0,0,0,0,0,1,0,0, - 1,1,1,1,1,0,1,0,0,0,0,0,1,0,0,0, - 0,0,0,0,1,0,0,1,0,1,1,0,1,0,0,1, - 1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0, - 0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,0, - 0,0,1,0,0,0,0,0,1,0,0,1,0,0,1,0, - 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1, - 0,0,1,0,1,0,0,1,0,1,0,1,1,0,1,0, - 0,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1, - 0,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0, - 0,0,0,1,0,0,0,0,1,0,0,1,1,0,1,0, - 1,1,0,1,0,1,0,0,1,0,1,0,0,1,0,1, - 0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0, - 0,1,0,1,0,1,1,0,1,0,0,1,0,1,0,0, - 1,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1, - 0,1,0,0,1,0,1,0,1,0,0,0,1,1,1,0, - 0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0, - 1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,0, - 1,1,0,0,1,1,0,0,0,1,1,0,0,0,1,1, - 0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0, - 0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0, - 1,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0, - 1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,0, - 0,0,0,0,1,1,1,0,1,0,0,1,0,1,0,0, - 1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1, - 0,1,1,1,0,0,1,0,0,1,0, - 0,0,1,0,0,1,0,1,0,0,1,1,1,0,0,0, - 1,0,1,0,0,1,1,1,0,0,0,0,0,0,0,1, - 0,1,0,0,0,0,0,0,1,1,0,0,1,0,0,0, - 0,0,1,0,0,1,0,1,1,1,1,0,0,0,0,0, - 0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0, - 0,0,0,0,1,0,0,1,0,0,1,0,1,0,0,1, - 1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0, - 0,0,0,1,0,0,1,1,0,0,1,0,1,0,1,1, - 0,1,1,0,1,0,0,1,0,0,0,1,1,1,1,0, - 1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1, - 1,1,1,0,1,1,1,1,0,1,1,1,0,0,1,0, - 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0, - 0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0, - 0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0, - 1,0,1,1,0,1,0,0,1,0,1,0,0,1,0,1, - 0,0,1,0,1,0,0,1,0,1,0,0,1,0,0,1, - 1,0,0,1,1,0,1,0,1,0,0,1,0,1,0,0, - 1,0,1,0,0,1,0,1,0,0,1,0,0,0,1,0, - 0,1,1,1,0,0,1,0,0,1,0,1,0,0,1,0, - 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1, - 0,0,1,0,1,0,0,1,0,1,0,1,1,0,0,1, - 0,0,0,1,0,1,1,0,1,0,1,1,0,1,0,1, - 1,0,1,0,1,1,0,0,0,1,0,0,0,0,1,0, - 0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0, - 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1, - 0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,1, - 1,1,0,1,0,1,1,0,1,0,0,1,0,1,0,0, - 1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1, - 0,1,0,0,1,0,1,0,0,1,0, - 0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0, - 1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,0, - 1,1,0,0,0,0,0,0,1,0,1,0,1,0,0,0, - 0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0, - 0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,1,0,0,1,0,1,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,1, - 0,0,0,1,1,0,0,1,0,1,0,1,0,0,1,0, - 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1, - 0,0,1,0,1,0,0,1,0,1,0,1,0,0,1,0, - 0,1,0,1,0,0,0,0,1,0,0,0,0,1,0,0, - 0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0, - 0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0, - 1,0,1,1,0,1,0,0,1,0,1,0,0,1,0,1, - 0,0,1,0,1,0,0,1,0,1,0,0,1,0,0,1, - 1,0,0,1,1,0,1,0,1,0,0,1,0,1,0,0, - 1,0,1,0,0,1,0,1,0,0,1,0,0,0,1,0, - 0,1,0,0,0,0,1,0,0,1,0,1,0,1,1,0, - 1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1, - 0,1,1,0,1,0,1,1,0,1,0,1,0,0,0,1, - 0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0, - 0,0,1,1,0,0,0,0,0,1,0,0,0,0,1,0, - 0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0, - 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1, - 0,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0, - 0,0,0,1,1,0,1,0,1,0,0,1,0,1,0,0, - 1,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1, - 0,1,0,0,1,0,0,1,0,1,0, - 0,0,1,0,0,0,1,1,1,0,1,0,1,1,0,1, - 0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0, - 0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,1,1,0,0,0,1,0,1,0,0,0, - 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0, - 0,0,1,1,1,0,0,0,1,0,0,1,0,0,1,0, - 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1, - 0,0,1,0,1,0,0,1,0,1,0,1,1,0,0,1, - 1,0,0,1,1,1,1,0,1,1,1,1,0,1,1,1, - 1,0,1,1,1,1,0,0,1,1,1,0,0,1,1,1, - 0,0,1,1,1,0,0,1,1,1,0,1,1,1,0,0, - 1,0,0,1,0,0,1,1,0,0,0,1,1,0,0,0, - 1,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0, - 0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,1, - 0,0,0,1,1,0,0,0,1,1,0,0,0,0,1,0, - 0,1,0,0,0,0,1,0,1,0,0,0,1,0,1,0, - 0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0, - 1,0,1,0,0,1,0,1,0,0,1,1,1,0,0,0, - 1,1,0,0,1,1,0,0,0,1,1,0,0,0,1,1, - 0,0,0,1,1,0,0,0,1,1,1,0,0,1,1,1, - 0,0,1,1,1,0,0,1,1,1,0,0,1,1,0,0, - 1,0,0,1,0,0,1,1,0,0,0,1,1,0,0,0, - 1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1, - 1,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1, - 1,0,0,1,1,1,0,0,1,1,1,0,0,0,1,0, - 0,1,1,1,0,0,0,0,1,0,0, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1, - 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,1,0,0,0,0,0,1,0,0,0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, + 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, + 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, + 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, + 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, + 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, + 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, + 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, + 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, + 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, + 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, + 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, + 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, + 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, + 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, + 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, + 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, + 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, + 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, + 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, + 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, + 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, + 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, + 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, + 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, + 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, + 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, + 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, + 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, + 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, + 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, + 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, + 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, + 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, + 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, + 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, + 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, + 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, + 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, + 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, + 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, + 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, + 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, + 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, + 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, + 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, + 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, + 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, + 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, + 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, + 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, + 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, + 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, + 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, + 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, + 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, + 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, + 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, + 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, + 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, + 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, + 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, + 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, + 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, + 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, + 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, + 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, + 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, + 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, + 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, + 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, + 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, + 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, + 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, + 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, + 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, + 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, + 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, + 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, + 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, + 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, + 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, + 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, + 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, + 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, + 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, + 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, + 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, + 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, + 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, + 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0 }; diff --git a/backend/gb2312.h b/backend/gb2312.h index ef9862a5..dfd72409 100644 --- a/backend/gb2312.h +++ b/backend/gb2312.h @@ -1,7 +1,7 @@ /* gb2312.h - Unicode to GB 2312-1980 lookup table libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart + Copyright (C) 2009-2016 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -27,7452 +27,7452 @@ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + */ static const unsigned long int gb2312_lookup[] = { - 0x00A4, 0xA1E8, - 0x00A7, 0xA1EC, - 0x00A8, 0xA1A7, - 0x00B0, 0xA1E3, - 0x00B1, 0xA1C0, - 0x00B7, 0xA1A4, - 0x00D7, 0xA1C1, - 0x00E0, 0xA8A4, - 0x00E1, 0xA8A2, - 0x00E8, 0xA8A8, - 0x00E9, 0xA8A6, - 0x00EA, 0xA8BA, - 0x00EC, 0xA8AC, - 0x00ED, 0xA8AA, - 0x00F2, 0xA8B0, - 0x00F3, 0xA8AE, - 0x00F7, 0xA1C2, - 0x00F9, 0xA8B4, - 0x00FA, 0xA8B2, - 0x00FC, 0xA8B9, - 0x0101, 0xA8A1, - 0x0113, 0xA8A5, - 0x011B, 0xA8A7, - 0x012B, 0xA8A9, - 0x014D, 0xA8AD, - 0x016B, 0xA8B1, - 0x01CE, 0xA8A3, - 0x01D0, 0xA8AB, - 0x01D2, 0xA8AF, - 0x01D4, 0xA8B3, - 0x01D6, 0xA8B5, - 0x01D8, 0xA8B6, - 0x01DA, 0xA8B7, - 0x01DC, 0xA8B8, - 0x02C7, 0xA1A6, - 0x02C9, 0xA1A5, - 0x0391, 0xA6A1, - 0x0392, 0xA6A2, - 0x0393, 0xA6A3, - 0x0394, 0xA6A4, - 0x0395, 0xA6A5, - 0x0396, 0xA6A6, - 0x0397, 0xA6A7, - 0x0398, 0xA6A8, - 0x0399, 0xA6A9, - 0x039A, 0xA6AA, - 0x039B, 0xA6AB, - 0x039C, 0xA6AC, - 0x039D, 0xA6AD, - 0x039E, 0xA6AE, - 0x039F, 0xA6AF, - 0x03A0, 0xA6B0, - 0x03A1, 0xA6B1, - 0x03A3, 0xA6B2, - 0x03A4, 0xA6B3, - 0x03A5, 0xA6B4, - 0x03A6, 0xA6B5, - 0x03A7, 0xA6B6, - 0x03A8, 0xA6B7, - 0x03A9, 0xA6B8, - 0x03B1, 0xA6C1, - 0x03B2, 0xA6C2, - 0x03B3, 0xA6C3, - 0x03B4, 0xA6C4, - 0x03B5, 0xA6C5, - 0x03B6, 0xA6C6, - 0x03B7, 0xA6C7, - 0x03B8, 0xA6C8, - 0x03B9, 0xA6C9, - 0x03BA, 0xA6CA, - 0x03BB, 0xA6CB, - 0x03BC, 0xA6CC, - 0x03BD, 0xA6CD, - 0x03BE, 0xA6CE, - 0x03BF, 0xA6CF, - 0x03C0, 0xA6D0, - 0x03C1, 0xA6D1, - 0x03C3, 0xA6D2, - 0x03C4, 0xA6D3, - 0x03C5, 0xA6D4, - 0x03C6, 0xA6D5, - 0x03C7, 0xA6D6, - 0x03C8, 0xA6D7, - 0x03C9, 0xA6D8, - 0x0401, 0xA7A7, - 0x0410, 0xA7A1, - 0x0411, 0xA7A2, - 0x0412, 0xA7A3, - 0x0413, 0xA7A4, - 0x0414, 0xA7A5, - 0x0415, 0xA7A6, - 0x0416, 0xA7A8, - 0x0417, 0xA7A9, - 0x0418, 0xA7AA, - 0x0419, 0xA7AB, - 0x041A, 0xA7AC, - 0x041B, 0xA7AD, - 0x041C, 0xA7AE, - 0x041D, 0xA7AF, - 0x041E, 0xA7B0, - 0x041F, 0xA7B1, - 0x0420, 0xA7B2, - 0x0421, 0xA7B3, - 0x0422, 0xA7B4, - 0x0423, 0xA7B5, - 0x0424, 0xA7B6, - 0x0425, 0xA7B7, - 0x0426, 0xA7B8, - 0x0427, 0xA7B9, - 0x0428, 0xA7BA, - 0x0429, 0xA7BB, - 0x042A, 0xA7BC, - 0x042B, 0xA7BD, - 0x042C, 0xA7BE, - 0x042D, 0xA7BF, - 0x042E, 0xA7C0, - 0x042F, 0xA7C1, - 0x0430, 0xA7D1, - 0x0431, 0xA7D2, - 0x0432, 0xA7D3, - 0x0433, 0xA7D4, - 0x0434, 0xA7D5, - 0x0435, 0xA7D6, - 0x0436, 0xA7D8, - 0x0437, 0xA7D9, - 0x0438, 0xA7DA, - 0x0439, 0xA7DB, - 0x043A, 0xA7DC, - 0x043B, 0xA7DD, - 0x043C, 0xA7DE, - 0x043D, 0xA7DF, - 0x043E, 0xA7E0, - 0x043F, 0xA7E1, - 0x0440, 0xA7E2, - 0x0441, 0xA7E3, - 0x0442, 0xA7E4, - 0x0443, 0xA7E5, - 0x0444, 0xA7E6, - 0x0445, 0xA7E7, - 0x0446, 0xA7E8, - 0x0447, 0xA7E9, - 0x0448, 0xA7EA, - 0x0449, 0xA7EB, - 0x044A, 0xA7EC, - 0x044B, 0xA7ED, - 0x044C, 0xA7EE, - 0x044D, 0xA7EF, - 0x044E, 0xA7F0, - 0x044F, 0xA7F1, - 0x0451, 0xA7D7, - 0x2014, 0xA1AA, - 0x2016, 0xA1AC, - 0x2018, 0xA1AE, - 0x2019, 0xA1AF, - 0x201C, 0xA1B0, - 0x201D, 0xA1B1, - 0x2026, 0xA1AD, - 0x2030, 0xA1EB, - 0x2032, 0xA1E4, - 0x2033, 0xA1E5, - 0x203B, 0xA1F9, - 0x2103, 0xA1E6, - 0x2116, 0xA1ED, - 0x2160, 0xA2F1, - 0x2161, 0xA2F2, - 0x2162, 0xA2F3, - 0x2163, 0xA2F4, - 0x2164, 0xA2F5, - 0x2165, 0xA2F6, - 0x2166, 0xA2F7, - 0x2167, 0xA2F8, - 0x2168, 0xA2F9, - 0x2169, 0xA2FA, - 0x216A, 0xA2FB, - 0x216B, 0xA2FC, - 0x2190, 0xA1FB, - 0x2191, 0xA1FC, - 0x2192, 0xA1FA, - 0x2193, 0xA1FD, - 0x2208, 0xA1CA, - 0x220F, 0xA1C7, - 0x2211, 0xA1C6, - 0x221A, 0xA1CC, - 0x221D, 0xA1D8, - 0x221E, 0xA1DE, - 0x2220, 0xA1CF, - 0x2225, 0xA1CE, - 0x2227, 0xA1C4, - 0x2228, 0xA1C5, - 0x2229, 0xA1C9, - 0x222A, 0xA1C8, - 0x222B, 0xA1D2, - 0x222E, 0xA1D3, - 0x2234, 0xA1E0, - 0x2235, 0xA1DF, - 0x2236, 0xA1C3, - 0x2237, 0xA1CB, - 0x223D, 0xA1D7, - 0x2248, 0xA1D6, - 0x224C, 0xA1D5, - 0x2260, 0xA1D9, - 0x2261, 0xA1D4, - 0x2264, 0xA1DC, - 0x2265, 0xA1DD, - 0x226E, 0xA1DA, - 0x226F, 0xA1DB, - 0x2299, 0xA1D1, - 0x22A5, 0xA1CD, - 0x2312, 0xA1D0, - 0x2460, 0xA2D9, - 0x2461, 0xA2DA, - 0x2462, 0xA2DB, - 0x2463, 0xA2DC, - 0x2464, 0xA2DD, - 0x2465, 0xA2DE, - 0x2466, 0xA2DF, - 0x2467, 0xA2E0, - 0x2468, 0xA2E1, - 0x2469, 0xA2E2, - 0x2474, 0xA2C5, - 0x2475, 0xA2C6, - 0x2476, 0xA2C7, - 0x2477, 0xA2C8, - 0x2478, 0xA2C9, - 0x2479, 0xA2CA, - 0x247A, 0xA2CB, - 0x247B, 0xA2CC, - 0x247C, 0xA2CD, - 0x247D, 0xA2CE, - 0x247E, 0xA2CF, - 0x247F, 0xA2D0, - 0x2480, 0xA2D1, - 0x2481, 0xA2D2, - 0x2482, 0xA2D3, - 0x2483, 0xA2D4, - 0x2484, 0xA2D5, - 0x2485, 0xA2D6, - 0x2486, 0xA2D7, - 0x2487, 0xA2D8, - 0x2488, 0xA2B1, - 0x2489, 0xA2B2, - 0x248A, 0xA2B3, - 0x248B, 0xA2B4, - 0x248C, 0xA2B5, - 0x248D, 0xA2B6, - 0x248E, 0xA2B7, - 0x248F, 0xA2B8, - 0x2490, 0xA2B9, - 0x2491, 0xA2BA, - 0x2492, 0xA2BB, - 0x2493, 0xA2BC, - 0x2494, 0xA2BD, - 0x2495, 0xA2BE, - 0x2496, 0xA2BF, - 0x2497, 0xA2C0, - 0x2498, 0xA2C1, - 0x2499, 0xA2C2, - 0x249A, 0xA2C3, - 0x249B, 0xA2C4, - 0x2500, 0xA9A4, - 0x2501, 0xA9A5, - 0x2502, 0xA9A6, - 0x2503, 0xA9A7, - 0x2504, 0xA9A8, - 0x2505, 0xA9A9, - 0x2506, 0xA9AA, - 0x2507, 0xA9AB, - 0x2508, 0xA9AC, - 0x2509, 0xA9AD, - 0x250A, 0xA9AE, - 0x250B, 0xA9AF, - 0x250C, 0xA9B0, - 0x250D, 0xA9B1, - 0x250E, 0xA9B2, - 0x250F, 0xA9B3, - 0x2510, 0xA9B4, - 0x2511, 0xA9B5, - 0x2512, 0xA9B6, - 0x2513, 0xA9B7, - 0x2514, 0xA9B8, - 0x2515, 0xA9B9, - 0x2516, 0xA9BA, - 0x2517, 0xA9BB, - 0x2518, 0xA9BC, - 0x2519, 0xA9BD, - 0x251A, 0xA9BE, - 0x251B, 0xA9BF, - 0x251C, 0xA9C0, - 0x251D, 0xA9C1, - 0x251E, 0xA9C2, - 0x251F, 0xA9C3, - 0x2520, 0xA9C4, - 0x2521, 0xA9C5, - 0x2522, 0xA9C6, - 0x2523, 0xA9C7, - 0x2524, 0xA9C8, - 0x2525, 0xA9C9, - 0x2526, 0xA9CA, - 0x2527, 0xA9CB, - 0x2528, 0xA9CC, - 0x2529, 0xA9CD, - 0x252A, 0xA9CE, - 0x252B, 0xA9CF, - 0x252C, 0xA9D0, - 0x252D, 0xA9D1, - 0x252E, 0xA9D2, - 0x252F, 0xA9D3, - 0x2530, 0xA9D4, - 0x2531, 0xA9D5, - 0x2532, 0xA9D6, - 0x2533, 0xA9D7, - 0x2534, 0xA9D8, - 0x2535, 0xA9D9, - 0x2536, 0xA9DA, - 0x2537, 0xA9DB, - 0x2538, 0xA9DC, - 0x2539, 0xA9DD, - 0x253A, 0xA9DE, - 0x253B, 0xA9DF, - 0x253C, 0xA9E0, - 0x253D, 0xA9E1, - 0x253E, 0xA9E2, - 0x253F, 0xA9E3, - 0x2540, 0xA9E4, - 0x2541, 0xA9E5, - 0x2542, 0xA9E6, - 0x2543, 0xA9E7, - 0x2544, 0xA9E8, - 0x2545, 0xA9E9, - 0x2546, 0xA9EA, - 0x2547, 0xA9EB, - 0x2548, 0xA9EC, - 0x2549, 0xA9ED, - 0x254A, 0xA9EE, - 0x254B, 0xA9EF, - 0x25A0, 0xA1F6, - 0x25A1, 0xA1F5, - 0x25B2, 0xA1F8, - 0x25B3, 0xA1F7, - 0x25C6, 0xA1F4, - 0x25C7, 0xA1F3, - 0x25CB, 0xA1F0, - 0x25CE, 0xA1F2, - 0x25CF, 0xA1F1, - 0x2605, 0xA1EF, - 0x2606, 0xA1EE, - 0x2640, 0xA1E2, - 0x2642, 0xA1E1, - 0x3000, 0xA1A1, - 0x3001, 0xA1A2, - 0x3002, 0xA1A3, - 0x3003, 0xA1A8, - 0x3005, 0xA1A9, - 0x3008, 0xA1B4, - 0x3009, 0xA1B5, - 0x300A, 0xA1B6, - 0x300B, 0xA1B7, - 0x300C, 0xA1B8, - 0x300D, 0xA1B9, - 0x300E, 0xA1BA, - 0x300F, 0xA1BB, - 0x3010, 0xA1BE, - 0x3011, 0xA1BF, - 0x3013, 0xA1FE, - 0x3014, 0xA1B2, - 0x3015, 0xA1B3, - 0x3016, 0xA1BC, - 0x3017, 0xA1BD, - 0x3041, 0xA4A1, - 0x3042, 0xA4A2, - 0x3043, 0xA4A3, - 0x3044, 0xA4A4, - 0x3045, 0xA4A5, - 0x3046, 0xA4A6, - 0x3047, 0xA4A7, - 0x3048, 0xA4A8, - 0x3049, 0xA4A9, - 0x304A, 0xA4AA, - 0x304B, 0xA4AB, - 0x304C, 0xA4AC, - 0x304D, 0xA4AD, - 0x304E, 0xA4AE, - 0x304F, 0xA4AF, - 0x3050, 0xA4B0, - 0x3051, 0xA4B1, - 0x3052, 0xA4B2, - 0x3053, 0xA4B3, - 0x3054, 0xA4B4, - 0x3055, 0xA4B5, - 0x3056, 0xA4B6, - 0x3057, 0xA4B7, - 0x3058, 0xA4B8, - 0x3059, 0xA4B9, - 0x305A, 0xA4BA, - 0x305B, 0xA4BB, - 0x305C, 0xA4BC, - 0x305D, 0xA4BD, - 0x305E, 0xA4BE, - 0x305F, 0xA4BF, - 0x3060, 0xA4C0, - 0x3061, 0xA4C1, - 0x3062, 0xA4C2, - 0x3063, 0xA4C3, - 0x3064, 0xA4C4, - 0x3065, 0xA4C5, - 0x3066, 0xA4C6, - 0x3067, 0xA4C7, - 0x3068, 0xA4C8, - 0x3069, 0xA4C9, - 0x306A, 0xA4CA, - 0x306B, 0xA4CB, - 0x306C, 0xA4CC, - 0x306D, 0xA4CD, - 0x306E, 0xA4CE, - 0x306F, 0xA4CF, - 0x3070, 0xA4D0, - 0x3071, 0xA4D1, - 0x3072, 0xA4D2, - 0x3073, 0xA4D3, - 0x3074, 0xA4D4, - 0x3075, 0xA4D5, - 0x3076, 0xA4D6, - 0x3077, 0xA4D7, - 0x3078, 0xA4D8, - 0x3079, 0xA4D9, - 0x307A, 0xA4DA, - 0x307B, 0xA4DB, - 0x307C, 0xA4DC, - 0x307D, 0xA4DD, - 0x307E, 0xA4DE, - 0x307F, 0xA4DF, - 0x3080, 0xA4E0, - 0x3081, 0xA4E1, - 0x3082, 0xA4E2, - 0x3083, 0xA4E3, - 0x3084, 0xA4E4, - 0x3085, 0xA4E5, - 0x3086, 0xA4E6, - 0x3087, 0xA4E7, - 0x3088, 0xA4E8, - 0x3089, 0xA4E9, - 0x308A, 0xA4EA, - 0x308B, 0xA4EB, - 0x308C, 0xA4EC, - 0x308D, 0xA4ED, - 0x308E, 0xA4EE, - 0x308F, 0xA4EF, - 0x3090, 0xA4F0, - 0x3091, 0xA4F1, - 0x3092, 0xA4F2, - 0x3093, 0xA4F3, - 0x30A1, 0xA5A1, - 0x30A2, 0xA5A2, - 0x30A3, 0xA5A3, - 0x30A4, 0xA5A4, - 0x30A5, 0xA5A5, - 0x30A6, 0xA5A6, - 0x30A7, 0xA5A7, - 0x30A8, 0xA5A8, - 0x30A9, 0xA5A9, - 0x30AA, 0xA5AA, - 0x30AB, 0xA5AB, - 0x30AC, 0xA5AC, - 0x30AD, 0xA5AD, - 0x30AE, 0xA5AE, - 0x30AF, 0xA5AF, - 0x30B0, 0xA5B0, - 0x30B1, 0xA5B1, - 0x30B2, 0xA5B2, - 0x30B3, 0xA5B3, - 0x30B4, 0xA5B4, - 0x30B5, 0xA5B5, - 0x30B6, 0xA5B6, - 0x30B7, 0xA5B7, - 0x30B8, 0xA5B8, - 0x30B9, 0xA5B9, - 0x30BA, 0xA5BA, - 0x30BB, 0xA5BB, - 0x30BC, 0xA5BC, - 0x30BD, 0xA5BD, - 0x30BE, 0xA5BE, - 0x30BF, 0xA5BF, - 0x30C0, 0xA5C0, - 0x30C1, 0xA5C1, - 0x30C2, 0xA5C2, - 0x30C3, 0xA5C3, - 0x30C4, 0xA5C4, - 0x30C5, 0xA5C5, - 0x30C6, 0xA5C6, - 0x30C7, 0xA5C7, - 0x30C8, 0xA5C8, - 0x30C9, 0xA5C9, - 0x30CA, 0xA5CA, - 0x30CB, 0xA5CB, - 0x30CC, 0xA5CC, - 0x30CD, 0xA5CD, - 0x30CE, 0xA5CE, - 0x30CF, 0xA5CF, - 0x30D0, 0xA5D0, - 0x30D1, 0xA5D1, - 0x30D2, 0xA5D2, - 0x30D3, 0xA5D3, - 0x30D4, 0xA5D4, - 0x30D5, 0xA5D5, - 0x30D6, 0xA5D6, - 0x30D7, 0xA5D7, - 0x30D8, 0xA5D8, - 0x30D9, 0xA5D9, - 0x30DA, 0xA5DA, - 0x30DB, 0xA5DB, - 0x30DC, 0xA5DC, - 0x30DD, 0xA5DD, - 0x30DE, 0xA5DE, - 0x30DF, 0xA5DF, - 0x30E0, 0xA5E0, - 0x30E1, 0xA5E1, - 0x30E2, 0xA5E2, - 0x30E3, 0xA5E3, - 0x30E4, 0xA5E4, - 0x30E5, 0xA5E5, - 0x30E6, 0xA5E6, - 0x30E7, 0xA5E7, - 0x30E8, 0xA5E8, - 0x30E9, 0xA5E9, - 0x30EA, 0xA5EA, - 0x30EB, 0xA5EB, - 0x30EC, 0xA5EC, - 0x30ED, 0xA5ED, - 0x30EE, 0xA5EE, - 0x30EF, 0xA5EF, - 0x30F0, 0xA5F0, - 0x30F1, 0xA5F1, - 0x30F2, 0xA5F2, - 0x30F3, 0xA5F3, - 0x30F4, 0xA5F4, - 0x30F5, 0xA5F5, - 0x30F6, 0xA5F6, - 0x3105, 0xA8C5, - 0x3106, 0xA8C6, - 0x3107, 0xA8C7, - 0x3108, 0xA8C8, - 0x3109, 0xA8C9, - 0x310A, 0xA8CA, - 0x310B, 0xA8CB, - 0x310C, 0xA8CC, - 0x310D, 0xA8CD, - 0x310E, 0xA8CE, - 0x310F, 0xA8CF, - 0x3110, 0xA8D0, - 0x3111, 0xA8D1, - 0x3112, 0xA8D2, - 0x3113, 0xA8D3, - 0x3114, 0xA8D4, - 0x3115, 0xA8D5, - 0x3116, 0xA8D6, - 0x3117, 0xA8D7, - 0x3118, 0xA8D8, - 0x3119, 0xA8D9, - 0x311A, 0xA8DA, - 0x311B, 0xA8DB, - 0x311C, 0xA8DC, - 0x311D, 0xA8DD, - 0x311E, 0xA8DE, - 0x311F, 0xA8DF, - 0x3120, 0xA8E0, - 0x3121, 0xA8E1, - 0x3122, 0xA8E2, - 0x3123, 0xA8E3, - 0x3124, 0xA8E4, - 0x3125, 0xA8E5, - 0x3126, 0xA8E6, - 0x3127, 0xA8E7, - 0x3128, 0xA8E8, - 0x3129, 0xA8E9, - 0x3220, 0xA2E5, - 0x3221, 0xA2E6, - 0x3222, 0xA2E7, - 0x3223, 0xA2E8, - 0x3224, 0xA2E9, - 0x3225, 0xA2EA, - 0x3226, 0xA2EB, - 0x3227, 0xA2EC, - 0x3228, 0xA2ED, - 0x3229, 0xA2EE, - 0x4E00, 0xD2BB, - 0x4E01, 0xB6A1, - 0x4E03, 0xC6DF, - 0x4E07, 0xCDF2, - 0x4E08, 0xD5C9, - 0x4E09, 0xC8FD, - 0x4E0A, 0xC9CF, - 0x4E0B, 0xCFC2, - 0x4E0C, 0xD8A2, - 0x4E0D, 0xB2BB, - 0x4E0E, 0xD3EB, - 0x4E10, 0xD8A4, - 0x4E11, 0xB3F3, - 0x4E13, 0xD7A8, - 0x4E14, 0xC7D2, - 0x4E15, 0xD8A7, - 0x4E16, 0xCAC0, - 0x4E18, 0xC7F0, - 0x4E19, 0xB1FB, - 0x4E1A, 0xD2B5, - 0x4E1B, 0xB4D4, - 0x4E1C, 0xB6AB, - 0x4E1D, 0xCBBF, - 0x4E1E, 0xD8A9, - 0x4E22, 0xB6AA, - 0x4E24, 0xC1BD, - 0x4E25, 0xD1CF, - 0x4E27, 0xC9A5, - 0x4E28, 0xD8AD, - 0x4E2A, 0xB8F6, - 0x4E2B, 0xD1BE, - 0x4E2C, 0xE3DC, - 0x4E2D, 0xD6D0, - 0x4E30, 0xB7E1, - 0x4E32, 0xB4AE, - 0x4E34, 0xC1D9, - 0x4E36, 0xD8BC, - 0x4E38, 0xCDE8, - 0x4E39, 0xB5A4, - 0x4E3A, 0xCEAA, - 0x4E3B, 0xD6F7, - 0x4E3D, 0xC0F6, - 0x4E3E, 0xBED9, - 0x4E3F, 0xD8AF, - 0x4E43, 0xC4CB, - 0x4E45, 0xBEC3, - 0x4E47, 0xD8B1, - 0x4E48, 0xC3B4, - 0x4E49, 0xD2E5, - 0x4E4B, 0xD6AE, - 0x4E4C, 0xCEDA, - 0x4E4D, 0xD5A7, - 0x4E4E, 0xBAF5, - 0x4E4F, 0xB7A6, - 0x4E50, 0xC0D6, - 0x4E52, 0xC6B9, - 0x4E53, 0xC5D2, - 0x4E54, 0xC7C7, - 0x4E56, 0xB9D4, - 0x4E58, 0xB3CB, - 0x4E59, 0xD2D2, - 0x4E5C, 0xD8BF, - 0x4E5D, 0xBEC5, - 0x4E5E, 0xC6F2, - 0x4E5F, 0xD2B2, - 0x4E60, 0xCFB0, - 0x4E61, 0xCFE7, - 0x4E66, 0xCAE9, - 0x4E69, 0xD8C0, - 0x4E70, 0xC2F2, - 0x4E71, 0xC2D2, - 0x4E73, 0xC8E9, - 0x4E7E, 0xC7AC, - 0x4E86, 0xC1CB, - 0x4E88, 0xD3E8, - 0x4E89, 0xD5F9, - 0x4E8B, 0xCAC2, - 0x4E8C, 0xB6FE, - 0x4E8D, 0xD8A1, - 0x4E8E, 0xD3DA, - 0x4E8F, 0xBFF7, - 0x4E91, 0xD4C6, - 0x4E92, 0xBBA5, - 0x4E93, 0xD8C1, - 0x4E94, 0xCEE5, - 0x4E95, 0xBEAE, - 0x4E98, 0xD8A8, - 0x4E9A, 0xD1C7, - 0x4E9B, 0xD0A9, - 0x4E9F, 0xD8BD, - 0x4EA0, 0xD9EF, - 0x4EA1, 0xCDF6, - 0x4EA2, 0xBFBA, - 0x4EA4, 0xBDBB, - 0x4EA5, 0xBAA5, - 0x4EA6, 0xD2E0, - 0x4EA7, 0xB2FA, - 0x4EA8, 0xBAE0, - 0x4EA9, 0xC4B6, - 0x4EAB, 0xCFED, - 0x4EAC, 0xBEA9, - 0x4EAD, 0xCDA4, - 0x4EAE, 0xC1C1, - 0x4EB2, 0xC7D7, - 0x4EB3, 0xD9F1, - 0x4EB5, 0xD9F4, - 0x4EBA, 0xC8CB, - 0x4EBB, 0xD8E9, - 0x4EBF, 0xD2DA, - 0x4EC0, 0xCAB2, - 0x4EC1, 0xC8CA, - 0x4EC2, 0xD8EC, - 0x4EC3, 0xD8EA, - 0x4EC4, 0xD8C6, - 0x4EC5, 0xBDF6, - 0x4EC6, 0xC6CD, - 0x4EC7, 0xB3F0, - 0x4EC9, 0xD8EB, - 0x4ECA, 0xBDF1, - 0x4ECB, 0xBDE9, - 0x4ECD, 0xC8D4, - 0x4ECE, 0xB4D3, - 0x4ED1, 0xC2D8, - 0x4ED3, 0xB2D6, - 0x4ED4, 0xD7D0, - 0x4ED5, 0xCACB, - 0x4ED6, 0xCBFB, - 0x4ED7, 0xD5CC, - 0x4ED8, 0xB8B6, - 0x4ED9, 0xCFC9, - 0x4EDD, 0xD9DA, - 0x4EDE, 0xD8F0, - 0x4EDF, 0xC7AA, - 0x4EE1, 0xD8EE, - 0x4EE3, 0xB4FA, - 0x4EE4, 0xC1EE, - 0x4EE5, 0xD2D4, - 0x4EE8, 0xD8ED, - 0x4EEA, 0xD2C7, - 0x4EEB, 0xD8EF, - 0x4EEC, 0xC3C7, - 0x4EF0, 0xD1F6, - 0x4EF2, 0xD6D9, - 0x4EF3, 0xD8F2, - 0x4EF5, 0xD8F5, - 0x4EF6, 0xBCFE, - 0x4EF7, 0xBCDB, - 0x4EFB, 0xC8CE, - 0x4EFD, 0xB7DD, - 0x4EFF, 0xB7C2, - 0x4F01, 0xC6F3, - 0x4F09, 0xD8F8, - 0x4F0A, 0xD2C1, - 0x4F0D, 0xCEE9, - 0x4F0E, 0xBCBF, - 0x4F0F, 0xB7FC, - 0x4F10, 0xB7A5, - 0x4F11, 0xD0DD, - 0x4F17, 0xD6DA, - 0x4F18, 0xD3C5, - 0x4F19, 0xBBEF, - 0x4F1A, 0xBBE1, - 0x4F1B, 0xD8F1, - 0x4F1E, 0xC9A1, - 0x4F1F, 0xCEB0, - 0x4F20, 0xB4AB, - 0x4F22, 0xD8F3, - 0x4F24, 0xC9CB, - 0x4F25, 0xD8F6, - 0x4F26, 0xC2D7, - 0x4F27, 0xD8F7, - 0x4F2A, 0xCEB1, - 0x4F2B, 0xD8F9, - 0x4F2F, 0xB2AE, - 0x4F30, 0xB9C0, - 0x4F32, 0xD9A3, - 0x4F34, 0xB0E9, - 0x4F36, 0xC1E6, - 0x4F38, 0xC9EC, - 0x4F3A, 0xCBC5, - 0x4F3C, 0xCBC6, - 0x4F3D, 0xD9A4, - 0x4F43, 0xB5E8, - 0x4F46, 0xB5AB, - 0x4F4D, 0xCEBB, - 0x4F4E, 0xB5CD, - 0x4F4F, 0xD7A1, - 0x4F50, 0xD7F4, - 0x4F51, 0xD3D3, - 0x4F53, 0xCCE5, - 0x4F55, 0xBACE, - 0x4F57, 0xD9A2, - 0x4F58, 0xD9DC, - 0x4F59, 0xD3E0, - 0x4F5A, 0xD8FD, - 0x4F5B, 0xB7F0, - 0x4F5C, 0xD7F7, - 0x4F5D, 0xD8FE, - 0x4F5E, 0xD8FA, - 0x4F5F, 0xD9A1, - 0x4F60, 0xC4E3, - 0x4F63, 0xD3B6, - 0x4F64, 0xD8F4, - 0x4F65, 0xD9DD, - 0x4F67, 0xD8FB, - 0x4F69, 0xC5E5, - 0x4F6C, 0xC0D0, - 0x4F6F, 0xD1F0, - 0x4F70, 0xB0DB, - 0x4F73, 0xBCD1, - 0x4F74, 0xD9A6, - 0x4F76, 0xD9A5, - 0x4F7B, 0xD9AC, - 0x4F7C, 0xD9AE, - 0x4F7E, 0xD9AB, - 0x4F7F, 0xCAB9, - 0x4F83, 0xD9A9, - 0x4F84, 0xD6B6, - 0x4F88, 0xB3DE, - 0x4F89, 0xD9A8, - 0x4F8B, 0xC0FD, - 0x4F8D, 0xCACC, - 0x4F8F, 0xD9AA, - 0x4F91, 0xD9A7, - 0x4F94, 0xD9B0, - 0x4F97, 0xB6B1, - 0x4F9B, 0xB9A9, - 0x4F9D, 0xD2C0, - 0x4FA0, 0xCFC0, - 0x4FA3, 0xC2C2, - 0x4FA5, 0xBDC4, - 0x4FA6, 0xD5EC, - 0x4FA7, 0xB2E0, - 0x4FA8, 0xC7C8, - 0x4FA9, 0xBFEB, - 0x4FAA, 0xD9AD, - 0x4FAC, 0xD9AF, - 0x4FAE, 0xCEEA, - 0x4FAF, 0xBAEE, - 0x4FB5, 0xC7D6, - 0x4FBF, 0xB1E3, - 0x4FC3, 0xB4D9, - 0x4FC4, 0xB6ED, - 0x4FC5, 0xD9B4, - 0x4FCA, 0xBFA1, - 0x4FCE, 0xD9DE, - 0x4FCF, 0xC7CE, - 0x4FD0, 0xC0FE, - 0x4FD1, 0xD9B8, - 0x4FD7, 0xCBD7, - 0x4FD8, 0xB7FD, - 0x4FDA, 0xD9B5, - 0x4FDC, 0xD9B7, - 0x4FDD, 0xB1A3, - 0x4FDE, 0xD3E1, - 0x4FDF, 0xD9B9, - 0x4FE1, 0xD0C5, - 0x4FE3, 0xD9B6, - 0x4FE6, 0xD9B1, - 0x4FE8, 0xD9B2, - 0x4FE9, 0xC1A9, - 0x4FEA, 0xD9B3, - 0x4FED, 0xBCF3, - 0x4FEE, 0xD0DE, - 0x4FEF, 0xB8A9, - 0x4FF1, 0xBEE3, - 0x4FF3, 0xD9BD, - 0x4FF8, 0xD9BA, - 0x4FFA, 0xB0B3, - 0x4FFE, 0xD9C2, - 0x500C, 0xD9C4, - 0x500D, 0xB1B6, - 0x500F, 0xD9BF, - 0x5012, 0xB5B9, - 0x5014, 0xBEF3, - 0x5018, 0xCCC8, - 0x5019, 0xBAF2, - 0x501A, 0xD2D0, - 0x501C, 0xD9C3, - 0x501F, 0xBDE8, - 0x5021, 0xB3AB, - 0x5025, 0xD9C5, - 0x5026, 0xBEEB, - 0x5028, 0xD9C6, - 0x5029, 0xD9BB, - 0x502A, 0xC4DF, - 0x502C, 0xD9BE, - 0x502D, 0xD9C1, - 0x502E, 0xD9C0, - 0x503A, 0xD5AE, - 0x503C, 0xD6B5, - 0x503E, 0xC7E3, - 0x5043, 0xD9C8, - 0x5047, 0xBCD9, - 0x5048, 0xD9CA, - 0x504C, 0xD9BC, - 0x504E, 0xD9CB, - 0x504F, 0xC6AB, - 0x5055, 0xD9C9, - 0x505A, 0xD7F6, - 0x505C, 0xCDA3, - 0x5065, 0xBDA1, - 0x506C, 0xD9CC, - 0x5076, 0xC5BC, - 0x5077, 0xCDB5, - 0x507B, 0xD9CD, - 0x507E, 0xD9C7, - 0x507F, 0xB3A5, - 0x5080, 0xBFFE, - 0x5085, 0xB8B5, - 0x5088, 0xC0FC, - 0x508D, 0xB0F8, - 0x50A3, 0xB4F6, - 0x50A5, 0xD9CE, - 0x50A7, 0xD9CF, - 0x50A8, 0xB4A2, - 0x50A9, 0xD9D0, - 0x50AC, 0xB4DF, - 0x50B2, 0xB0C1, - 0x50BA, 0xD9D1, - 0x50BB, 0xC9B5, - 0x50CF, 0xCFF1, - 0x50D6, 0xD9D2, - 0x50DA, 0xC1C5, - 0x50E6, 0xD9D6, - 0x50E7, 0xC9AE, - 0x50EC, 0xD9D5, - 0x50ED, 0xD9D4, - 0x50EE, 0xD9D7, - 0x50F3, 0xCBDB, - 0x50F5, 0xBDA9, - 0x50FB, 0xC6A7, - 0x5106, 0xD9D3, - 0x5107, 0xD9D8, - 0x510B, 0xD9D9, - 0x5112, 0xC8E5, - 0x5121, 0xC0DC, - 0x513F, 0xB6F9, - 0x5140, 0xD8A3, - 0x5141, 0xD4CA, - 0x5143, 0xD4AA, - 0x5144, 0xD0D6, - 0x5145, 0xB3E4, - 0x5146, 0xD5D7, - 0x5148, 0xCFC8, - 0x5149, 0xB9E2, - 0x514B, 0xBFCB, - 0x514D, 0xC3E2, - 0x5151, 0xB6D2, - 0x5154, 0xCDC3, - 0x5155, 0xD9EE, - 0x5156, 0xD9F0, - 0x515A, 0xB5B3, - 0x515C, 0xB6B5, - 0x5162, 0xBEA4, - 0x5165, 0xC8EB, - 0x5168, 0xC8AB, - 0x516B, 0xB0CB, - 0x516C, 0xB9AB, - 0x516D, 0xC1F9, - 0x516E, 0xD9E2, - 0x5170, 0xC0BC, - 0x5171, 0xB9B2, - 0x5173, 0xB9D8, - 0x5174, 0xD0CB, - 0x5175, 0xB1F8, - 0x5176, 0xC6E4, - 0x5177, 0xBEDF, - 0x5178, 0xB5E4, - 0x5179, 0xD7C8, - 0x517B, 0xD1F8, - 0x517C, 0xBCE6, - 0x517D, 0xCADE, - 0x5180, 0xBCBD, - 0x5181, 0xD9E6, - 0x5182, 0xD8E7, - 0x5185, 0xC4DA, - 0x5188, 0xB8D4, - 0x5189, 0xC8BD, - 0x518C, 0xB2E1, - 0x518D, 0xD4D9, - 0x5192, 0xC3B0, - 0x5195, 0xC3E1, - 0x5196, 0xDAA2, - 0x5197, 0xC8DF, - 0x5199, 0xD0B4, - 0x519B, 0xBEFC, - 0x519C, 0xC5A9, - 0x51A0, 0xB9DA, - 0x51A2, 0xDAA3, - 0x51A4, 0xD4A9, - 0x51A5, 0xDAA4, - 0x51AB, 0xD9FB, - 0x51AC, 0xB6AC, - 0x51AF, 0xB7EB, - 0x51B0, 0xB1F9, - 0x51B1, 0xD9FC, - 0x51B2, 0xB3E5, - 0x51B3, 0xBEF6, - 0x51B5, 0xBFF6, - 0x51B6, 0xD2B1, - 0x51B7, 0xC0E4, - 0x51BB, 0xB6B3, - 0x51BC, 0xD9FE, - 0x51BD, 0xD9FD, - 0x51C0, 0xBEBB, - 0x51C4, 0xC6E0, - 0x51C6, 0xD7BC, - 0x51C7, 0xDAA1, - 0x51C9, 0xC1B9, - 0x51CB, 0xB5F2, - 0x51CC, 0xC1E8, - 0x51CF, 0xBCF5, - 0x51D1, 0xB4D5, - 0x51DB, 0xC1DD, - 0x51DD, 0xC4FD, - 0x51E0, 0xBCB8, - 0x51E1, 0xB7B2, - 0x51E4, 0xB7EF, - 0x51EB, 0xD9EC, - 0x51ED, 0xC6BE, - 0x51EF, 0xBFAD, - 0x51F0, 0xBBCB, - 0x51F3, 0xB5CA, - 0x51F5, 0xDBC9, - 0x51F6, 0xD0D7, - 0x51F8, 0xCDB9, - 0x51F9, 0xB0BC, - 0x51FA, 0xB3F6, - 0x51FB, 0xBBF7, - 0x51FC, 0xDBCA, - 0x51FD, 0xBAAF, - 0x51FF, 0xD4E4, - 0x5200, 0xB5B6, - 0x5201, 0xB5F3, - 0x5202, 0xD8D6, - 0x5203, 0xC8D0, - 0x5206, 0xB7D6, - 0x5207, 0xC7D0, - 0x5208, 0xD8D7, - 0x520A, 0xBFAF, - 0x520D, 0xDBBB, - 0x520E, 0xD8D8, - 0x5211, 0xD0CC, - 0x5212, 0xBBAE, - 0x5216, 0xEBBE, - 0x5217, 0xC1D0, - 0x5218, 0xC1F5, - 0x5219, 0xD4F2, - 0x521A, 0xB8D5, - 0x521B, 0xB4B4, - 0x521D, 0xB3F5, - 0x5220, 0xC9BE, - 0x5224, 0xC5D0, - 0x5228, 0xC5D9, - 0x5229, 0xC0FB, - 0x522B, 0xB1F0, - 0x522D, 0xD8D9, - 0x522E, 0xB9CE, - 0x5230, 0xB5BD, - 0x5233, 0xD8DA, - 0x5236, 0xD6C6, - 0x5237, 0xCBA2, - 0x5238, 0xC8AF, - 0x5239, 0xC9B2, - 0x523A, 0xB4CC, - 0x523B, 0xBFCC, - 0x523D, 0xB9F4, - 0x523F, 0xD8DB, - 0x5240, 0xD8DC, - 0x5241, 0xB6E7, - 0x5242, 0xBCC1, - 0x5243, 0xCCEA, - 0x524A, 0xCFF7, - 0x524C, 0xD8DD, - 0x524D, 0xC7B0, - 0x5250, 0xB9D0, - 0x5251, 0xBDA3, - 0x5254, 0xCCDE, - 0x5256, 0xC6CA, - 0x525C, 0xD8E0, - 0x525E, 0xD8DE, - 0x5261, 0xD8DF, - 0x5265, 0xB0FE, - 0x5267, 0xBEE7, - 0x5269, 0xCAA3, - 0x526A, 0xBCF4, - 0x526F, 0xB8B1, - 0x5272, 0xB8EE, - 0x527D, 0xD8E2, - 0x527F, 0xBDCB, - 0x5281, 0xD8E4, - 0x5282, 0xD8E3, - 0x5288, 0xC5FC, - 0x5290, 0xD8E5, - 0x5293, 0xD8E6, - 0x529B, 0xC1A6, - 0x529D, 0xC8B0, - 0x529E, 0xB0EC, - 0x529F, 0xB9A6, - 0x52A0, 0xBCD3, - 0x52A1, 0xCEF1, - 0x52A2, 0xDBBD, - 0x52A3, 0xC1D3, - 0x52A8, 0xB6AF, - 0x52A9, 0xD6FA, - 0x52AA, 0xC5AC, - 0x52AB, 0xBDD9, - 0x52AC, 0xDBBE, - 0x52AD, 0xDBBF, - 0x52B1, 0xC0F8, - 0x52B2, 0xBEA2, - 0x52B3, 0xC0CD, - 0x52BE, 0xDBC0, - 0x52BF, 0xCAC6, - 0x52C3, 0xB2AA, - 0x52C7, 0xD3C2, - 0x52C9, 0xC3E3, - 0x52CB, 0xD1AB, - 0x52D0, 0xDBC2, - 0x52D2, 0xC0D5, - 0x52D6, 0xDBC3, - 0x52D8, 0xBFB1, - 0x52DF, 0xC4BC, - 0x52E4, 0xC7DA, - 0x52F0, 0xDBC4, - 0x52F9, 0xD9E8, - 0x52FA, 0xC9D7, - 0x52FE, 0xB9B4, - 0x52FF, 0xCEF0, - 0x5300, 0xD4C8, - 0x5305, 0xB0FC, - 0x5306, 0xB4D2, - 0x5308, 0xD0D9, - 0x530D, 0xD9E9, - 0x530F, 0xDECB, - 0x5310, 0xD9EB, - 0x5315, 0xD8B0, - 0x5316, 0xBBAF, - 0x5317, 0xB1B1, - 0x5319, 0xB3D7, - 0x531A, 0xD8CE, - 0x531D, 0xD4D1, - 0x5320, 0xBDB3, - 0x5321, 0xBFEF, - 0x5323, 0xCFBB, - 0x5326, 0xD8D0, - 0x532A, 0xB7CB, - 0x532E, 0xD8D1, - 0x5339, 0xC6A5, - 0x533A, 0xC7F8, - 0x533B, 0xD2BD, - 0x533E, 0xD8D2, - 0x533F, 0xC4E4, - 0x5341, 0xCAAE, - 0x5343, 0xC7A7, - 0x5345, 0xD8A6, - 0x5347, 0xC9FD, - 0x5348, 0xCEE7, - 0x5349, 0xBBDC, - 0x534A, 0xB0EB, - 0x534E, 0xBBAA, - 0x534F, 0xD0AD, - 0x5351, 0xB1B0, - 0x5352, 0xD7E4, - 0x5353, 0xD7BF, - 0x5355, 0xB5A5, - 0x5356, 0xC2F4, - 0x5357, 0xC4CF, - 0x535A, 0xB2A9, - 0x535C, 0xB2B7, - 0x535E, 0xB1E5, - 0x535F, 0xDFB2, - 0x5360, 0xD5BC, - 0x5361, 0xBFA8, - 0x5362, 0xC2AC, - 0x5363, 0xD8D5, - 0x5364, 0xC2B1, - 0x5366, 0xD8D4, - 0x5367, 0xCED4, - 0x5369, 0xDAE0, - 0x536B, 0xCEC0, - 0x536E, 0xD8B4, - 0x536F, 0xC3AE, - 0x5370, 0xD3A1, - 0x5371, 0xCEA3, - 0x5373, 0xBCB4, - 0x5374, 0xC8B4, - 0x5375, 0xC2D1, - 0x5377, 0xBEED, - 0x5378, 0xD0B6, - 0x537A, 0xDAE1, - 0x537F, 0xC7E4, - 0x5382, 0xB3A7, - 0x5384, 0xB6F2, - 0x5385, 0xCCFC, - 0x5386, 0xC0FA, - 0x5389, 0xC0F7, - 0x538B, 0xD1B9, - 0x538C, 0xD1E1, - 0x538D, 0xD8C7, - 0x5395, 0xB2DE, - 0x5398, 0xC0E5, - 0x539A, 0xBAF1, - 0x539D, 0xD8C8, - 0x539F, 0xD4AD, - 0x53A2, 0xCFE1, - 0x53A3, 0xD8C9, - 0x53A5, 0xD8CA, - 0x53A6, 0xCFC3, - 0x53A8, 0xB3F8, - 0x53A9, 0xBEC7, - 0x53AE, 0xD8CB, - 0x53B6, 0xDBCC, - 0x53BB, 0xC8A5, - 0x53BF, 0xCFD8, - 0x53C1, 0xC8FE, - 0x53C2, 0xB2CE, - 0x53C8, 0xD3D6, - 0x53C9, 0xB2E6, - 0x53CA, 0xBCB0, - 0x53CB, 0xD3D1, - 0x53CC, 0xCBAB, - 0x53CD, 0xB7B4, - 0x53D1, 0xB7A2, - 0x53D4, 0xCAE5, - 0x53D6, 0xC8A1, - 0x53D7, 0xCADC, - 0x53D8, 0xB1E4, - 0x53D9, 0xD0F0, - 0x53DB, 0xC5D1, - 0x53DF, 0xDBC5, - 0x53E0, 0xB5FE, - 0x53E3, 0xBFDA, - 0x53E4, 0xB9C5, - 0x53E5, 0xBEE4, - 0x53E6, 0xC1ED, - 0x53E8, 0xDFB6, - 0x53E9, 0xDFB5, - 0x53EA, 0xD6BB, - 0x53EB, 0xBDD0, - 0x53EC, 0xD5D9, - 0x53ED, 0xB0C8, - 0x53EE, 0xB6A3, - 0x53EF, 0xBFC9, - 0x53F0, 0xCCA8, - 0x53F1, 0xDFB3, - 0x53F2, 0xCAB7, - 0x53F3, 0xD3D2, - 0x53F5, 0xD8CF, - 0x53F6, 0xD2B6, - 0x53F7, 0xBAC5, - 0x53F8, 0xCBBE, - 0x53F9, 0xCCBE, - 0x53FB, 0xDFB7, - 0x53FC, 0xB5F0, - 0x53FD, 0xDFB4, - 0x5401, 0xD3F5, - 0x5403, 0xB3D4, - 0x5404, 0xB8F7, - 0x5406, 0xDFBA, - 0x5408, 0xBACF, - 0x5409, 0xBCAA, - 0x540A, 0xB5F5, - 0x540C, 0xCDAC, - 0x540D, 0xC3FB, - 0x540E, 0xBAF3, - 0x540F, 0xC0F4, - 0x5410, 0xCDC2, - 0x5411, 0xCFF2, - 0x5412, 0xDFB8, - 0x5413, 0xCFC5, - 0x5415, 0xC2C0, - 0x5416, 0xDFB9, - 0x5417, 0xC2F0, - 0x541B, 0xBEFD, - 0x541D, 0xC1DF, - 0x541E, 0xCDCC, - 0x541F, 0xD2F7, - 0x5420, 0xB7CD, - 0x5421, 0xDFC1, - 0x5423, 0xDFC4, - 0x5426, 0xB7F1, - 0x5427, 0xB0C9, - 0x5428, 0xB6D6, - 0x5429, 0xB7D4, - 0x542B, 0xBAAC, - 0x542C, 0xCCFD, - 0x542D, 0xBFD4, - 0x542E, 0xCBB1, - 0x542F, 0xC6F4, - 0x5431, 0xD6A8, - 0x5432, 0xDFC5, - 0x5434, 0xCEE2, - 0x5435, 0xB3B3, - 0x5438, 0xCEFC, - 0x5439, 0xB4B5, - 0x543B, 0xCEC7, - 0x543C, 0xBAF0, - 0x543E, 0xCEE1, - 0x5440, 0xD1BD, - 0x5443, 0xDFC0, - 0x5446, 0xB4F4, - 0x5448, 0xB3CA, - 0x544A, 0xB8E6, - 0x544B, 0xDFBB, - 0x5450, 0xC4C5, - 0x5452, 0xDFBC, - 0x5453, 0xDFBD, - 0x5454, 0xDFBE, - 0x5455, 0xC5BB, - 0x5456, 0xDFBF, - 0x5457, 0xDFC2, - 0x5458, 0xD4B1, - 0x5459, 0xDFC3, - 0x545B, 0xC7BA, - 0x545C, 0xCED8, - 0x5462, 0xC4D8, - 0x5464, 0xDFCA, - 0x5466, 0xDFCF, - 0x5468, 0xD6DC, - 0x5471, 0xDFC9, - 0x5472, 0xDFDA, - 0x5473, 0xCEB6, - 0x5475, 0xBAC7, - 0x5476, 0xDFCE, - 0x5477, 0xDFC8, - 0x5478, 0xC5DE, - 0x547B, 0xC9EB, - 0x547C, 0xBAF4, - 0x547D, 0xC3FC, - 0x5480, 0xBED7, - 0x5482, 0xDFC6, - 0x5484, 0xDFCD, - 0x5486, 0xC5D8, - 0x548B, 0xD5A6, - 0x548C, 0xBACD, - 0x548E, 0xBECC, - 0x548F, 0xD3BD, - 0x5490, 0xB8C0, - 0x5492, 0xD6E4, - 0x5494, 0xDFC7, - 0x5495, 0xB9BE, - 0x5496, 0xBFA7, - 0x5499, 0xC1FC, - 0x549A, 0xDFCB, - 0x549B, 0xDFCC, - 0x549D, 0xDFD0, - 0x54A3, 0xDFDB, - 0x54A4, 0xDFE5, - 0x54A6, 0xDFD7, - 0x54A7, 0xDFD6, - 0x54A8, 0xD7C9, - 0x54A9, 0xDFE3, - 0x54AA, 0xDFE4, - 0x54AB, 0xE5EB, - 0x54AC, 0xD2A7, - 0x54AD, 0xDFD2, - 0x54AF, 0xBFA9, - 0x54B1, 0xD4DB, - 0x54B3, 0xBFC8, - 0x54B4, 0xDFD4, - 0x54B8, 0xCFCC, - 0x54BB, 0xDFDD, - 0x54BD, 0xD1CA, - 0x54BF, 0xDFDE, - 0x54C0, 0xB0A7, - 0x54C1, 0xC6B7, - 0x54C2, 0xDFD3, - 0x54C4, 0xBAE5, - 0x54C6, 0xB6DF, - 0x54C7, 0xCDDB, - 0x54C8, 0xB9FE, - 0x54C9, 0xD4D5, - 0x54CC, 0xDFDF, - 0x54CD, 0xCFEC, - 0x54CE, 0xB0A5, - 0x54CF, 0xDFE7, - 0x54D0, 0xDFD1, - 0x54D1, 0xD1C6, - 0x54D2, 0xDFD5, - 0x54D3, 0xDFD8, - 0x54D4, 0xDFD9, - 0x54D5, 0xDFDC, - 0x54D7, 0xBBA9, - 0x54D9, 0xDFE0, - 0x54DA, 0xDFE1, - 0x54DC, 0xDFE2, - 0x54DD, 0xDFE6, - 0x54DE, 0xDFE8, - 0x54DF, 0xD3B4, - 0x54E5, 0xB8E7, - 0x54E6, 0xC5B6, - 0x54E7, 0xDFEA, - 0x54E8, 0xC9DA, - 0x54E9, 0xC1A8, - 0x54EA, 0xC4C4, - 0x54ED, 0xBFDE, - 0x54EE, 0xCFF8, - 0x54F2, 0xD5DC, - 0x54F3, 0xDFEE, - 0x54FA, 0xB2B8, - 0x54FC, 0xBADF, - 0x54FD, 0xDFEC, - 0x54FF, 0xDBC1, - 0x5501, 0xD1E4, - 0x5506, 0xCBF4, - 0x5507, 0xB4BD, - 0x5509, 0xB0A6, - 0x550F, 0xDFF1, - 0x5510, 0xCCC6, - 0x5511, 0xDFF2, - 0x5514, 0xDFED, - 0x551B, 0xDFE9, - 0x5520, 0xDFEB, - 0x5522, 0xDFEF, - 0x5523, 0xDFF0, - 0x5524, 0xBBBD, - 0x5527, 0xDFF3, - 0x552A, 0xDFF4, - 0x552C, 0xBBA3, - 0x552E, 0xCADB, - 0x552F, 0xCEA8, - 0x5530, 0xE0A7, - 0x5531, 0xB3AA, - 0x5533, 0xE0A6, - 0x5537, 0xE0A1, - 0x553C, 0xDFFE, - 0x553E, 0xCDD9, - 0x553F, 0xDFFC, - 0x5541, 0xDFFA, - 0x5543, 0xBFD0, - 0x5544, 0xD7C4, - 0x5546, 0xC9CC, - 0x5549, 0xDFF8, - 0x554A, 0xB0A1, - 0x5550, 0xDFFD, - 0x5555, 0xDFFB, - 0x5556, 0xE0A2, - 0x555C, 0xE0A8, - 0x5561, 0xB7C8, - 0x5564, 0xC6A1, - 0x5565, 0xC9B6, - 0x5566, 0xC0B2, - 0x5567, 0xDFF5, - 0x556A, 0xC5BE, - 0x556C, 0xD8C4, - 0x556D, 0xDFF9, - 0x556E, 0xC4F6, - 0x5575, 0xE0A3, - 0x5576, 0xE0A4, - 0x5577, 0xE0A5, - 0x5578, 0xD0A5, - 0x557B, 0xE0B4, - 0x557C, 0xCCE4, - 0x557E, 0xE0B1, - 0x5580, 0xBFA6, - 0x5581, 0xE0AF, - 0x5582, 0xCEB9, - 0x5583, 0xE0AB, - 0x5584, 0xC9C6, - 0x5587, 0xC0AE, - 0x5588, 0xE0AE, - 0x5589, 0xBAED, - 0x558A, 0xBAB0, - 0x558B, 0xE0A9, - 0x558F, 0xDFF6, - 0x5591, 0xE0B3, - 0x5594, 0xE0B8, - 0x5598, 0xB4AD, - 0x5599, 0xE0B9, - 0x559C, 0xCFB2, - 0x559D, 0xBAC8, - 0x559F, 0xE0B0, - 0x55A7, 0xD0FA, - 0x55B1, 0xE0AC, - 0x55B3, 0xD4FB, - 0x55B5, 0xDFF7, - 0x55B7, 0xC5E7, - 0x55B9, 0xE0AD, - 0x55BB, 0xD3F7, - 0x55BD, 0xE0B6, - 0x55BE, 0xE0B7, - 0x55C4, 0xE0C4, - 0x55C5, 0xD0E1, - 0x55C9, 0xE0BC, - 0x55CC, 0xE0C9, - 0x55CD, 0xE0CA, - 0x55D1, 0xE0BE, - 0x55D2, 0xE0AA, - 0x55D3, 0xC9A4, - 0x55D4, 0xE0C1, - 0x55D6, 0xE0B2, - 0x55DC, 0xCAC8, - 0x55DD, 0xE0C3, - 0x55DF, 0xE0B5, - 0x55E1, 0xCECB, - 0x55E3, 0xCBC3, - 0x55E4, 0xE0CD, - 0x55E5, 0xE0C6, - 0x55E6, 0xE0C2, - 0x55E8, 0xE0CB, - 0x55EA, 0xE0BA, - 0x55EB, 0xE0BF, - 0x55EC, 0xE0C0, - 0x55EF, 0xE0C5, - 0x55F2, 0xE0C7, - 0x55F3, 0xE0C8, - 0x55F5, 0xE0CC, - 0x55F7, 0xE0BB, - 0x55FD, 0xCBD4, - 0x55FE, 0xE0D5, - 0x5600, 0xE0D6, - 0x5601, 0xE0D2, - 0x5608, 0xE0D0, - 0x5609, 0xBCCE, - 0x560C, 0xE0D1, - 0x560E, 0xB8C2, - 0x560F, 0xD8C5, - 0x5618, 0xD0EA, - 0x561B, 0xC2EF, - 0x561E, 0xE0CF, - 0x561F, 0xE0BD, - 0x5623, 0xE0D4, - 0x5624, 0xE0D3, - 0x5627, 0xE0D7, - 0x562C, 0xE0DC, - 0x562D, 0xE0D8, - 0x5631, 0xD6F6, - 0x5632, 0xB3B0, - 0x5634, 0xD7EC, - 0x5636, 0xCBBB, - 0x5639, 0xE0DA, - 0x563B, 0xCEFB, - 0x563F, 0xBAD9, - 0x564C, 0xE0E1, - 0x564D, 0xE0DD, - 0x564E, 0xD2AD, - 0x5654, 0xE0E2, - 0x5657, 0xE0DB, - 0x5658, 0xE0D9, - 0x5659, 0xE0DF, - 0x565C, 0xE0E0, - 0x5662, 0xE0DE, - 0x5664, 0xE0E4, - 0x5668, 0xC6F7, - 0x5669, 0xD8AC, - 0x566A, 0xD4EB, - 0x566B, 0xE0E6, - 0x566C, 0xCAC9, - 0x5671, 0xE0E5, - 0x5676, 0xB8C1, - 0x567B, 0xE0E7, - 0x567C, 0xE0E8, - 0x5685, 0xE0E9, - 0x5686, 0xE0E3, - 0x568E, 0xBABF, - 0x568F, 0xCCE7, - 0x5693, 0xE0EA, - 0x56A3, 0xCFF9, - 0x56AF, 0xE0EB, - 0x56B7, 0xC8C2, - 0x56BC, 0xBDC0, - 0x56CA, 0xC4D2, - 0x56D4, 0xE0EC, - 0x56D7, 0xE0ED, - 0x56DA, 0xC7F4, - 0x56DB, 0xCBC4, - 0x56DD, 0xE0EE, - 0x56DE, 0xBBD8, - 0x56DF, 0xD8B6, - 0x56E0, 0xD2F2, - 0x56E1, 0xE0EF, - 0x56E2, 0xCDC5, - 0x56E4, 0xB6DA, - 0x56EB, 0xE0F1, - 0x56ED, 0xD4B0, - 0x56F0, 0xC0A7, - 0x56F1, 0xB4D1, - 0x56F4, 0xCEA7, - 0x56F5, 0xE0F0, - 0x56F9, 0xE0F2, - 0x56FA, 0xB9CC, - 0x56FD, 0xB9FA, - 0x56FE, 0xCDBC, - 0x56FF, 0xE0F3, - 0x5703, 0xC6D4, - 0x5704, 0xE0F4, - 0x5706, 0xD4B2, - 0x5708, 0xC8A6, - 0x5709, 0xE0F6, - 0x570A, 0xE0F5, - 0x571C, 0xE0F7, - 0x571F, 0xCDC1, - 0x5723, 0xCAA5, - 0x5728, 0xD4DA, - 0x5729, 0xDBD7, - 0x572A, 0xDBD9, - 0x572C, 0xDBD8, - 0x572D, 0xB9E7, - 0x572E, 0xDBDC, - 0x572F, 0xDBDD, - 0x5730, 0xB5D8, - 0x5733, 0xDBDA, - 0x5739, 0xDBDB, - 0x573A, 0xB3A1, - 0x573B, 0xDBDF, - 0x573E, 0xBBF8, - 0x5740, 0xD6B7, - 0x5742, 0xDBE0, - 0x5747, 0xBEF9, - 0x574A, 0xB7BB, - 0x574C, 0xDBD0, - 0x574D, 0xCCAE, - 0x574E, 0xBFB2, - 0x574F, 0xBBB5, - 0x5750, 0xD7F8, - 0x5751, 0xBFD3, - 0x5757, 0xBFE9, - 0x575A, 0xBCE1, - 0x575B, 0xCCB3, - 0x575C, 0xDBDE, - 0x575D, 0xB0D3, - 0x575E, 0xCEEB, - 0x575F, 0xB7D8, - 0x5760, 0xD7B9, - 0x5761, 0xC6C2, - 0x5764, 0xC0A4, - 0x5766, 0xCCB9, - 0x5768, 0xDBE7, - 0x5769, 0xDBE1, - 0x576A, 0xC6BA, - 0x576B, 0xDBE3, - 0x576D, 0xDBE8, - 0x576F, 0xC5F7, - 0x5773, 0xDBEA, - 0x5776, 0xDBE9, - 0x5777, 0xBFC0, - 0x577B, 0xDBE6, - 0x577C, 0xDBE5, - 0x5782, 0xB4B9, - 0x5783, 0xC0AC, - 0x5784, 0xC2A2, - 0x5785, 0xDBE2, - 0x5786, 0xDBE4, - 0x578B, 0xD0CD, - 0x578C, 0xDBED, - 0x5792, 0xC0DD, - 0x5793, 0xDBF2, - 0x579B, 0xB6E2, - 0x57A0, 0xDBF3, - 0x57A1, 0xDBD2, - 0x57A2, 0xB9B8, - 0x57A3, 0xD4AB, - 0x57A4, 0xDBEC, - 0x57A6, 0xBFD1, - 0x57A7, 0xDBF0, - 0x57A9, 0xDBD1, - 0x57AB, 0xB5E6, - 0x57AD, 0xDBEB, - 0x57AE, 0xBFE5, - 0x57B2, 0xDBEE, - 0x57B4, 0xDBF1, - 0x57B8, 0xDBF9, - 0x57C2, 0xB9A1, - 0x57C3, 0xB0A3, - 0x57CB, 0xC2F1, - 0x57CE, 0xB3C7, - 0x57CF, 0xDBEF, - 0x57D2, 0xDBF8, - 0x57D4, 0xC6D2, - 0x57D5, 0xDBF4, - 0x57D8, 0xDBF5, - 0x57D9, 0xDBF7, - 0x57DA, 0xDBF6, - 0x57DD, 0xDBFE, - 0x57DF, 0xD3F2, - 0x57E0, 0xB2BA, - 0x57E4, 0xDBFD, - 0x57ED, 0xDCA4, - 0x57EF, 0xDBFB, - 0x57F4, 0xDBFA, - 0x57F8, 0xDBFC, - 0x57F9, 0xC5E0, - 0x57FA, 0xBBF9, - 0x57FD, 0xDCA3, - 0x5800, 0xDCA5, - 0x5802, 0xCCC3, - 0x5806, 0xB6D1, - 0x5807, 0xDDC0, - 0x580B, 0xDCA1, - 0x580D, 0xDCA2, - 0x5811, 0xC7B5, - 0x5815, 0xB6E9, - 0x5819, 0xDCA7, - 0x581E, 0xDCA6, - 0x5820, 0xDCA9, - 0x5821, 0xB1A4, - 0x5824, 0xB5CC, - 0x582A, 0xBFB0, - 0x5830, 0xD1DF, - 0x5835, 0xB6C2, - 0x5844, 0xDCA8, - 0x584C, 0xCBFA, - 0x584D, 0xEBF3, - 0x5851, 0xCBDC, - 0x5854, 0xCBFE, - 0x5858, 0xCCC1, - 0x585E, 0xC8FB, - 0x5865, 0xDCAA, - 0x586B, 0xCCEE, - 0x586C, 0xDCAB, - 0x587E, 0xDBD3, - 0x5880, 0xDCAF, - 0x5881, 0xDCAC, - 0x5883, 0xBEB3, - 0x5885, 0xCAFB, - 0x5889, 0xDCAD, - 0x5892, 0xC9CA, - 0x5893, 0xC4B9, - 0x5899, 0xC7BD, - 0x589A, 0xDCAE, - 0x589E, 0xD4F6, - 0x589F, 0xD0E6, - 0x58A8, 0xC4AB, - 0x58A9, 0xB6D5, - 0x58BC, 0xDBD4, - 0x58C1, 0xB1DA, - 0x58C5, 0xDBD5, - 0x58D1, 0xDBD6, - 0x58D5, 0xBABE, - 0x58E4, 0xC8C0, - 0x58EB, 0xCABF, - 0x58EC, 0xC8C9, - 0x58EE, 0xD7B3, - 0x58F0, 0xC9F9, - 0x58F3, 0xBFC7, - 0x58F6, 0xBAF8, - 0x58F9, 0xD2BC, - 0x5902, 0xE2BA, - 0x5904, 0xB4A6, - 0x5907, 0xB1B8, - 0x590D, 0xB8B4, - 0x590F, 0xCFC4, - 0x5914, 0xD9E7, - 0x5915, 0xCFA6, - 0x5916, 0xCDE2, - 0x5919, 0xD9ED, - 0x591A, 0xB6E0, - 0x591C, 0xD2B9, - 0x591F, 0xB9BB, - 0x5924, 0xE2B9, - 0x5925, 0xE2B7, - 0x5927, 0xB4F3, - 0x5929, 0xCCEC, - 0x592A, 0xCCAB, - 0x592B, 0xB7F2, - 0x592D, 0xD8B2, - 0x592E, 0xD1EB, - 0x592F, 0xBABB, - 0x5931, 0xCAA7, - 0x5934, 0xCDB7, - 0x5937, 0xD2C4, - 0x5938, 0xBFE4, - 0x5939, 0xBCD0, - 0x593A, 0xB6E1, - 0x593C, 0xDEC5, - 0x5941, 0xDEC6, - 0x5942, 0xDBBC, - 0x5944, 0xD1D9, - 0x5947, 0xC6E6, - 0x5948, 0xC4CE, - 0x5949, 0xB7EE, - 0x594B, 0xB7DC, - 0x594E, 0xBFFC, - 0x594F, 0xD7E0, - 0x5951, 0xC6F5, - 0x5954, 0xB1BC, - 0x5955, 0xDEC8, - 0x5956, 0xBDB1, - 0x5957, 0xCCD7, - 0x5958, 0xDECA, - 0x595A, 0xDEC9, - 0x5960, 0xB5EC, - 0x5962, 0xC9DD, - 0x5965, 0xB0C2, - 0x5973, 0xC5AE, - 0x5974, 0xC5AB, - 0x5976, 0xC4CC, - 0x5978, 0xBCE9, - 0x5979, 0xCBFD, - 0x597D, 0xBAC3, - 0x5981, 0xE5F9, - 0x5982, 0xC8E7, - 0x5983, 0xE5FA, - 0x5984, 0xCDFD, - 0x5986, 0xD7B1, - 0x5987, 0xB8BE, - 0x5988, 0xC2E8, - 0x598A, 0xC8D1, - 0x598D, 0xE5FB, - 0x5992, 0xB6CA, - 0x5993, 0xBCCB, - 0x5996, 0xD1FD, - 0x5997, 0xE6A1, - 0x5999, 0xC3EE, - 0x599E, 0xE6A4, - 0x59A3, 0xE5FE, - 0x59A4, 0xE6A5, - 0x59A5, 0xCDD7, - 0x59A8, 0xB7C1, - 0x59A9, 0xE5FC, - 0x59AA, 0xE5FD, - 0x59AB, 0xE6A3, - 0x59AE, 0xC4DD, - 0x59AF, 0xE6A8, - 0x59B2, 0xE6A7, - 0x59B9, 0xC3C3, - 0x59BB, 0xC6DE, - 0x59BE, 0xE6AA, - 0x59C6, 0xC4B7, - 0x59CA, 0xE6A2, - 0x59CB, 0xCABC, - 0x59D0, 0xBDE3, - 0x59D1, 0xB9C3, - 0x59D2, 0xE6A6, - 0x59D3, 0xD0D5, - 0x59D4, 0xCEAF, - 0x59D7, 0xE6A9, - 0x59D8, 0xE6B0, - 0x59DA, 0xD2A6, - 0x59DC, 0xBDAA, - 0x59DD, 0xE6AD, - 0x59E3, 0xE6AF, - 0x59E5, 0xC0D1, - 0x59E8, 0xD2CC, - 0x59EC, 0xBCA7, - 0x59F9, 0xE6B1, - 0x59FB, 0xD2F6, - 0x59FF, 0xD7CB, - 0x5A01, 0xCDFE, - 0x5A03, 0xCDDE, - 0x5A04, 0xC2A6, - 0x5A05, 0xE6AB, - 0x5A06, 0xE6AC, - 0x5A07, 0xBDBF, - 0x5A08, 0xE6AE, - 0x5A09, 0xE6B3, - 0x5A0C, 0xE6B2, - 0x5A11, 0xE6B6, - 0x5A13, 0xE6B8, - 0x5A18, 0xC4EF, - 0x5A1C, 0xC4C8, - 0x5A1F, 0xBEEA, - 0x5A20, 0xC9EF, - 0x5A23, 0xE6B7, - 0x5A25, 0xB6F0, - 0x5A29, 0xC3E4, - 0x5A31, 0xD3E9, - 0x5A32, 0xE6B4, - 0x5A34, 0xE6B5, - 0x5A36, 0xC8A2, - 0x5A3C, 0xE6BD, - 0x5A40, 0xE6B9, - 0x5A46, 0xC6C5, - 0x5A49, 0xCDF1, - 0x5A4A, 0xE6BB, - 0x5A55, 0xE6BC, - 0x5A5A, 0xBBE9, - 0x5A62, 0xE6BE, - 0x5A67, 0xE6BA, - 0x5A6A, 0xC0B7, - 0x5A74, 0xD3A4, - 0x5A75, 0xE6BF, - 0x5A76, 0xC9F4, - 0x5A77, 0xE6C3, - 0x5A7A, 0xE6C4, - 0x5A7F, 0xD0F6, - 0x5A92, 0xC3BD, - 0x5A9A, 0xC3C4, - 0x5A9B, 0xE6C2, - 0x5AAA, 0xE6C1, - 0x5AB2, 0xE6C7, - 0x5AB3, 0xCFB1, - 0x5AB5, 0xEBF4, - 0x5AB8, 0xE6CA, - 0x5ABE, 0xE6C5, - 0x5AC1, 0xBCDE, - 0x5AC2, 0xC9A9, - 0x5AC9, 0xBCB5, - 0x5ACC, 0xCFD3, - 0x5AD2, 0xE6C8, - 0x5AD4, 0xE6C9, - 0x5AD6, 0xE6CE, - 0x5AD8, 0xE6D0, - 0x5ADC, 0xE6D1, - 0x5AE0, 0xE6CB, - 0x5AE1, 0xB5D5, - 0x5AE3, 0xE6CC, - 0x5AE6, 0xE6CF, - 0x5AE9, 0xC4DB, - 0x5AEB, 0xE6C6, - 0x5AF1, 0xE6CD, - 0x5B09, 0xE6D2, - 0x5B16, 0xE6D4, - 0x5B17, 0xE6D3, - 0x5B32, 0xE6D5, - 0x5B34, 0xD9F8, - 0x5B37, 0xE6D6, - 0x5B40, 0xE6D7, - 0x5B50, 0xD7D3, - 0x5B51, 0xE6DD, - 0x5B53, 0xE6DE, - 0x5B54, 0xBFD7, - 0x5B55, 0xD4D0, - 0x5B57, 0xD7D6, - 0x5B58, 0xB4E6, - 0x5B59, 0xCBEF, - 0x5B5A, 0xE6DA, - 0x5B5B, 0xD8C3, - 0x5B5C, 0xD7CE, - 0x5B5D, 0xD0A2, - 0x5B5F, 0xC3CF, - 0x5B62, 0xE6DF, - 0x5B63, 0xBCBE, - 0x5B64, 0xB9C2, - 0x5B65, 0xE6DB, - 0x5B66, 0xD1A7, - 0x5B69, 0xBAA2, - 0x5B6A, 0xC2CF, - 0x5B6C, 0xD8AB, - 0x5B70, 0xCAEB, - 0x5B71, 0xE5EE, - 0x5B73, 0xE6DC, - 0x5B75, 0xB7F5, - 0x5B7A, 0xC8E6, - 0x5B7D, 0xC4F5, - 0x5B80, 0xE5B2, - 0x5B81, 0xC4FE, - 0x5B83, 0xCBFC, - 0x5B84, 0xE5B3, - 0x5B85, 0xD5AC, - 0x5B87, 0xD3EE, - 0x5B88, 0xCAD8, - 0x5B89, 0xB0B2, - 0x5B8B, 0xCBCE, - 0x5B8C, 0xCDEA, - 0x5B8F, 0xBAEA, - 0x5B93, 0xE5B5, - 0x5B95, 0xE5B4, - 0x5B97, 0xD7DA, - 0x5B98, 0xB9D9, - 0x5B99, 0xD6E6, - 0x5B9A, 0xB6A8, - 0x5B9B, 0xCDF0, - 0x5B9C, 0xD2CB, - 0x5B9D, 0xB1A6, - 0x5B9E, 0xCAB5, - 0x5BA0, 0xB3E8, - 0x5BA1, 0xC9F3, - 0x5BA2, 0xBFCD, - 0x5BA3, 0xD0FB, - 0x5BA4, 0xCAD2, - 0x5BA5, 0xE5B6, - 0x5BA6, 0xBBC2, - 0x5BAA, 0xCFDC, - 0x5BAB, 0xB9AC, - 0x5BB0, 0xD4D7, - 0x5BB3, 0xBAA6, - 0x5BB4, 0xD1E7, - 0x5BB5, 0xCFFC, - 0x5BB6, 0xBCD2, - 0x5BB8, 0xE5B7, - 0x5BB9, 0xC8DD, - 0x5BBD, 0xBFED, - 0x5BBE, 0xB1F6, - 0x5BBF, 0xCBDE, - 0x5BC2, 0xBCC5, - 0x5BC4, 0xBCC4, - 0x5BC5, 0xD2FA, - 0x5BC6, 0xC3DC, - 0x5BC7, 0xBFDC, - 0x5BCC, 0xB8BB, - 0x5BD0, 0xC3C2, - 0x5BD2, 0xBAAE, - 0x5BD3, 0xD4A2, - 0x5BDD, 0xC7DE, - 0x5BDE, 0xC4AF, - 0x5BDF, 0xB2EC, - 0x5BE1, 0xB9D1, - 0x5BE4, 0xE5BB, - 0x5BE5, 0xC1C8, - 0x5BE8, 0xD5AF, - 0x5BEE, 0xE5BC, - 0x5BF0, 0xE5BE, - 0x5BF8, 0xB4E7, - 0x5BF9, 0xB6D4, - 0x5BFA, 0xCBC2, - 0x5BFB, 0xD1B0, - 0x5BFC, 0xB5BC, - 0x5BFF, 0xCAD9, - 0x5C01, 0xB7E2, - 0x5C04, 0xC9E4, - 0x5C06, 0xBDAB, - 0x5C09, 0xCEBE, - 0x5C0A, 0xD7F0, - 0x5C0F, 0xD0A1, - 0x5C11, 0xC9D9, - 0x5C14, 0xB6FB, - 0x5C15, 0xE6D8, - 0x5C16, 0xBCE2, - 0x5C18, 0xB3BE, - 0x5C1A, 0xC9D0, - 0x5C1C, 0xE6D9, - 0x5C1D, 0xB3A2, - 0x5C22, 0xDECC, - 0x5C24, 0xD3C8, - 0x5C25, 0xDECD, - 0x5C27, 0xD2A2, - 0x5C2C, 0xDECE, - 0x5C31, 0xBECD, - 0x5C34, 0xDECF, - 0x5C38, 0xCAAC, - 0x5C39, 0xD2FC, - 0x5C3A, 0xB3DF, - 0x5C3B, 0xE5EA, - 0x5C3C, 0xC4E1, - 0x5C3D, 0xBEA1, - 0x5C3E, 0xCEB2, - 0x5C3F, 0xC4F2, - 0x5C40, 0xBED6, - 0x5C41, 0xC6A8, - 0x5C42, 0xB2E3, - 0x5C45, 0xBED3, - 0x5C48, 0xC7FC, - 0x5C49, 0xCCEB, - 0x5C4A, 0xBDEC, - 0x5C4B, 0xCEDD, - 0x5C4E, 0xCABA, - 0x5C4F, 0xC6C1, - 0x5C50, 0xE5EC, - 0x5C51, 0xD0BC, - 0x5C55, 0xD5B9, - 0x5C59, 0xE5ED, - 0x5C5E, 0xCAF4, - 0x5C60, 0xCDC0, - 0x5C61, 0xC2C5, - 0x5C63, 0xE5EF, - 0x5C65, 0xC2C4, - 0x5C66, 0xE5F0, - 0x5C6E, 0xE5F8, - 0x5C6F, 0xCDCD, - 0x5C71, 0xC9BD, - 0x5C79, 0xD2D9, - 0x5C7A, 0xE1A8, - 0x5C7F, 0xD3EC, - 0x5C81, 0xCBEA, - 0x5C82, 0xC6F1, - 0x5C88, 0xE1AC, - 0x5C8C, 0xE1A7, - 0x5C8D, 0xE1A9, - 0x5C90, 0xE1AA, - 0x5C91, 0xE1AF, - 0x5C94, 0xB2ED, - 0x5C96, 0xE1AB, - 0x5C97, 0xB8DA, - 0x5C98, 0xE1AD, - 0x5C99, 0xE1AE, - 0x5C9A, 0xE1B0, - 0x5C9B, 0xB5BA, - 0x5C9C, 0xE1B1, - 0x5CA2, 0xE1B3, - 0x5CA3, 0xE1B8, - 0x5CA9, 0xD1D2, - 0x5CAB, 0xE1B6, - 0x5CAC, 0xE1B5, - 0x5CAD, 0xC1EB, - 0x5CB1, 0xE1B7, - 0x5CB3, 0xD4C0, - 0x5CB5, 0xE1B2, - 0x5CB7, 0xE1BA, - 0x5CB8, 0xB0B6, - 0x5CBD, 0xE1B4, - 0x5CBF, 0xBFF9, - 0x5CC1, 0xE1B9, - 0x5CC4, 0xE1BB, - 0x5CCB, 0xE1BE, - 0x5CD2, 0xE1BC, - 0x5CD9, 0xD6C5, - 0x5CE1, 0xCFBF, - 0x5CE4, 0xE1BD, - 0x5CE5, 0xE1BF, - 0x5CE6, 0xC2CD, - 0x5CE8, 0xB6EB, - 0x5CEA, 0xD3F8, - 0x5CED, 0xC7CD, - 0x5CF0, 0xB7E5, - 0x5CFB, 0xBEFE, - 0x5D02, 0xE1C0, - 0x5D03, 0xE1C1, - 0x5D06, 0xE1C7, - 0x5D07, 0xB3E7, - 0x5D0E, 0xC6E9, - 0x5D14, 0xB4DE, - 0x5D16, 0xD1C2, - 0x5D1B, 0xE1C8, - 0x5D1E, 0xE1C6, - 0x5D24, 0xE1C5, - 0x5D26, 0xE1C3, - 0x5D27, 0xE1C2, - 0x5D29, 0xB1C0, - 0x5D2D, 0xD5B8, - 0x5D2E, 0xE1C4, - 0x5D34, 0xE1CB, - 0x5D3D, 0xE1CC, - 0x5D3E, 0xE1CA, - 0x5D47, 0xEFFA, - 0x5D4A, 0xE1D3, - 0x5D4B, 0xE1D2, - 0x5D4C, 0xC7B6, - 0x5D58, 0xE1C9, - 0x5D5B, 0xE1CE, - 0x5D5D, 0xE1D0, - 0x5D69, 0xE1D4, - 0x5D6B, 0xE1D1, - 0x5D6C, 0xE1CD, - 0x5D6F, 0xE1CF, - 0x5D74, 0xE1D5, - 0x5D82, 0xE1D6, - 0x5D99, 0xE1D7, - 0x5D9D, 0xE1D8, - 0x5DB7, 0xE1DA, - 0x5DC5, 0xE1DB, - 0x5DCD, 0xCEA1, - 0x5DDB, 0xE7DD, - 0x5DDD, 0xB4A8, - 0x5DDE, 0xD6DD, - 0x5DE1, 0xD1B2, - 0x5DE2, 0xB3B2, - 0x5DE5, 0xB9A4, - 0x5DE6, 0xD7F3, - 0x5DE7, 0xC7C9, - 0x5DE8, 0xBEDE, - 0x5DE9, 0xB9AE, - 0x5DEB, 0xCED7, - 0x5DEE, 0xB2EE, - 0x5DEF, 0xDBCF, - 0x5DF1, 0xBCBA, - 0x5DF2, 0xD2D1, - 0x5DF3, 0xCBC8, - 0x5DF4, 0xB0CD, - 0x5DF7, 0xCFEF, - 0x5DFD, 0xD9E3, - 0x5DFE, 0xBDED, - 0x5E01, 0xB1D2, - 0x5E02, 0xCAD0, - 0x5E03, 0xB2BC, - 0x5E05, 0xCBA7, - 0x5E06, 0xB7AB, - 0x5E08, 0xCAA6, - 0x5E0C, 0xCFA3, - 0x5E0F, 0xE0F8, - 0x5E10, 0xD5CA, - 0x5E11, 0xE0FB, - 0x5E14, 0xE0FA, - 0x5E15, 0xC5C1, - 0x5E16, 0xCCFB, - 0x5E18, 0xC1B1, - 0x5E19, 0xE0F9, - 0x5E1A, 0xD6E3, - 0x5E1B, 0xB2AF, - 0x5E1C, 0xD6C4, - 0x5E1D, 0xB5DB, - 0x5E26, 0xB4F8, - 0x5E27, 0xD6A1, - 0x5E2D, 0xCFAF, - 0x5E2E, 0xB0EF, - 0x5E31, 0xE0FC, - 0x5E37, 0xE1A1, - 0x5E38, 0xB3A3, - 0x5E3B, 0xE0FD, - 0x5E3C, 0xE0FE, - 0x5E3D, 0xC3B1, - 0x5E42, 0xC3DD, - 0x5E44, 0xE1A2, - 0x5E45, 0xB7F9, - 0x5E4C, 0xBBCF, - 0x5E54, 0xE1A3, - 0x5E55, 0xC4BB, - 0x5E5B, 0xE1A4, - 0x5E5E, 0xE1A5, - 0x5E61, 0xE1A6, - 0x5E62, 0xB4B1, - 0x5E72, 0xB8C9, - 0x5E73, 0xC6BD, - 0x5E74, 0xC4EA, - 0x5E76, 0xB2A2, - 0x5E78, 0xD0D2, - 0x5E7A, 0xE7DB, - 0x5E7B, 0xBBC3, - 0x5E7C, 0xD3D7, - 0x5E7D, 0xD3C4, - 0x5E7F, 0xB9E3, - 0x5E80, 0xE2CF, - 0x5E84, 0xD7AF, - 0x5E86, 0xC7EC, - 0x5E87, 0xB1D3, - 0x5E8A, 0xB4B2, - 0x5E8B, 0xE2D1, - 0x5E8F, 0xD0F2, - 0x5E90, 0xC2AE, - 0x5E91, 0xE2D0, - 0x5E93, 0xBFE2, - 0x5E94, 0xD3A6, - 0x5E95, 0xB5D7, - 0x5E96, 0xE2D2, - 0x5E97, 0xB5EA, - 0x5E99, 0xC3ED, - 0x5E9A, 0xB8FD, - 0x5E9C, 0xB8AE, - 0x5E9E, 0xC5D3, - 0x5E9F, 0xB7CF, - 0x5EA0, 0xE2D4, - 0x5EA5, 0xE2D3, - 0x5EA6, 0xB6C8, - 0x5EA7, 0xD7F9, - 0x5EAD, 0xCDA5, - 0x5EB3, 0xE2D8, - 0x5EB5, 0xE2D6, - 0x5EB6, 0xCAFC, - 0x5EB7, 0xBFB5, - 0x5EB8, 0xD3B9, - 0x5EB9, 0xE2D5, - 0x5EBE, 0xE2D7, - 0x5EC9, 0xC1AE, - 0x5ECA, 0xC0C8, - 0x5ED1, 0xE2DB, - 0x5ED2, 0xE2DA, - 0x5ED3, 0xC0AA, - 0x5ED6, 0xC1CE, - 0x5EDB, 0xE2DC, - 0x5EE8, 0xE2DD, - 0x5EEA, 0xE2DE, - 0x5EF4, 0xDBC8, - 0x5EF6, 0xD1D3, - 0x5EF7, 0xCDA2, - 0x5EFA, 0xBDA8, - 0x5EFE, 0xDEC3, - 0x5EFF, 0xD8A5, - 0x5F00, 0xBFAA, - 0x5F01, 0xDBCD, - 0x5F02, 0xD2EC, - 0x5F03, 0xC6FA, - 0x5F04, 0xC5AA, - 0x5F08, 0xDEC4, - 0x5F0A, 0xB1D7, - 0x5F0B, 0xDFAE, - 0x5F0F, 0xCABD, - 0x5F11, 0xDFB1, - 0x5F13, 0xB9AD, - 0x5F15, 0xD2FD, - 0x5F17, 0xB8A5, - 0x5F18, 0xBAEB, - 0x5F1B, 0xB3DA, - 0x5F1F, 0xB5DC, - 0x5F20, 0xD5C5, - 0x5F25, 0xC3D6, - 0x5F26, 0xCFD2, - 0x5F27, 0xBBA1, - 0x5F29, 0xE5F3, - 0x5F2A, 0xE5F2, - 0x5F2D, 0xE5F4, - 0x5F2F, 0xCDE4, - 0x5F31, 0xC8F5, - 0x5F39, 0xB5AF, - 0x5F3A, 0xC7BF, - 0x5F3C, 0xE5F6, - 0x5F40, 0xECB0, - 0x5F50, 0xE5E6, - 0x5F52, 0xB9E9, - 0x5F53, 0xB5B1, - 0x5F55, 0xC2BC, - 0x5F56, 0xE5E8, - 0x5F57, 0xE5E7, - 0x5F58, 0xE5E9, - 0x5F5D, 0xD2CD, - 0x5F61, 0xE1EA, - 0x5F62, 0xD0CE, - 0x5F64, 0xCDAE, - 0x5F66, 0xD1E5, - 0x5F69, 0xB2CA, - 0x5F6A, 0xB1EB, - 0x5F6C, 0xB1F2, - 0x5F6D, 0xC5ED, - 0x5F70, 0xD5C3, - 0x5F71, 0xD3B0, - 0x5F73, 0xE1DC, - 0x5F77, 0xE1DD, - 0x5F79, 0xD2DB, - 0x5F7B, 0xB3B9, - 0x5F7C, 0xB1CB, - 0x5F80, 0xCDF9, - 0x5F81, 0xD5F7, - 0x5F82, 0xE1DE, - 0x5F84, 0xBEB6, - 0x5F85, 0xB4FD, - 0x5F87, 0xE1DF, - 0x5F88, 0xBADC, - 0x5F89, 0xE1E0, - 0x5F8A, 0xBBB2, - 0x5F8B, 0xC2C9, - 0x5F8C, 0xE1E1, - 0x5F90, 0xD0EC, - 0x5F92, 0xCDBD, - 0x5F95, 0xE1E2, - 0x5F97, 0xB5C3, - 0x5F98, 0xC5C7, - 0x5F99, 0xE1E3, - 0x5F9C, 0xE1E4, - 0x5FA1, 0xD3F9, - 0x5FA8, 0xE1E5, - 0x5FAA, 0xD1AD, - 0x5FAD, 0xE1E6, - 0x5FAE, 0xCEA2, - 0x5FB5, 0xE1E7, - 0x5FB7, 0xB5C2, - 0x5FBC, 0xE1E8, - 0x5FBD, 0xBBD5, - 0x5FC3, 0xD0C4, - 0x5FC4, 0xE2E0, - 0x5FC5, 0xB1D8, - 0x5FC6, 0xD2E4, - 0x5FC9, 0xE2E1, - 0x5FCC, 0xBCC9, - 0x5FCD, 0xC8CC, - 0x5FCF, 0xE2E3, - 0x5FD0, 0xECFE, - 0x5FD1, 0xECFD, - 0x5FD2, 0xDFAF, - 0x5FD6, 0xE2E2, - 0x5FD7, 0xD6BE, - 0x5FD8, 0xCDFC, - 0x5FD9, 0xC3A6, - 0x5FDD, 0xE3C3, - 0x5FE0, 0xD6D2, - 0x5FE1, 0xE2E7, - 0x5FE4, 0xE2E8, - 0x5FE7, 0xD3C7, - 0x5FEA, 0xE2EC, - 0x5FEB, 0xBFEC, - 0x5FED, 0xE2ED, - 0x5FEE, 0xE2E5, - 0x5FF1, 0xB3C0, - 0x5FF5, 0xC4EE, - 0x5FF8, 0xE2EE, - 0x5FFB, 0xD0C3, - 0x5FFD, 0xBAF6, - 0x5FFE, 0xE2E9, - 0x5FFF, 0xB7DE, - 0x6000, 0xBBB3, - 0x6001, 0xCCAC, - 0x6002, 0xCBCB, - 0x6003, 0xE2E4, - 0x6004, 0xE2E6, - 0x6005, 0xE2EA, - 0x6006, 0xE2EB, - 0x600A, 0xE2F7, - 0x600D, 0xE2F4, - 0x600E, 0xD4F5, - 0x600F, 0xE2F3, - 0x6012, 0xC5AD, - 0x6014, 0xD5FA, - 0x6015, 0xC5C2, - 0x6016, 0xB2C0, - 0x6019, 0xE2EF, - 0x601B, 0xE2F2, - 0x601C, 0xC1AF, - 0x601D, 0xCBBC, - 0x6020, 0xB5A1, - 0x6021, 0xE2F9, - 0x6025, 0xBCB1, - 0x6026, 0xE2F1, - 0x6027, 0xD0D4, - 0x6028, 0xD4B9, - 0x6029, 0xE2F5, - 0x602A, 0xB9D6, - 0x602B, 0xE2F6, - 0x602F, 0xC7D3, - 0x6035, 0xE2F0, - 0x603B, 0xD7DC, - 0x603C, 0xEDA1, - 0x603F, 0xE2F8, - 0x6041, 0xEDA5, - 0x6042, 0xE2FE, - 0x6043, 0xCAD1, - 0x604B, 0xC1B5, - 0x604D, 0xBBD0, - 0x6050, 0xBFD6, - 0x6052, 0xBAE3, - 0x6055, 0xCBA1, - 0x6059, 0xEDA6, - 0x605A, 0xEDA3, - 0x605D, 0xEDA2, - 0x6062, 0xBBD6, - 0x6063, 0xEDA7, - 0x6064, 0xD0F4, - 0x6067, 0xEDA4, - 0x6068, 0xBADE, - 0x6069, 0xB6F7, - 0x606A, 0xE3A1, - 0x606B, 0xB6B2, - 0x606C, 0xCCF1, - 0x606D, 0xB9A7, - 0x606F, 0xCFA2, - 0x6070, 0xC7A1, - 0x6073, 0xBFD2, - 0x6076, 0xB6F1, - 0x6078, 0xE2FA, - 0x6079, 0xE2FB, - 0x607A, 0xE2FD, - 0x607B, 0xE2FC, - 0x607C, 0xC4D5, - 0x607D, 0xE3A2, - 0x607F, 0xD3C1, - 0x6083, 0xE3A7, - 0x6084, 0xC7C4, - 0x6089, 0xCFA4, - 0x608C, 0xE3A9, - 0x608D, 0xBAB7, - 0x6092, 0xE3A8, - 0x6094, 0xBBDA, - 0x6096, 0xE3A3, - 0x609A, 0xE3A4, - 0x609B, 0xE3AA, - 0x609D, 0xE3A6, - 0x609F, 0xCEF2, - 0x60A0, 0xD3C6, - 0x60A3, 0xBBBC, - 0x60A6, 0xD4C3, - 0x60A8, 0xC4FA, - 0x60AB, 0xEDA8, - 0x60AC, 0xD0FC, - 0x60AD, 0xE3A5, - 0x60AF, 0xC3F5, - 0x60B1, 0xE3AD, - 0x60B2, 0xB1AF, - 0x60B4, 0xE3B2, - 0x60B8, 0xBCC2, - 0x60BB, 0xE3AC, - 0x60BC, 0xB5BF, - 0x60C5, 0xC7E9, - 0x60C6, 0xE3B0, - 0x60CA, 0xBEAA, - 0x60CB, 0xCDEF, - 0x60D1, 0xBBF3, - 0x60D5, 0xCCE8, - 0x60D8, 0xE3AF, - 0x60DA, 0xE3B1, - 0x60DC, 0xCFA7, - 0x60DD, 0xE3AE, - 0x60DF, 0xCEA9, - 0x60E0, 0xBBDD, - 0x60E6, 0xB5EB, - 0x60E7, 0xBEE5, - 0x60E8, 0xB2D2, - 0x60E9, 0xB3CD, - 0x60EB, 0xB1B9, - 0x60EC, 0xE3AB, - 0x60ED, 0xB2D1, - 0x60EE, 0xB5AC, - 0x60EF, 0xB9DF, - 0x60F0, 0xB6E8, - 0x60F3, 0xCFEB, - 0x60F4, 0xE3B7, - 0x60F6, 0xBBCC, - 0x60F9, 0xC8C7, - 0x60FA, 0xD0CA, - 0x6100, 0xE3B8, - 0x6101, 0xB3EE, - 0x6106, 0xEDA9, - 0x6108, 0xD3FA, - 0x6109, 0xD3E4, - 0x610D, 0xEDAA, - 0x610E, 0xE3B9, - 0x610F, 0xD2E2, - 0x6115, 0xE3B5, - 0x611A, 0xD3DE, - 0x611F, 0xB8D0, - 0x6120, 0xE3B3, - 0x6123, 0xE3B6, - 0x6124, 0xB7DF, - 0x6126, 0xE3B4, - 0x6127, 0xC0A2, - 0x612B, 0xE3BA, - 0x613F, 0xD4B8, - 0x6148, 0xB4C8, - 0x614A, 0xE3BB, - 0x614C, 0xBBC5, - 0x614E, 0xC9F7, - 0x6151, 0xC9E5, - 0x6155, 0xC4BD, - 0x615D, 0xEDAB, - 0x6162, 0xC2FD, - 0x6167, 0xBBDB, - 0x6168, 0xBFAE, - 0x6170, 0xCEBF, - 0x6175, 0xE3BC, - 0x6177, 0xBFB6, - 0x618B, 0xB1EF, - 0x618E, 0xD4F7, - 0x6194, 0xE3BE, - 0x619D, 0xEDAD, - 0x61A7, 0xE3BF, - 0x61A8, 0xBAA9, - 0x61A9, 0xEDAC, - 0x61AC, 0xE3BD, - 0x61B7, 0xE3C0, - 0x61BE, 0xBAB6, - 0x61C2, 0xB6AE, - 0x61C8, 0xD0B8, - 0x61CA, 0xB0C3, - 0x61CB, 0xEDAE, - 0x61D1, 0xEDAF, - 0x61D2, 0xC0C1, - 0x61D4, 0xE3C1, - 0x61E6, 0xC5B3, - 0x61F5, 0xE3C2, - 0x61FF, 0xDCB2, - 0x6206, 0xEDB0, - 0x6208, 0xB8EA, - 0x620A, 0xCEEC, - 0x620B, 0xEAA7, - 0x620C, 0xD0E7, - 0x620D, 0xCAF9, - 0x620E, 0xC8D6, - 0x620F, 0xCFB7, - 0x6210, 0xB3C9, - 0x6211, 0xCED2, - 0x6212, 0xBDE4, - 0x6215, 0xE3DE, - 0x6216, 0xBBF2, - 0x6217, 0xEAA8, - 0x6218, 0xD5BD, - 0x621A, 0xC6DD, - 0x621B, 0xEAA9, - 0x621F, 0xEAAA, - 0x6221, 0xEAAC, - 0x6222, 0xEAAB, - 0x6224, 0xEAAE, - 0x6225, 0xEAAD, - 0x622A, 0xBDD8, - 0x622C, 0xEAAF, - 0x622E, 0xC2BE, - 0x6233, 0xB4C1, - 0x6234, 0xB4F7, - 0x6237, 0xBBA7, - 0x623D, 0xECE6, - 0x623E, 0xECE5, - 0x623F, 0xB7BF, - 0x6240, 0xCBF9, - 0x6241, 0xB1E2, - 0x6243, 0xECE7, - 0x6247, 0xC9C8, - 0x6248, 0xECE8, - 0x6249, 0xECE9, - 0x624B, 0xCAD6, - 0x624C, 0xDED0, - 0x624D, 0xB2C5, - 0x624E, 0xD4FA, - 0x6251, 0xC6CB, - 0x6252, 0xB0C7, - 0x6253, 0xB4F2, - 0x6254, 0xC8D3, - 0x6258, 0xCDD0, - 0x625B, 0xBFB8, - 0x6263, 0xBFDB, - 0x6266, 0xC7A4, - 0x6267, 0xD6B4, - 0x6269, 0xC0A9, - 0x626A, 0xDED1, - 0x626B, 0xC9A8, - 0x626C, 0xD1EF, - 0x626D, 0xC5A4, - 0x626E, 0xB0E7, - 0x626F, 0xB3B6, - 0x6270, 0xC8C5, - 0x6273, 0xB0E2, - 0x6276, 0xB7F6, - 0x6279, 0xC5FA, - 0x627C, 0xB6F3, - 0x627E, 0xD5D2, - 0x627F, 0xB3D0, - 0x6280, 0xBCBC, - 0x6284, 0xB3AD, - 0x6289, 0xBEF1, - 0x628A, 0xB0D1, - 0x6291, 0xD2D6, - 0x6292, 0xCAE3, - 0x6293, 0xD7A5, - 0x6295, 0xCDB6, - 0x6296, 0xB6B6, - 0x6297, 0xBFB9, - 0x6298, 0xD5DB, - 0x629A, 0xB8A7, - 0x629B, 0xC5D7, - 0x629F, 0xDED2, - 0x62A0, 0xBFD9, - 0x62A1, 0xC2D5, - 0x62A2, 0xC7C0, - 0x62A4, 0xBBA4, - 0x62A5, 0xB1A8, - 0x62A8, 0xC5EA, - 0x62AB, 0xC5FB, - 0x62AC, 0xCCA7, - 0x62B1, 0xB1A7, - 0x62B5, 0xB5D6, - 0x62B9, 0xC4A8, - 0x62BB, 0xDED3, - 0x62BC, 0xD1BA, - 0x62BD, 0xB3E9, - 0x62BF, 0xC3F2, - 0x62C2, 0xB7F7, - 0x62C4, 0xD6F4, - 0x62C5, 0xB5A3, - 0x62C6, 0xB2F0, - 0x62C7, 0xC4B4, - 0x62C8, 0xC4E9, - 0x62C9, 0xC0AD, - 0x62CA, 0xDED4, - 0x62CC, 0xB0E8, - 0x62CD, 0xC5C4, - 0x62CE, 0xC1E0, - 0x62D0, 0xB9D5, - 0x62D2, 0xBEDC, - 0x62D3, 0xCDD8, - 0x62D4, 0xB0CE, - 0x62D6, 0xCDCF, - 0x62D7, 0xDED6, - 0x62D8, 0xBED0, - 0x62D9, 0xD7BE, - 0x62DA, 0xDED5, - 0x62DB, 0xD5D0, - 0x62DC, 0xB0DD, - 0x62DF, 0xC4E2, - 0x62E2, 0xC2A3, - 0x62E3, 0xBCF0, - 0x62E5, 0xD3B5, - 0x62E6, 0xC0B9, - 0x62E7, 0xC5A1, - 0x62E8, 0xB2A6, - 0x62E9, 0xD4F1, - 0x62EC, 0xC0A8, - 0x62ED, 0xCAC3, - 0x62EE, 0xDED7, - 0x62EF, 0xD5FC, - 0x62F1, 0xB9B0, - 0x62F3, 0xC8AD, - 0x62F4, 0xCBA9, - 0x62F6, 0xDED9, - 0x62F7, 0xBFBD, - 0x62FC, 0xC6B4, - 0x62FD, 0xD7A7, - 0x62FE, 0xCAB0, - 0x62FF, 0xC4C3, - 0x6301, 0xB3D6, - 0x6302, 0xB9D2, - 0x6307, 0xD6B8, - 0x6308, 0xEAFC, - 0x6309, 0xB0B4, - 0x630E, 0xBFE6, - 0x6311, 0xCCF4, - 0x6316, 0xCDDA, - 0x631A, 0xD6BF, - 0x631B, 0xC2CE, - 0x631D, 0xCECE, - 0x631E, 0xCCA2, - 0x631F, 0xD0AE, - 0x6320, 0xC4D3, - 0x6321, 0xB5B2, - 0x6322, 0xDED8, - 0x6323, 0xD5F5, - 0x6324, 0xBCB7, - 0x6325, 0xBBD3, - 0x6328, 0xB0A4, - 0x632A, 0xC5B2, - 0x632B, 0xB4EC, - 0x632F, 0xD5F1, - 0x6332, 0xEAFD, - 0x6339, 0xDEDA, - 0x633A, 0xCDA6, - 0x633D, 0xCDEC, - 0x6342, 0xCEE6, - 0x6343, 0xDEDC, - 0x6345, 0xCDB1, - 0x6346, 0xC0A6, - 0x6349, 0xD7BD, - 0x634B, 0xDEDB, - 0x634C, 0xB0C6, - 0x634D, 0xBAB4, - 0x634E, 0xC9D3, - 0x634F, 0xC4F3, - 0x6350, 0xBEE8, - 0x6355, 0xB2B6, - 0x635E, 0xC0CC, - 0x635F, 0xCBF0, - 0x6361, 0xBCF1, - 0x6362, 0xBBBB, - 0x6363, 0xB5B7, - 0x6367, 0xC5F5, - 0x6369, 0xDEE6, - 0x636D, 0xDEE3, - 0x636E, 0xBEDD, - 0x6371, 0xDEDF, - 0x6376, 0xB4B7, - 0x6377, 0xBDDD, - 0x637A, 0xDEE0, - 0x637B, 0xC4ED, - 0x6380, 0xCFC6, - 0x6382, 0xB5E0, - 0x6387, 0xB6DE, - 0x6388, 0xCADA, - 0x6389, 0xB5F4, - 0x638A, 0xDEE5, - 0x638C, 0xD5C6, - 0x638E, 0xDEE1, - 0x638F, 0xCCCD, - 0x6390, 0xC6FE, - 0x6392, 0xC5C5, - 0x6396, 0xD2B4, - 0x6398, 0xBEF2, - 0x63A0, 0xC2D3, - 0x63A2, 0xCCBD, - 0x63A3, 0xB3B8, - 0x63A5, 0xBDD3, - 0x63A7, 0xBFD8, - 0x63A8, 0xCDC6, - 0x63A9, 0xD1DA, - 0x63AA, 0xB4EB, - 0x63AC, 0xDEE4, - 0x63AD, 0xDEDD, - 0x63AE, 0xDEE7, - 0x63B0, 0xEAFE, - 0x63B3, 0xC2B0, - 0x63B4, 0xDEE2, - 0x63B7, 0xD6C0, - 0x63B8, 0xB5A7, - 0x63BA, 0xB2F4, - 0x63BC, 0xDEE8, - 0x63BE, 0xDEF2, - 0x63C4, 0xDEED, - 0x63C6, 0xDEF1, - 0x63C9, 0xC8E0, - 0x63CD, 0xD7E1, - 0x63CE, 0xDEEF, - 0x63CF, 0xC3E8, - 0x63D0, 0xCCE1, - 0x63D2, 0xB2E5, - 0x63D6, 0xD2BE, - 0x63DE, 0xDEEE, - 0x63E0, 0xDEEB, - 0x63E1, 0xCED5, - 0x63E3, 0xB4A7, - 0x63E9, 0xBFAB, - 0x63EA, 0xBEBE, - 0x63ED, 0xBDD2, - 0x63F2, 0xDEE9, - 0x63F4, 0xD4AE, - 0x63F6, 0xDEDE, - 0x63F8, 0xDEEA, - 0x63FD, 0xC0BF, - 0x63FF, 0xDEEC, - 0x6400, 0xB2F3, - 0x6401, 0xB8E9, - 0x6402, 0xC2A7, - 0x6405, 0xBDC1, - 0x640B, 0xDEF5, - 0x640C, 0xDEF8, - 0x640F, 0xB2AB, - 0x6410, 0xB4A4, - 0x6413, 0xB4EA, - 0x6414, 0xC9A6, - 0x641B, 0xDEF6, - 0x641C, 0xCBD1, - 0x641E, 0xB8E3, - 0x6420, 0xDEF7, - 0x6421, 0xDEFA, - 0x6426, 0xDEF9, - 0x642A, 0xCCC2, - 0x642C, 0xB0E1, - 0x642D, 0xB4EE, - 0x6434, 0xE5BA, - 0x643A, 0xD0AF, - 0x643D, 0xB2EB, - 0x643F, 0xEBA1, - 0x6441, 0xDEF4, - 0x6444, 0xC9E3, - 0x6445, 0xDEF3, - 0x6446, 0xB0DA, - 0x6447, 0xD2A1, - 0x6448, 0xB1F7, - 0x644A, 0xCCAF, - 0x6452, 0xDEF0, - 0x6454, 0xCBA4, - 0x6458, 0xD5AA, - 0x645E, 0xDEFB, - 0x6467, 0xB4DD, - 0x6469, 0xC4A6, - 0x646D, 0xDEFD, - 0x6478, 0xC3FE, - 0x6479, 0xC4A1, - 0x647A, 0xDFA1, - 0x6482, 0xC1CC, - 0x6484, 0xDEFC, - 0x6485, 0xBEEF, - 0x6487, 0xC6B2, - 0x6491, 0xB3C5, - 0x6492, 0xC8F6, - 0x6495, 0xCBBA, - 0x6496, 0xDEFE, - 0x6499, 0xDFA4, - 0x649E, 0xD7B2, - 0x64A4, 0xB3B7, - 0x64A9, 0xC1C3, - 0x64AC, 0xC7CB, - 0x64AD, 0xB2A5, - 0x64AE, 0xB4E9, - 0x64B0, 0xD7AB, - 0x64B5, 0xC4EC, - 0x64B7, 0xDFA2, - 0x64B8, 0xDFA3, - 0x64BA, 0xDFA5, - 0x64BC, 0xBAB3, - 0x64C0, 0xDFA6, - 0x64C2, 0xC0DE, - 0x64C5, 0xC9C3, - 0x64CD, 0xB2D9, - 0x64CE, 0xC7E6, - 0x64D0, 0xDFA7, - 0x64D2, 0xC7DC, - 0x64D7, 0xDFA8, - 0x64D8, 0xEBA2, - 0x64DE, 0xCBD3, - 0x64E2, 0xDFAA, - 0x64E4, 0xDFA9, - 0x64E6, 0xB2C1, - 0x6500, 0xC5CA, - 0x6509, 0xDFAB, - 0x6512, 0xD4DC, - 0x6518, 0xC8C1, - 0x6525, 0xDFAC, - 0x652B, 0xBEF0, - 0x652E, 0xDFAD, - 0x652F, 0xD6A7, - 0x6534, 0xEAB7, - 0x6535, 0xEBB6, - 0x6536, 0xCAD5, - 0x6538, 0xD8FC, - 0x6539, 0xB8C4, - 0x653B, 0xB9A5, - 0x653E, 0xB7C5, - 0x653F, 0xD5FE, - 0x6545, 0xB9CA, - 0x6548, 0xD0A7, - 0x6549, 0xF4CD, - 0x654C, 0xB5D0, - 0x654F, 0xC3F4, - 0x6551, 0xBEC8, - 0x6555, 0xEBB7, - 0x6556, 0xB0BD, - 0x6559, 0xBDCC, - 0x655B, 0xC1B2, - 0x655D, 0xB1D6, - 0x655E, 0xB3A8, - 0x6562, 0xB8D2, - 0x6563, 0xC9A2, - 0x6566, 0xB6D8, - 0x656B, 0xEBB8, - 0x656C, 0xBEB4, - 0x6570, 0xCAFD, - 0x6572, 0xC7C3, - 0x6574, 0xD5FB, - 0x6577, 0xB7F3, - 0x6587, 0xCEC4, - 0x658B, 0xD5AB, - 0x658C, 0xB1F3, - 0x6590, 0xECB3, - 0x6591, 0xB0DF, - 0x6593, 0xECB5, - 0x6597, 0xB6B7, - 0x6599, 0xC1CF, - 0x659B, 0xF5FA, - 0x659C, 0xD0B1, - 0x659F, 0xD5E5, - 0x65A1, 0xCED3, - 0x65A4, 0xBDEF, - 0x65A5, 0xB3E2, - 0x65A7, 0xB8AB, - 0x65A9, 0xD5B6, - 0x65AB, 0xEDBD, - 0x65AD, 0xB6CF, - 0x65AF, 0xCBB9, - 0x65B0, 0xD0C2, - 0x65B9, 0xB7BD, - 0x65BC, 0xECB6, - 0x65BD, 0xCAA9, - 0x65C1, 0xC5D4, - 0x65C3, 0xECB9, - 0x65C4, 0xECB8, - 0x65C5, 0xC2C3, - 0x65C6, 0xECB7, - 0x65CB, 0xD0FD, - 0x65CC, 0xECBA, - 0x65CE, 0xECBB, - 0x65CF, 0xD7E5, - 0x65D2, 0xECBC, - 0x65D6, 0xECBD, - 0x65D7, 0xC6EC, - 0x65E0, 0xCEDE, - 0x65E2, 0xBCC8, - 0x65E5, 0xC8D5, - 0x65E6, 0xB5A9, - 0x65E7, 0xBEC9, - 0x65E8, 0xD6BC, - 0x65E9, 0xD4E7, - 0x65EC, 0xD1AE, - 0x65ED, 0xD0F1, - 0x65EE, 0xEAB8, - 0x65EF, 0xEAB9, - 0x65F0, 0xEABA, - 0x65F1, 0xBAB5, - 0x65F6, 0xCAB1, - 0x65F7, 0xBFF5, - 0x65FA, 0xCDFA, - 0x6600, 0xEAC0, - 0x6602, 0xB0BA, - 0x6603, 0xEABE, - 0x6606, 0xC0A5, - 0x660A, 0xEABB, - 0x660C, 0xB2FD, - 0x660E, 0xC3F7, - 0x660F, 0xBBE8, - 0x6613, 0xD2D7, - 0x6614, 0xCEF4, - 0x6615, 0xEABF, - 0x6619, 0xEABC, - 0x661D, 0xEAC3, - 0x661F, 0xD0C7, - 0x6620, 0xD3B3, - 0x6625, 0xB4BA, - 0x6627, 0xC3C1, - 0x6628, 0xD7F2, - 0x662D, 0xD5D1, - 0x662F, 0xCAC7, - 0x6631, 0xEAC5, - 0x6634, 0xEAC4, - 0x6635, 0xEAC7, - 0x6636, 0xEAC6, - 0x663C, 0xD6E7, - 0x663E, 0xCFD4, - 0x6641, 0xEACB, - 0x6643, 0xBBCE, - 0x664B, 0xBDFA, - 0x664C, 0xC9CE, - 0x664F, 0xEACC, - 0x6652, 0xC9B9, - 0x6653, 0xCFFE, - 0x6654, 0xEACA, - 0x6655, 0xD4CE, - 0x6656, 0xEACD, - 0x6657, 0xEACF, - 0x665A, 0xCDED, - 0x665F, 0xEAC9, - 0x6661, 0xEACE, - 0x6664, 0xCEEE, - 0x6666, 0xBBDE, - 0x6668, 0xB3BF, - 0x666E, 0xC6D5, - 0x666F, 0xBEB0, - 0x6670, 0xCEFA, - 0x6674, 0xC7E7, - 0x6676, 0xBEA7, - 0x6677, 0xEAD0, - 0x667A, 0xD6C7, - 0x667E, 0xC1C0, - 0x6682, 0xD4DD, - 0x6684, 0xEAD1, - 0x6687, 0xCFBE, - 0x668C, 0xEAD2, - 0x6691, 0xCAEE, - 0x6696, 0xC5AF, - 0x6697, 0xB0B5, - 0x669D, 0xEAD4, - 0x66A7, 0xEAD3, - 0x66A8, 0xF4DF, - 0x66AE, 0xC4BA, - 0x66B4, 0xB1A9, - 0x66B9, 0xE5DF, - 0x66BE, 0xEAD5, - 0x66D9, 0xCAEF, - 0x66DB, 0xEAD6, - 0x66DC, 0xEAD7, - 0x66DD, 0xC6D8, - 0x66E6, 0xEAD8, - 0x66E9, 0xEAD9, - 0x66F0, 0xD4BB, - 0x66F2, 0xC7FA, - 0x66F3, 0xD2B7, - 0x66F4, 0xB8FC, - 0x66F7, 0xEAC2, - 0x66F9, 0xB2DC, - 0x66FC, 0xC2FC, - 0x66FE, 0xD4F8, - 0x66FF, 0xCCE6, - 0x6700, 0xD7EE, - 0x6708, 0xD4C2, - 0x6709, 0xD3D0, - 0x670A, 0xEBC3, - 0x670B, 0xC5F3, - 0x670D, 0xB7FE, - 0x6710, 0xEBD4, - 0x6714, 0xCBB7, - 0x6715, 0xEBDE, - 0x6717, 0xC0CA, - 0x671B, 0xCDFB, - 0x671D, 0xB3AF, - 0x671F, 0xC6DA, - 0x6726, 0xEBFC, - 0x6728, 0xC4BE, - 0x672A, 0xCEB4, - 0x672B, 0xC4A9, - 0x672C, 0xB1BE, - 0x672D, 0xD4FD, - 0x672F, 0xCAF5, - 0x6731, 0xD6EC, - 0x6734, 0xC6D3, - 0x6735, 0xB6E4, - 0x673A, 0xBBFA, - 0x673D, 0xD0E0, - 0x6740, 0xC9B1, - 0x6742, 0xD4D3, - 0x6743, 0xC8A8, - 0x6746, 0xB8CB, - 0x6748, 0xE8BE, - 0x6749, 0xC9BC, - 0x674C, 0xE8BB, - 0x674E, 0xC0EE, - 0x674F, 0xD0D3, - 0x6750, 0xB2C4, - 0x6751, 0xB4E5, - 0x6753, 0xE8BC, - 0x6756, 0xD5C8, - 0x675C, 0xB6C5, - 0x675E, 0xE8BD, - 0x675F, 0xCAF8, - 0x6760, 0xB8DC, - 0x6761, 0xCCF5, - 0x6765, 0xC0B4, - 0x6768, 0xD1EE, - 0x6769, 0xE8BF, - 0x676A, 0xE8C2, - 0x676D, 0xBABC, - 0x676F, 0xB1AD, - 0x6770, 0xBDDC, - 0x6772, 0xEABD, - 0x6773, 0xE8C3, - 0x6775, 0xE8C6, - 0x6777, 0xE8CB, - 0x677C, 0xE8CC, - 0x677E, 0xCBC9, - 0x677F, 0xB0E5, - 0x6781, 0xBCAB, - 0x6784, 0xB9B9, - 0x6787, 0xE8C1, - 0x6789, 0xCDF7, - 0x678B, 0xE8CA, - 0x6790, 0xCEF6, - 0x6795, 0xD5ED, - 0x6797, 0xC1D6, - 0x6798, 0xE8C4, - 0x679A, 0xC3B6, - 0x679C, 0xB9FB, - 0x679D, 0xD6A6, - 0x679E, 0xE8C8, - 0x67A2, 0xCAE0, - 0x67A3, 0xD4E6, - 0x67A5, 0xE8C0, - 0x67A7, 0xE8C5, - 0x67A8, 0xE8C7, - 0x67AA, 0xC7B9, - 0x67AB, 0xB7E3, - 0x67AD, 0xE8C9, - 0x67AF, 0xBFDD, - 0x67B0, 0xE8D2, - 0x67B3, 0xE8D7, - 0x67B5, 0xE8D5, - 0x67B6, 0xBCDC, - 0x67B7, 0xBCCF, - 0x67B8, 0xE8DB, - 0x67C1, 0xE8DE, - 0x67C3, 0xE8DA, - 0x67C4, 0xB1FA, - 0x67CF, 0xB0D8, - 0x67D0, 0xC4B3, - 0x67D1, 0xB8CC, - 0x67D2, 0xC6E2, - 0x67D3, 0xC8BE, - 0x67D4, 0xC8E1, - 0x67D8, 0xE8CF, - 0x67D9, 0xE8D4, - 0x67DA, 0xE8D6, - 0x67DC, 0xB9F1, - 0x67DD, 0xE8D8, - 0x67DE, 0xD7F5, - 0x67E0, 0xC4FB, - 0x67E2, 0xE8DC, - 0x67E5, 0xB2E9, - 0x67E9, 0xE8D1, - 0x67EC, 0xBCED, - 0x67EF, 0xBFC2, - 0x67F0, 0xE8CD, - 0x67F1, 0xD6F9, - 0x67F3, 0xC1F8, - 0x67F4, 0xB2F1, - 0x67FD, 0xE8DF, - 0x67FF, 0xCAC1, - 0x6800, 0xE8D9, - 0x6805, 0xD5A4, - 0x6807, 0xB1EA, - 0x6808, 0xD5BB, - 0x6809, 0xE8CE, - 0x680A, 0xE8D0, - 0x680B, 0xB6B0, - 0x680C, 0xE8D3, - 0x680E, 0xE8DD, - 0x680F, 0xC0B8, - 0x6811, 0xCAF7, - 0x6813, 0xCBA8, - 0x6816, 0xC6DC, - 0x6817, 0xC0F5, - 0x681D, 0xE8E9, - 0x6821, 0xD0A3, - 0x6829, 0xE8F2, - 0x682A, 0xD6EA, - 0x6832, 0xE8E0, - 0x6833, 0xE8E1, - 0x6837, 0xD1F9, - 0x6838, 0xBACB, - 0x6839, 0xB8F9, - 0x683C, 0xB8F1, - 0x683D, 0xD4D4, - 0x683E, 0xE8EF, - 0x6840, 0xE8EE, - 0x6841, 0xE8EC, - 0x6842, 0xB9F0, - 0x6843, 0xCCD2, - 0x6844, 0xE8E6, - 0x6845, 0xCEA6, - 0x6846, 0xBFF2, - 0x6848, 0xB0B8, - 0x6849, 0xE8F1, - 0x684A, 0xE8F0, - 0x684C, 0xD7C0, - 0x684E, 0xE8E4, - 0x6850, 0xCDA9, - 0x6851, 0xC9A3, - 0x6853, 0xBBB8, - 0x6854, 0xBDDB, - 0x6855, 0xE8EA, - 0x6860, 0xE8E2, - 0x6861, 0xE8E3, - 0x6862, 0xE8E5, - 0x6863, 0xB5B5, - 0x6864, 0xE8E7, - 0x6865, 0xC7C5, - 0x6866, 0xE8EB, - 0x6867, 0xE8ED, - 0x6868, 0xBDB0, - 0x6869, 0xD7AE, - 0x686B, 0xE8F8, - 0x6874, 0xE8F5, - 0x6876, 0xCDB0, - 0x6877, 0xE8F6, - 0x6881, 0xC1BA, - 0x6883, 0xE8E8, - 0x6885, 0xC3B7, - 0x6886, 0xB0F0, - 0x688F, 0xE8F4, - 0x6893, 0xE8F7, - 0x6897, 0xB9A3, - 0x68A2, 0xC9D2, - 0x68A6, 0xC3CE, - 0x68A7, 0xCEE0, - 0x68A8, 0xC0E6, - 0x68AD, 0xCBF3, - 0x68AF, 0xCCDD, - 0x68B0, 0xD0B5, - 0x68B3, 0xCAE1, - 0x68B5, 0xE8F3, - 0x68C0, 0xBCEC, - 0x68C2, 0xE8F9, - 0x68C9, 0xC3DE, - 0x68CB, 0xC6E5, - 0x68CD, 0xB9F7, - 0x68D2, 0xB0F4, - 0x68D5, 0xD7D8, - 0x68D8, 0xBCAC, - 0x68DA, 0xC5EF, - 0x68E0, 0xCCC4, - 0x68E3, 0xE9A6, - 0x68EE, 0xC9AD, - 0x68F0, 0xE9A2, - 0x68F1, 0xC0E2, - 0x68F5, 0xBFC3, - 0x68F9, 0xE8FE, - 0x68FA, 0xB9D7, - 0x68FC, 0xE8FB, - 0x6901, 0xE9A4, - 0x6905, 0xD2CE, - 0x690B, 0xE9A3, - 0x690D, 0xD6B2, - 0x690E, 0xD7B5, - 0x6910, 0xE9A7, - 0x6912, 0xBDB7, - 0x691F, 0xE8FC, - 0x6920, 0xE8FD, - 0x6924, 0xE9A1, - 0x692D, 0xCDD6, - 0x6930, 0xD2AC, - 0x6934, 0xE9B2, - 0x6939, 0xE9A9, - 0x693D, 0xB4AA, - 0x693F, 0xB4BB, - 0x6942, 0xE9AB, - 0x6954, 0xD0A8, - 0x6957, 0xE9A5, - 0x695A, 0xB3FE, - 0x695D, 0xE9AC, - 0x695E, 0xC0E3, - 0x6960, 0xE9AA, - 0x6963, 0xE9B9, - 0x6966, 0xE9B8, - 0x696B, 0xE9AE, - 0x696E, 0xE8FA, - 0x6971, 0xE9A8, - 0x6977, 0xBFAC, - 0x6978, 0xE9B1, - 0x6979, 0xE9BA, - 0x697C, 0xC2A5, - 0x6980, 0xE9AF, - 0x6982, 0xB8C5, - 0x6984, 0xE9AD, - 0x6986, 0xD3DC, - 0x6987, 0xE9B4, - 0x6988, 0xE9B5, - 0x6989, 0xE9B7, - 0x698D, 0xE9C7, - 0x6994, 0xC0C6, - 0x6995, 0xE9C5, - 0x6998, 0xE9B0, - 0x699B, 0xE9BB, - 0x699C, 0xB0F1, - 0x69A7, 0xE9BC, - 0x69A8, 0xD5A5, - 0x69AB, 0xE9BE, - 0x69AD, 0xE9BF, - 0x69B1, 0xE9C1, - 0x69B4, 0xC1F1, - 0x69B7, 0xC8B6, - 0x69BB, 0xE9BD, - 0x69C1, 0xE9C2, - 0x69CA, 0xE9C3, - 0x69CC, 0xE9B3, - 0x69CE, 0xE9B6, - 0x69D0, 0xBBB1, - 0x69D4, 0xE9C0, - 0x69DB, 0xBCF7, - 0x69DF, 0xE9C4, - 0x69E0, 0xE9C6, - 0x69ED, 0xE9CA, - 0x69F2, 0xE9CE, - 0x69FD, 0xB2DB, - 0x69FF, 0xE9C8, - 0x6A0A, 0xB7AE, - 0x6A17, 0xE9CB, - 0x6A18, 0xE9CC, - 0x6A1F, 0xD5C1, - 0x6A21, 0xC4A3, - 0x6A28, 0xE9D8, - 0x6A2A, 0xBAE1, - 0x6A2F, 0xE9C9, - 0x6A31, 0xD3A3, - 0x6A35, 0xE9D4, - 0x6A3D, 0xE9D7, - 0x6A3E, 0xE9D0, - 0x6A44, 0xE9CF, - 0x6A47, 0xC7C1, - 0x6A50, 0xE9D2, - 0x6A58, 0xE9D9, - 0x6A59, 0xB3C8, - 0x6A5B, 0xE9D3, - 0x6A61, 0xCFF0, - 0x6A65, 0xE9CD, - 0x6A71, 0xB3F7, - 0x6A79, 0xE9D6, - 0x6A7C, 0xE9DA, - 0x6A80, 0xCCB4, - 0x6A84, 0xCFAD, - 0x6A8E, 0xE9D5, - 0x6A90, 0xE9DC, - 0x6A91, 0xE9DB, - 0x6A97, 0xE9DE, - 0x6AA0, 0xE9D1, - 0x6AA9, 0xE9DD, - 0x6AAB, 0xE9DF, - 0x6AAC, 0xC3CA, - 0x6B20, 0xC7B7, - 0x6B21, 0xB4CE, - 0x6B22, 0xBBB6, - 0x6B23, 0xD0C0, - 0x6B24, 0xECA3, - 0x6B27, 0xC5B7, - 0x6B32, 0xD3FB, - 0x6B37, 0xECA4, - 0x6B39, 0xECA5, - 0x6B3A, 0xC6DB, - 0x6B3E, 0xBFEE, - 0x6B43, 0xECA6, - 0x6B46, 0xECA7, - 0x6B47, 0xD0AA, - 0x6B49, 0xC7B8, - 0x6B4C, 0xB8E8, - 0x6B59, 0xECA8, - 0x6B62, 0xD6B9, - 0x6B63, 0xD5FD, - 0x6B64, 0xB4CB, - 0x6B65, 0xB2BD, - 0x6B66, 0xCEE4, - 0x6B67, 0xC6E7, - 0x6B6A, 0xCDE1, - 0x6B79, 0xB4F5, - 0x6B7B, 0xCBC0, - 0x6B7C, 0xBCDF, - 0x6B81, 0xE9E2, - 0x6B82, 0xE9E3, - 0x6B83, 0xD1EA, - 0x6B84, 0xE9E5, - 0x6B86, 0xB4F9, - 0x6B87, 0xE9E4, - 0x6B89, 0xD1B3, - 0x6B8A, 0xCAE2, - 0x6B8B, 0xB2D0, - 0x6B8D, 0xE9E8, - 0x6B92, 0xE9E6, - 0x6B93, 0xE9E7, - 0x6B96, 0xD6B3, - 0x6B9A, 0xE9E9, - 0x6B9B, 0xE9EA, - 0x6BA1, 0xE9EB, - 0x6BAA, 0xE9EC, - 0x6BB3, 0xECAF, - 0x6BB4, 0xC5B9, - 0x6BB5, 0xB6CE, - 0x6BB7, 0xD2F3, - 0x6BBF, 0xB5EE, - 0x6BC1, 0xBBD9, - 0x6BC2, 0xECB1, - 0x6BC5, 0xD2E3, - 0x6BCB, 0xCEE3, - 0x6BCD, 0xC4B8, - 0x6BCF, 0xC3BF, - 0x6BD2, 0xB6BE, - 0x6BD3, 0xD8B9, - 0x6BD4, 0xB1C8, - 0x6BD5, 0xB1CF, - 0x6BD6, 0xB1D1, - 0x6BD7, 0xC5FE, - 0x6BD9, 0xB1D0, - 0x6BDB, 0xC3AB, - 0x6BE1, 0xD5B1, - 0x6BEA, 0xEBA4, - 0x6BEB, 0xBAC1, - 0x6BEF, 0xCCBA, - 0x6BF3, 0xEBA5, - 0x6BF5, 0xEBA7, - 0x6BF9, 0xEBA8, - 0x6BFD, 0xEBA6, - 0x6C05, 0xEBA9, - 0x6C06, 0xEBAB, - 0x6C07, 0xEBAA, - 0x6C0D, 0xEBAC, - 0x6C0F, 0xCACF, - 0x6C10, 0xD8B5, - 0x6C11, 0xC3F1, - 0x6C13, 0xC3A5, - 0x6C14, 0xC6F8, - 0x6C15, 0xEBAD, - 0x6C16, 0xC4CA, - 0x6C18, 0xEBAE, - 0x6C19, 0xEBAF, - 0x6C1A, 0xEBB0, - 0x6C1B, 0xB7D5, - 0x6C1F, 0xB7FA, - 0x6C21, 0xEBB1, - 0x6C22, 0xC7E2, - 0x6C24, 0xEBB3, - 0x6C26, 0xBAA4, - 0x6C27, 0xD1F5, - 0x6C28, 0xB0B1, - 0x6C29, 0xEBB2, - 0x6C2A, 0xEBB4, - 0x6C2E, 0xB5AA, - 0x6C2F, 0xC2C8, - 0x6C30, 0xC7E8, - 0x6C32, 0xEBB5, - 0x6C34, 0xCBAE, - 0x6C35, 0xE3DF, - 0x6C38, 0xD3C0, - 0x6C3D, 0xD9DB, - 0x6C40, 0xCDA1, - 0x6C41, 0xD6AD, - 0x6C42, 0xC7F3, - 0x6C46, 0xD9E0, - 0x6C47, 0xBBE3, - 0x6C49, 0xBABA, - 0x6C4A, 0xE3E2, - 0x6C50, 0xCFAB, - 0x6C54, 0xE3E0, - 0x6C55, 0xC9C7, - 0x6C57, 0xBAB9, - 0x6C5B, 0xD1B4, - 0x6C5C, 0xE3E1, - 0x6C5D, 0xC8EA, - 0x6C5E, 0xB9AF, - 0x6C5F, 0xBDAD, - 0x6C60, 0xB3D8, - 0x6C61, 0xCEDB, - 0x6C64, 0xCCC0, - 0x6C68, 0xE3E8, - 0x6C69, 0xE3E9, - 0x6C6A, 0xCDF4, - 0x6C70, 0xCCAD, - 0x6C72, 0xBCB3, - 0x6C74, 0xE3EA, - 0x6C76, 0xE3EB, - 0x6C79, 0xD0DA, - 0x6C7D, 0xC6FB, - 0x6C7E, 0xB7DA, - 0x6C81, 0xC7DF, - 0x6C82, 0xD2CA, - 0x6C83, 0xCED6, - 0x6C85, 0xE3E4, - 0x6C86, 0xE3EC, - 0x6C88, 0xC9F2, - 0x6C89, 0xB3C1, - 0x6C8C, 0xE3E7, - 0x6C8F, 0xC6E3, - 0x6C90, 0xE3E5, - 0x6C93, 0xEDB3, - 0x6C94, 0xE3E6, - 0x6C99, 0xC9B3, - 0x6C9B, 0xC5E6, - 0x6C9F, 0xB9B5, - 0x6CA1, 0xC3BB, - 0x6CA3, 0xE3E3, - 0x6CA4, 0xC5BD, - 0x6CA5, 0xC1A4, - 0x6CA6, 0xC2D9, - 0x6CA7, 0xB2D7, - 0x6CA9, 0xE3ED, - 0x6CAA, 0xBBA6, - 0x6CAB, 0xC4AD, - 0x6CAD, 0xE3F0, - 0x6CAE, 0xBEDA, - 0x6CB1, 0xE3FB, - 0x6CB2, 0xE3F5, - 0x6CB3, 0xBAD3, - 0x6CB8, 0xB7D0, - 0x6CB9, 0xD3CD, - 0x6CBB, 0xD6CE, - 0x6CBC, 0xD5D3, - 0x6CBD, 0xB9C1, - 0x6CBE, 0xD5B4, - 0x6CBF, 0xD1D8, - 0x6CC4, 0xD0B9, - 0x6CC5, 0xC7F6, - 0x6CC9, 0xC8AA, - 0x6CCA, 0xB2B4, - 0x6CCC, 0xC3DA, - 0x6CD0, 0xE3EE, - 0x6CD3, 0xE3FC, - 0x6CD4, 0xE3EF, - 0x6CD5, 0xB7A8, - 0x6CD6, 0xE3F7, - 0x6CD7, 0xE3F4, - 0x6CDB, 0xB7BA, - 0x6CDE, 0xC5A2, - 0x6CE0, 0xE3F6, - 0x6CE1, 0xC5DD, - 0x6CE2, 0xB2A8, - 0x6CE3, 0xC6FC, - 0x6CE5, 0xC4E0, - 0x6CE8, 0xD7A2, - 0x6CEA, 0xC0E1, - 0x6CEB, 0xE3F9, - 0x6CEE, 0xE3FA, - 0x6CEF, 0xE3FD, - 0x6CF0, 0xCCA9, - 0x6CF1, 0xE3F3, - 0x6CF3, 0xD3BE, - 0x6CF5, 0xB1C3, - 0x6CF6, 0xEDB4, - 0x6CF7, 0xE3F1, - 0x6CF8, 0xE3F2, - 0x6CFA, 0xE3F8, - 0x6CFB, 0xD0BA, - 0x6CFC, 0xC6C3, - 0x6CFD, 0xD4F3, - 0x6CFE, 0xE3FE, - 0x6D01, 0xBDE0, - 0x6D04, 0xE4A7, - 0x6D07, 0xE4A6, - 0x6D0B, 0xD1F3, - 0x6D0C, 0xE4A3, - 0x6D0E, 0xE4A9, - 0x6D12, 0xC8F7, - 0x6D17, 0xCFB4, - 0x6D19, 0xE4A8, - 0x6D1A, 0xE4AE, - 0x6D1B, 0xC2E5, - 0x6D1E, 0xB6B4, - 0x6D25, 0xBDF2, - 0x6D27, 0xE4A2, - 0x6D2A, 0xBAE9, - 0x6D2B, 0xE4AA, - 0x6D2E, 0xE4AC, - 0x6D31, 0xB6FD, - 0x6D32, 0xD6DE, - 0x6D33, 0xE4B2, - 0x6D35, 0xE4AD, - 0x6D39, 0xE4A1, - 0x6D3B, 0xBBEE, - 0x6D3C, 0xCDDD, - 0x6D3D, 0xC7A2, - 0x6D3E, 0xC5C9, - 0x6D41, 0xC1F7, - 0x6D43, 0xE4A4, - 0x6D45, 0xC7B3, - 0x6D46, 0xBDAC, - 0x6D47, 0xBDBD, - 0x6D48, 0xE4A5, - 0x6D4A, 0xD7C7, - 0x6D4B, 0xB2E2, - 0x6D4D, 0xE4AB, - 0x6D4E, 0xBCC3, - 0x6D4F, 0xE4AF, - 0x6D51, 0xBBEB, - 0x6D52, 0xE4B0, - 0x6D53, 0xC5A8, - 0x6D54, 0xE4B1, - 0x6D59, 0xD5E3, - 0x6D5A, 0xBFA3, - 0x6D5C, 0xE4BA, - 0x6D5E, 0xE4B7, - 0x6D60, 0xE4BB, - 0x6D63, 0xE4BD, - 0x6D66, 0xC6D6, - 0x6D69, 0xBAC6, - 0x6D6A, 0xC0CB, - 0x6D6E, 0xB8A1, - 0x6D6F, 0xE4B4, - 0x6D74, 0xD4A1, - 0x6D77, 0xBAA3, - 0x6D78, 0xBDFE, - 0x6D7C, 0xE4BC, - 0x6D82, 0xCDBF, - 0x6D85, 0xC4F9, - 0x6D88, 0xCFFB, - 0x6D89, 0xC9E6, - 0x6D8C, 0xD3BF, - 0x6D8E, 0xCFD1, - 0x6D91, 0xE4B3, - 0x6D93, 0xE4B8, - 0x6D94, 0xE4B9, - 0x6D95, 0xCCE9, - 0x6D9B, 0xCCCE, - 0x6D9D, 0xC0D4, - 0x6D9E, 0xE4B5, - 0x6D9F, 0xC1B0, - 0x6DA0, 0xE4B6, - 0x6DA1, 0xCED0, - 0x6DA3, 0xBBC1, - 0x6DA4, 0xB5D3, - 0x6DA6, 0xC8F3, - 0x6DA7, 0xBDA7, - 0x6DA8, 0xD5C7, - 0x6DA9, 0xC9AC, - 0x6DAA, 0xB8A2, - 0x6DAB, 0xE4CA, - 0x6DAE, 0xE4CC, - 0x6DAF, 0xD1C4, - 0x6DB2, 0xD2BA, - 0x6DB5, 0xBAAD, - 0x6DB8, 0xBAD4, - 0x6DBF, 0xE4C3, - 0x6DC0, 0xB5ED, - 0x6DC4, 0xD7CD, - 0x6DC5, 0xE4C0, - 0x6DC6, 0xCFFD, - 0x6DC7, 0xE4BF, - 0x6DCB, 0xC1DC, - 0x6DCC, 0xCCCA, - 0x6DD1, 0xCAE7, - 0x6DD6, 0xC4D7, - 0x6DD8, 0xCCD4, - 0x6DD9, 0xE4C8, - 0x6DDD, 0xE4C7, - 0x6DDE, 0xE4C1, - 0x6DE0, 0xE4C4, - 0x6DE1, 0xB5AD, - 0x6DE4, 0xD3D9, - 0x6DE6, 0xE4C6, - 0x6DEB, 0xD2F9, - 0x6DEC, 0xB4E3, - 0x6DEE, 0xBBB4, - 0x6DF1, 0xC9EE, - 0x6DF3, 0xB4BE, - 0x6DF7, 0xBBEC, - 0x6DF9, 0xD1CD, - 0x6DFB, 0xCCED, - 0x6DFC, 0xEDB5, - 0x6E05, 0xC7E5, - 0x6E0A, 0xD4A8, - 0x6E0C, 0xE4CB, - 0x6E0D, 0xD7D5, - 0x6E0E, 0xE4C2, - 0x6E10, 0xBDA5, - 0x6E11, 0xE4C5, - 0x6E14, 0xD3E6, - 0x6E16, 0xE4C9, - 0x6E17, 0xC9F8, - 0x6E1A, 0xE4BE, - 0x6E1D, 0xD3E5, - 0x6E20, 0xC7FE, - 0x6E21, 0xB6C9, - 0x6E23, 0xD4FC, - 0x6E24, 0xB2B3, - 0x6E25, 0xE4D7, - 0x6E29, 0xCEC2, - 0x6E2B, 0xE4CD, - 0x6E2D, 0xCEBC, - 0x6E2F, 0xB8DB, - 0x6E32, 0xE4D6, - 0x6E34, 0xBFCA, - 0x6E38, 0xD3CE, - 0x6E3A, 0xC3EC, - 0x6E43, 0xC5C8, - 0x6E44, 0xE4D8, - 0x6E4D, 0xCDC4, - 0x6E4E, 0xE4CF, - 0x6E53, 0xE4D4, - 0x6E54, 0xE4D5, - 0x6E56, 0xBAFE, - 0x6E58, 0xCFE6, - 0x6E5B, 0xD5BF, - 0x6E5F, 0xE4D2, - 0x6E6B, 0xE4D0, - 0x6E6E, 0xE4CE, - 0x6E7E, 0xCDE5, - 0x6E7F, 0xCAAA, - 0x6E83, 0xC0A3, - 0x6E85, 0xBDA6, - 0x6E86, 0xE4D3, - 0x6E89, 0xB8C8, - 0x6E8F, 0xE4E7, - 0x6E90, 0xD4B4, - 0x6E98, 0xE4DB, - 0x6E9C, 0xC1EF, - 0x6E9F, 0xE4E9, - 0x6EA2, 0xD2E7, - 0x6EA5, 0xE4DF, - 0x6EA7, 0xE4E0, - 0x6EAA, 0xCFAA, - 0x6EAF, 0xCBDD, - 0x6EB1, 0xE4DA, - 0x6EB2, 0xE4D1, - 0x6EB4, 0xE4E5, - 0x6EB6, 0xC8DC, - 0x6EB7, 0xE4E3, - 0x6EBA, 0xC4E7, - 0x6EBB, 0xE4E2, - 0x6EBD, 0xE4E1, - 0x6EC1, 0xB3FC, - 0x6EC2, 0xE4E8, - 0x6EC7, 0xB5E1, - 0x6ECB, 0xD7CC, - 0x6ECF, 0xE4E6, - 0x6ED1, 0xBBAC, - 0x6ED3, 0xD7D2, - 0x6ED4, 0xCCCF, - 0x6ED5, 0xEBF8, - 0x6ED7, 0xE4E4, - 0x6EDA, 0xB9F6, - 0x6EDE, 0xD6CD, - 0x6EDF, 0xE4D9, - 0x6EE0, 0xE4DC, - 0x6EE1, 0xC2FA, - 0x6EE2, 0xE4DE, - 0x6EE4, 0xC2CB, - 0x6EE5, 0xC0C4, - 0x6EE6, 0xC2D0, - 0x6EE8, 0xB1F5, - 0x6EE9, 0xCCB2, - 0x6EF4, 0xB5CE, - 0x6EF9, 0xE4EF, - 0x6F02, 0xC6AF, - 0x6F06, 0xC6E1, - 0x6F09, 0xE4F5, - 0x6F0F, 0xC2A9, - 0x6F13, 0xC0EC, - 0x6F14, 0xD1DD, - 0x6F15, 0xE4EE, - 0x6F20, 0xC4AE, - 0x6F24, 0xE4ED, - 0x6F29, 0xE4F6, - 0x6F2A, 0xE4F4, - 0x6F2B, 0xC2FE, - 0x6F2D, 0xE4DD, - 0x6F2F, 0xE4F0, - 0x6F31, 0xCAFE, - 0x6F33, 0xD5C4, - 0x6F36, 0xE4F1, - 0x6F3E, 0xD1FA, - 0x6F46, 0xE4EB, - 0x6F47, 0xE4EC, - 0x6F4B, 0xE4F2, - 0x6F4D, 0xCEAB, - 0x6F58, 0xC5CB, - 0x6F5C, 0xC7B1, - 0x6F5E, 0xC2BA, - 0x6F62, 0xE4EA, - 0x6F66, 0xC1CA, - 0x6F6D, 0xCCB6, - 0x6F6E, 0xB3B1, - 0x6F72, 0xE4FB, - 0x6F74, 0xE4F3, - 0x6F78, 0xE4FA, - 0x6F7A, 0xE4FD, - 0x6F7C, 0xE4FC, - 0x6F84, 0xB3CE, - 0x6F88, 0xB3BA, - 0x6F89, 0xE4F7, - 0x6F8C, 0xE4F9, - 0x6F8D, 0xE4F8, - 0x6F8E, 0xC5EC, - 0x6F9C, 0xC0BD, - 0x6FA1, 0xD4E8, - 0x6FA7, 0xE5A2, - 0x6FB3, 0xB0C4, - 0x6FB6, 0xE5A4, - 0x6FB9, 0xE5A3, - 0x6FC0, 0xBCA4, - 0x6FC2, 0xE5A5, - 0x6FC9, 0xE5A1, - 0x6FD1, 0xE4FE, - 0x6FD2, 0xB1F4, - 0x6FDE, 0xE5A8, - 0x6FE0, 0xE5A9, - 0x6FE1, 0xE5A6, - 0x6FEE, 0xE5A7, - 0x6FEF, 0xE5AA, - 0x7011, 0xC6D9, - 0x701A, 0xE5AB, - 0x701B, 0xE5AD, - 0x7023, 0xE5AC, - 0x7035, 0xE5AF, - 0x7039, 0xE5AE, - 0x704C, 0xB9E0, - 0x704F, 0xE5B0, - 0x705E, 0xE5B1, - 0x706B, 0xBBF0, - 0x706C, 0xECE1, - 0x706D, 0xC3F0, - 0x706F, 0xB5C6, - 0x7070, 0xBBD2, - 0x7075, 0xC1E9, - 0x7076, 0xD4EE, - 0x7078, 0xBEC4, - 0x707C, 0xD7C6, - 0x707E, 0xD4D6, - 0x707F, 0xB2D3, - 0x7080, 0xECBE, - 0x7085, 0xEAC1, - 0x7089, 0xC2AF, - 0x708A, 0xB4B6, - 0x708E, 0xD1D7, - 0x7092, 0xB3B4, - 0x7094, 0xC8B2, - 0x7095, 0xBFBB, - 0x7096, 0xECC0, - 0x7099, 0xD6CB, - 0x709C, 0xECBF, - 0x709D, 0xECC1, - 0x70AB, 0xECC5, - 0x70AC, 0xBEE6, - 0x70AD, 0xCCBF, - 0x70AE, 0xC5DA, - 0x70AF, 0xBEBC, - 0x70B1, 0xECC6, - 0x70B3, 0xB1FE, - 0x70B7, 0xECC4, - 0x70B8, 0xD5A8, - 0x70B9, 0xB5E3, - 0x70BB, 0xECC2, - 0x70BC, 0xC1B6, - 0x70BD, 0xB3E3, - 0x70C0, 0xECC3, - 0x70C1, 0xCBB8, - 0x70C2, 0xC0C3, - 0x70C3, 0xCCFE, - 0x70C8, 0xC1D2, - 0x70CA, 0xECC8, - 0x70D8, 0xBAE6, - 0x70D9, 0xC0D3, - 0x70DB, 0xD6F2, - 0x70DF, 0xD1CC, - 0x70E4, 0xBFBE, - 0x70E6, 0xB7B3, - 0x70E7, 0xC9D5, - 0x70E8, 0xECC7, - 0x70E9, 0xBBE2, - 0x70EB, 0xCCCC, - 0x70EC, 0xBDFD, - 0x70ED, 0xC8C8, - 0x70EF, 0xCFA9, - 0x70F7, 0xCDE9, - 0x70F9, 0xC5EB, - 0x70FD, 0xB7E9, - 0x7109, 0xD1C9, - 0x710A, 0xBAB8, - 0x7110, 0xECC9, - 0x7113, 0xECCA, - 0x7115, 0xBBC0, - 0x7116, 0xECCB, - 0x7118, 0xECE2, - 0x7119, 0xB1BA, - 0x711A, 0xB7D9, - 0x7126, 0xBDB9, - 0x712F, 0xECCC, - 0x7130, 0xD1E6, - 0x7131, 0xECCD, - 0x7136, 0xC8BB, - 0x7145, 0xECD1, - 0x714A, 0xECD3, - 0x714C, 0xBBCD, - 0x714E, 0xBCE5, - 0x715C, 0xECCF, - 0x715E, 0xC9B7, - 0x7164, 0xC3BA, - 0x7166, 0xECE3, - 0x7167, 0xD5D5, - 0x7168, 0xECD0, - 0x716E, 0xD6F3, - 0x7172, 0xECD2, - 0x7173, 0xECCE, - 0x7178, 0xECD4, - 0x717A, 0xECD5, - 0x717D, 0xC9BF, - 0x7184, 0xCFA8, - 0x718A, 0xD0DC, - 0x718F, 0xD1AC, - 0x7194, 0xC8DB, - 0x7198, 0xECD6, - 0x7199, 0xCEF5, - 0x719F, 0xCAEC, - 0x71A0, 0xECDA, - 0x71A8, 0xECD9, - 0x71AC, 0xB0BE, - 0x71B3, 0xECD7, - 0x71B5, 0xECD8, - 0x71B9, 0xECE4, - 0x71C3, 0xC8BC, - 0x71CE, 0xC1C7, - 0x71D4, 0xECDC, - 0x71D5, 0xD1E0, - 0x71E0, 0xECDB, - 0x71E5, 0xD4EF, - 0x71E7, 0xECDD, - 0x71EE, 0xDBC6, - 0x71F9, 0xECDE, - 0x7206, 0xB1AC, - 0x721D, 0xECDF, - 0x7228, 0xECE0, - 0x722A, 0xD7A6, - 0x722C, 0xC5C0, - 0x7230, 0xEBBC, - 0x7231, 0xB0AE, - 0x7235, 0xBEF4, - 0x7236, 0xB8B8, - 0x7237, 0xD2AF, - 0x7238, 0xB0D6, - 0x7239, 0xB5F9, - 0x723B, 0xD8B3, - 0x723D, 0xCBAC, - 0x723F, 0xE3DD, - 0x7247, 0xC6AC, - 0x7248, 0xB0E6, - 0x724C, 0xC5C6, - 0x724D, 0xEBB9, - 0x7252, 0xEBBA, - 0x7256, 0xEBBB, - 0x7259, 0xD1C0, - 0x725B, 0xC5A3, - 0x725D, 0xEAF2, - 0x725F, 0xC4B2, - 0x7261, 0xC4B5, - 0x7262, 0xC0CE, - 0x7266, 0xEAF3, - 0x7267, 0xC4C1, - 0x7269, 0xCEEF, - 0x726E, 0xEAF0, - 0x726F, 0xEAF4, - 0x7272, 0xC9FC, - 0x7275, 0xC7A3, - 0x7279, 0xCCD8, - 0x727A, 0xCEFE, - 0x727E, 0xEAF5, - 0x727F, 0xEAF6, - 0x7280, 0xCFAC, - 0x7281, 0xC0E7, - 0x7284, 0xEAF7, - 0x728A, 0xB6BF, - 0x728B, 0xEAF8, - 0x728D, 0xEAF9, - 0x728F, 0xEAFA, - 0x7292, 0xEAFB, - 0x729F, 0xEAF1, - 0x72AC, 0xC8AE, - 0x72AD, 0xE1EB, - 0x72AF, 0xB7B8, - 0x72B0, 0xE1EC, - 0x72B4, 0xE1ED, - 0x72B6, 0xD7B4, - 0x72B7, 0xE1EE, - 0x72B8, 0xE1EF, - 0x72B9, 0xD3CC, - 0x72C1, 0xE1F1, - 0x72C2, 0xBFF1, - 0x72C3, 0xE1F0, - 0x72C4, 0xB5D2, - 0x72C8, 0xB1B7, - 0x72CD, 0xE1F3, - 0x72CE, 0xE1F2, - 0x72D0, 0xBAFC, - 0x72D2, 0xE1F4, - 0x72D7, 0xB9B7, - 0x72D9, 0xBED1, - 0x72DE, 0xC4FC, - 0x72E0, 0xBADD, - 0x72E1, 0xBDC6, - 0x72E8, 0xE1F5, - 0x72E9, 0xE1F7, - 0x72EC, 0xB6C0, - 0x72ED, 0xCFC1, - 0x72EE, 0xCAA8, - 0x72EF, 0xE1F6, - 0x72F0, 0xD5F8, - 0x72F1, 0xD3FC, - 0x72F2, 0xE1F8, - 0x72F3, 0xE1FC, - 0x72F4, 0xE1F9, - 0x72F7, 0xE1FA, - 0x72F8, 0xC0EA, - 0x72FA, 0xE1FE, - 0x72FB, 0xE2A1, - 0x72FC, 0xC0C7, - 0x7301, 0xE1FB, - 0x7303, 0xE1FD, - 0x730A, 0xE2A5, - 0x730E, 0xC1D4, - 0x7313, 0xE2A3, - 0x7315, 0xE2A8, - 0x7316, 0xB2FE, - 0x7317, 0xE2A2, - 0x731B, 0xC3CD, - 0x731C, 0xB2C2, - 0x731D, 0xE2A7, - 0x731E, 0xE2A6, - 0x7321, 0xE2A4, - 0x7322, 0xE2A9, - 0x7325, 0xE2AB, - 0x7329, 0xD0C9, - 0x732A, 0xD6ED, - 0x732B, 0xC3A8, - 0x732C, 0xE2AC, - 0x732E, 0xCFD7, - 0x7331, 0xE2AE, - 0x7334, 0xBAEF, - 0x7337, 0xE9E0, - 0x7338, 0xE2AD, - 0x7339, 0xE2AA, - 0x733E, 0xBBAB, - 0x733F, 0xD4B3, - 0x734D, 0xE2B0, - 0x7350, 0xE2AF, - 0x7352, 0xE9E1, - 0x7357, 0xE2B1, - 0x7360, 0xE2B2, - 0x736C, 0xE2B3, - 0x736D, 0xCCA1, - 0x736F, 0xE2B4, - 0x737E, 0xE2B5, - 0x7384, 0xD0FE, - 0x7387, 0xC2CA, - 0x7389, 0xD3F1, - 0x738B, 0xCDF5, - 0x738E, 0xE7E0, - 0x7391, 0xE7E1, - 0x7396, 0xBEC1, - 0x739B, 0xC2EA, - 0x739F, 0xE7E4, - 0x73A2, 0xE7E3, - 0x73A9, 0xCDE6, - 0x73AB, 0xC3B5, - 0x73AE, 0xE7E2, - 0x73AF, 0xBBB7, - 0x73B0, 0xCFD6, - 0x73B2, 0xC1E1, - 0x73B3, 0xE7E9, - 0x73B7, 0xE7E8, - 0x73BA, 0xE7F4, - 0x73BB, 0xB2A3, - 0x73C0, 0xE7EA, - 0x73C2, 0xE7E6, - 0x73C8, 0xE7EC, - 0x73C9, 0xE7EB, - 0x73CA, 0xC9BA, - 0x73CD, 0xD5E4, - 0x73CF, 0xE7E5, - 0x73D0, 0xB7A9, - 0x73D1, 0xE7E7, - 0x73D9, 0xE7EE, - 0x73DE, 0xE7F3, - 0x73E0, 0xD6E9, - 0x73E5, 0xE7ED, - 0x73E7, 0xE7F2, - 0x73E9, 0xE7F1, - 0x73ED, 0xB0E0, - 0x73F2, 0xE7F5, - 0x7403, 0xC7F2, - 0x7405, 0xC0C5, - 0x7406, 0xC0ED, - 0x7409, 0xC1F0, - 0x740A, 0xE7F0, - 0x740F, 0xE7F6, - 0x7410, 0xCBF6, - 0x741A, 0xE8A2, - 0x741B, 0xE8A1, - 0x7422, 0xD7C1, - 0x7425, 0xE7FA, - 0x7426, 0xE7F9, - 0x7428, 0xE7FB, - 0x742A, 0xE7F7, - 0x742C, 0xE7FE, - 0x742E, 0xE7FD, - 0x7430, 0xE7FC, - 0x7433, 0xC1D5, - 0x7434, 0xC7D9, - 0x7435, 0xC5FD, - 0x7436, 0xC5C3, - 0x743C, 0xC7ED, - 0x7441, 0xE8A3, - 0x7455, 0xE8A6, - 0x7457, 0xE8A5, - 0x7459, 0xE8A7, - 0x745A, 0xBAF7, - 0x745B, 0xE7F8, - 0x745C, 0xE8A4, - 0x745E, 0xC8F0, - 0x745F, 0xC9AA, - 0x746D, 0xE8A9, - 0x7470, 0xB9E5, - 0x7476, 0xD1FE, - 0x7477, 0xE8A8, - 0x747E, 0xE8AA, - 0x7480, 0xE8AD, - 0x7481, 0xE8AE, - 0x7483, 0xC1A7, - 0x7487, 0xE8AF, - 0x748B, 0xE8B0, - 0x748E, 0xE8AC, - 0x7490, 0xE8B4, - 0x749C, 0xE8AB, - 0x749E, 0xE8B1, - 0x74A7, 0xE8B5, - 0x74A8, 0xE8B2, - 0x74A9, 0xE8B3, - 0x74BA, 0xE8B7, - 0x74D2, 0xE8B6, - 0x74DC, 0xB9CF, - 0x74DE, 0xF0AC, - 0x74E0, 0xF0AD, - 0x74E2, 0xC6B0, - 0x74E3, 0xB0EA, - 0x74E4, 0xC8BF, - 0x74E6, 0xCDDF, - 0x74EE, 0xCECD, - 0x74EF, 0xEAB1, - 0x74F4, 0xEAB2, - 0x74F6, 0xC6BF, - 0x74F7, 0xB4C9, - 0x74FF, 0xEAB3, - 0x7504, 0xD5E7, - 0x750D, 0xDDF9, - 0x750F, 0xEAB4, - 0x7511, 0xEAB5, - 0x7513, 0xEAB6, - 0x7518, 0xB8CA, - 0x7519, 0xDFB0, - 0x751A, 0xC9F5, - 0x751C, 0xCCF0, - 0x751F, 0xC9FA, - 0x7525, 0xC9FB, - 0x7528, 0xD3C3, - 0x7529, 0xCBA6, - 0x752B, 0xB8A6, - 0x752C, 0xF0AE, - 0x752D, 0xB1C2, - 0x752F, 0xE5B8, - 0x7530, 0xCCEF, - 0x7531, 0xD3C9, - 0x7532, 0xBCD7, - 0x7533, 0xC9EA, - 0x7535, 0xB5E7, - 0x7537, 0xC4D0, - 0x7538, 0xB5E9, - 0x753A, 0xEEAE, - 0x753B, 0xBBAD, - 0x753E, 0xE7DE, - 0x7540, 0xEEAF, - 0x7545, 0xB3A9, - 0x7548, 0xEEB2, - 0x754B, 0xEEB1, - 0x754C, 0xBDE7, - 0x754E, 0xEEB0, - 0x754F, 0xCEB7, - 0x7554, 0xC5CF, - 0x7559, 0xC1F4, - 0x755A, 0xDBCE, - 0x755B, 0xEEB3, - 0x755C, 0xD0F3, - 0x7565, 0xC2D4, - 0x7566, 0xC6E8, - 0x756A, 0xB7AC, - 0x7572, 0xEEB4, - 0x7574, 0xB3EB, - 0x7578, 0xBBFB, - 0x7579, 0xEEB5, - 0x757F, 0xE7DC, - 0x7583, 0xEEB6, - 0x7586, 0xBDAE, - 0x758B, 0xF1E2, - 0x758F, 0xCAE8, - 0x7591, 0xD2C9, - 0x7592, 0xF0DA, - 0x7594, 0xF0DB, - 0x7596, 0xF0DC, - 0x7597, 0xC1C6, - 0x7599, 0xB8ED, - 0x759A, 0xBECE, - 0x759D, 0xF0DE, - 0x759F, 0xC5B1, - 0x75A0, 0xF0DD, - 0x75A1, 0xD1F1, - 0x75A3, 0xF0E0, - 0x75A4, 0xB0CC, - 0x75A5, 0xBDEA, - 0x75AB, 0xD2DF, - 0x75AC, 0xF0DF, - 0x75AE, 0xB4AF, - 0x75AF, 0xB7E8, - 0x75B0, 0xF0E6, - 0x75B1, 0xF0E5, - 0x75B2, 0xC6A3, - 0x75B3, 0xF0E1, - 0x75B4, 0xF0E2, - 0x75B5, 0xB4C3, - 0x75B8, 0xF0E3, - 0x75B9, 0xD5EE, - 0x75BC, 0xCCDB, - 0x75BD, 0xBED2, - 0x75BE, 0xBCB2, - 0x75C2, 0xF0E8, - 0x75C3, 0xF0E7, - 0x75C4, 0xF0E4, - 0x75C5, 0xB2A1, - 0x75C7, 0xD6A2, - 0x75C8, 0xD3B8, - 0x75C9, 0xBEB7, - 0x75CA, 0xC8AC, - 0x75CD, 0xF0EA, - 0x75D2, 0xD1F7, - 0x75D4, 0xD6CC, - 0x75D5, 0xBADB, - 0x75D6, 0xF0E9, - 0x75D8, 0xB6BB, - 0x75DB, 0xCDB4, - 0x75DE, 0xC6A6, - 0x75E2, 0xC1A1, - 0x75E3, 0xF0EB, - 0x75E4, 0xF0EE, - 0x75E6, 0xF0ED, - 0x75E7, 0xF0F0, - 0x75E8, 0xF0EC, - 0x75EA, 0xBBBE, - 0x75EB, 0xF0EF, - 0x75F0, 0xCCB5, - 0x75F1, 0xF0F2, - 0x75F4, 0xB3D5, - 0x75F9, 0xB1D4, - 0x75FC, 0xF0F3, - 0x75FF, 0xF0F4, - 0x7600, 0xF0F6, - 0x7601, 0xB4E1, - 0x7603, 0xF0F1, - 0x7605, 0xF0F7, - 0x760A, 0xF0FA, - 0x760C, 0xF0F8, - 0x7610, 0xF0F5, - 0x7615, 0xF0FD, - 0x7617, 0xF0F9, - 0x7618, 0xF0FC, - 0x7619, 0xF0FE, - 0x761B, 0xF1A1, - 0x761F, 0xCEC1, - 0x7620, 0xF1A4, - 0x7622, 0xF1A3, - 0x7624, 0xC1F6, - 0x7625, 0xF0FB, - 0x7626, 0xCADD, - 0x7629, 0xB4F1, - 0x762A, 0xB1F1, - 0x762B, 0xCCB1, - 0x762D, 0xF1A6, - 0x7630, 0xF1A7, - 0x7633, 0xF1AC, - 0x7634, 0xD5CE, - 0x7635, 0xF1A9, - 0x7638, 0xC8B3, - 0x763C, 0xF1A2, - 0x763E, 0xF1AB, - 0x763F, 0xF1A8, - 0x7640, 0xF1A5, - 0x7643, 0xF1AA, - 0x764C, 0xB0A9, - 0x764D, 0xF1AD, - 0x7654, 0xF1AF, - 0x7656, 0xF1B1, - 0x765C, 0xF1B0, - 0x765E, 0xF1AE, - 0x7663, 0xD1A2, - 0x766B, 0xF1B2, - 0x766F, 0xF1B3, - 0x7678, 0xB9EF, - 0x767B, 0xB5C7, - 0x767D, 0xB0D7, - 0x767E, 0xB0D9, - 0x7682, 0xD4ED, - 0x7684, 0xB5C4, - 0x7686, 0xBDD4, - 0x7687, 0xBBCA, - 0x7688, 0xF0A7, - 0x768B, 0xB8DE, - 0x768E, 0xF0A8, - 0x7691, 0xB0A8, - 0x7693, 0xF0A9, - 0x7696, 0xCDEE, - 0x7699, 0xF0AA, - 0x76A4, 0xF0AB, - 0x76AE, 0xC6A4, - 0x76B1, 0xD6E5, - 0x76B2, 0xF1E4, - 0x76B4, 0xF1E5, - 0x76BF, 0xC3F3, - 0x76C2, 0xD3DB, - 0x76C5, 0xD6D1, - 0x76C6, 0xC5E8, - 0x76C8, 0xD3AF, - 0x76CA, 0xD2E6, - 0x76CD, 0xEEC1, - 0x76CE, 0xB0BB, - 0x76CF, 0xD5B5, - 0x76D0, 0xD1CE, - 0x76D1, 0xBCE0, - 0x76D2, 0xBAD0, - 0x76D4, 0xBFF8, - 0x76D6, 0xB8C7, - 0x76D7, 0xB5C1, - 0x76D8, 0xC5CC, - 0x76DB, 0xCAA2, - 0x76DF, 0xC3CB, - 0x76E5, 0xEEC2, - 0x76EE, 0xC4BF, - 0x76EF, 0xB6A2, - 0x76F1, 0xEDEC, - 0x76F2, 0xC3A4, - 0x76F4, 0xD6B1, - 0x76F8, 0xCFE0, - 0x76F9, 0xEDEF, - 0x76FC, 0xC5CE, - 0x76FE, 0xB6DC, - 0x7701, 0xCAA1, - 0x7704, 0xEDED, - 0x7707, 0xEDF0, - 0x7708, 0xEDF1, - 0x7709, 0xC3BC, - 0x770B, 0xBFB4, - 0x770D, 0xEDEE, - 0x7719, 0xEDF4, - 0x771A, 0xEDF2, - 0x771F, 0xD5E6, - 0x7720, 0xC3DF, - 0x7722, 0xEDF3, - 0x7726, 0xEDF6, - 0x7728, 0xD5A3, - 0x7729, 0xD1A3, - 0x772D, 0xEDF5, - 0x772F, 0xC3D0, - 0x7735, 0xEDF7, - 0x7736, 0xBFF4, - 0x7737, 0xBEEC, - 0x7738, 0xEDF8, - 0x773A, 0xCCF7, - 0x773C, 0xD1DB, - 0x7740, 0xD7C5, - 0x7741, 0xD5F6, - 0x7743, 0xEDFC, - 0x7747, 0xEDFB, - 0x7750, 0xEDF9, - 0x7751, 0xEDFA, - 0x775A, 0xEDFD, - 0x775B, 0xBEA6, - 0x7761, 0xCBAF, - 0x7762, 0xEEA1, - 0x7763, 0xB6BD, - 0x7765, 0xEEA2, - 0x7766, 0xC4C0, - 0x7768, 0xEDFE, - 0x776B, 0xBDDE, - 0x776C, 0xB2C7, - 0x7779, 0xB6C3, - 0x777D, 0xEEA5, - 0x777E, 0xD8BA, - 0x777F, 0xEEA3, - 0x7780, 0xEEA6, - 0x7784, 0xC3E9, - 0x7785, 0xB3F2, - 0x778C, 0xEEA7, - 0x778D, 0xEEA4, - 0x778E, 0xCFB9, - 0x7791, 0xEEA8, - 0x7792, 0xC2F7, - 0x779F, 0xEEA9, - 0x77A0, 0xEEAA, - 0x77A2, 0xDEAB, - 0x77A5, 0xC6B3, - 0x77A7, 0xC7C6, - 0x77A9, 0xD6F5, - 0x77AA, 0xB5C9, - 0x77AC, 0xCBB2, - 0x77B0, 0xEEAB, - 0x77B3, 0xCDAB, - 0x77B5, 0xEEAC, - 0x77BB, 0xD5B0, - 0x77BD, 0xEEAD, - 0x77BF, 0xF6C4, - 0x77CD, 0xDBC7, - 0x77D7, 0xB4A3, - 0x77DB, 0xC3AC, - 0x77DC, 0xF1E6, - 0x77E2, 0xCAB8, - 0x77E3, 0xD2D3, - 0x77E5, 0xD6AA, - 0x77E7, 0xEFF2, - 0x77E9, 0xBED8, - 0x77EB, 0xBDC3, - 0x77EC, 0xEFF3, - 0x77ED, 0xB6CC, - 0x77EE, 0xB0AB, - 0x77F3, 0xCAAF, - 0x77F6, 0xEDB6, - 0x77F8, 0xEDB7, - 0x77FD, 0xCEF9, - 0x77FE, 0xB7AF, - 0x77FF, 0xBFF3, - 0x7800, 0xEDB8, - 0x7801, 0xC2EB, - 0x7802, 0xC9B0, - 0x7809, 0xEDB9, - 0x780C, 0xC6F6, - 0x780D, 0xBFB3, - 0x7811, 0xEDBC, - 0x7812, 0xC5F8, - 0x7814, 0xD1D0, - 0x7816, 0xD7A9, - 0x7817, 0xEDBA, - 0x7818, 0xEDBB, - 0x781A, 0xD1E2, - 0x781C, 0xEDBF, - 0x781D, 0xEDC0, - 0x781F, 0xEDC4, - 0x7823, 0xEDC8, - 0x7825, 0xEDC6, - 0x7826, 0xEDCE, - 0x7827, 0xD5E8, - 0x7829, 0xEDC9, - 0x782C, 0xEDC7, - 0x782D, 0xEDBE, - 0x7830, 0xC5E9, - 0x7834, 0xC6C6, - 0x7837, 0xC9E9, - 0x7838, 0xD4D2, - 0x7839, 0xEDC1, - 0x783A, 0xEDC2, - 0x783B, 0xEDC3, - 0x783C, 0xEDC5, - 0x783E, 0xC0F9, - 0x7840, 0xB4A1, - 0x7845, 0xB9E8, - 0x7847, 0xEDD0, - 0x784C, 0xEDD1, - 0x784E, 0xEDCA, - 0x7850, 0xEDCF, - 0x7852, 0xCEF8, - 0x7855, 0xCBB6, - 0x7856, 0xEDCC, - 0x7857, 0xEDCD, - 0x785D, 0xCFF5, - 0x786A, 0xEDD2, - 0x786B, 0xC1F2, - 0x786C, 0xD3B2, - 0x786D, 0xEDCB, - 0x786E, 0xC8B7, - 0x7877, 0xBCEF, - 0x787C, 0xC5F0, - 0x7887, 0xEDD6, - 0x7889, 0xB5EF, - 0x788C, 0xC2B5, - 0x788D, 0xB0AD, - 0x788E, 0xCBE9, - 0x7891, 0xB1AE, - 0x7893, 0xEDD4, - 0x7897, 0xCDEB, - 0x7898, 0xB5E2, - 0x789A, 0xEDD5, - 0x789B, 0xEDD3, - 0x789C, 0xEDD7, - 0x789F, 0xB5FA, - 0x78A1, 0xEDD8, - 0x78A3, 0xEDD9, - 0x78A5, 0xEDDC, - 0x78A7, 0xB1CC, - 0x78B0, 0xC5F6, - 0x78B1, 0xBCEE, - 0x78B2, 0xEDDA, - 0x78B3, 0xCCBC, - 0x78B4, 0xB2EA, - 0x78B9, 0xEDDB, - 0x78BE, 0xC4EB, - 0x78C1, 0xB4C5, - 0x78C5, 0xB0F5, - 0x78C9, 0xEDDF, - 0x78CA, 0xC0DA, - 0x78CB, 0xB4E8, - 0x78D0, 0xC5CD, - 0x78D4, 0xEDDD, - 0x78D5, 0xBFC4, - 0x78D9, 0xEDDE, - 0x78E8, 0xC4A5, - 0x78EC, 0xEDE0, - 0x78F2, 0xEDE1, - 0x78F4, 0xEDE3, - 0x78F7, 0xC1D7, - 0x78FA, 0xBBC7, - 0x7901, 0xBDB8, - 0x7905, 0xEDE2, - 0x7913, 0xEDE4, - 0x791E, 0xEDE6, - 0x7924, 0xEDE5, - 0x7934, 0xEDE7, - 0x793A, 0xCABE, - 0x793B, 0xECEA, - 0x793C, 0xC0F1, - 0x793E, 0xC9E7, - 0x7940, 0xECEB, - 0x7941, 0xC6EE, - 0x7946, 0xECEC, - 0x7948, 0xC6ED, - 0x7949, 0xECED, - 0x7953, 0xECF0, - 0x7956, 0xD7E6, - 0x7957, 0xECF3, - 0x795A, 0xECF1, - 0x795B, 0xECEE, - 0x795C, 0xECEF, - 0x795D, 0xD7A3, - 0x795E, 0xC9F1, - 0x795F, 0xCBEE, - 0x7960, 0xECF4, - 0x7962, 0xECF2, - 0x7965, 0xCFE9, - 0x7967, 0xECF6, - 0x7968, 0xC6B1, - 0x796D, 0xBCC0, - 0x796F, 0xECF5, - 0x7977, 0xB5BB, - 0x7978, 0xBBF6, - 0x797A, 0xECF7, - 0x7980, 0xD9F7, - 0x7981, 0xBDFB, - 0x7984, 0xC2BB, - 0x7985, 0xECF8, - 0x798A, 0xECF9, - 0x798F, 0xB8A3, - 0x799A, 0xECFA, - 0x79A7, 0xECFB, - 0x79B3, 0xECFC, - 0x79B9, 0xD3ED, - 0x79BA, 0xD8AE, - 0x79BB, 0xC0EB, - 0x79BD, 0xC7DD, - 0x79BE, 0xBACC, - 0x79C0, 0xD0E3, - 0x79C1, 0xCBBD, - 0x79C3, 0xCDBA, - 0x79C6, 0xB8D1, - 0x79C9, 0xB1FC, - 0x79CB, 0xC7EF, - 0x79CD, 0xD6D6, - 0x79D1, 0xBFC6, - 0x79D2, 0xC3EB, - 0x79D5, 0xEFF5, - 0x79D8, 0xC3D8, - 0x79DF, 0xD7E2, - 0x79E3, 0xEFF7, - 0x79E4, 0xB3D3, - 0x79E6, 0xC7D8, - 0x79E7, 0xD1ED, - 0x79E9, 0xD6C8, - 0x79EB, 0xEFF8, - 0x79ED, 0xEFF6, - 0x79EF, 0xBBFD, - 0x79F0, 0xB3C6, - 0x79F8, 0xBDD5, - 0x79FB, 0xD2C6, - 0x79FD, 0xBBE0, - 0x7A00, 0xCFA1, - 0x7A02, 0xEFFC, - 0x7A03, 0xEFFB, - 0x7A06, 0xEFF9, - 0x7A0B, 0xB3CC, - 0x7A0D, 0xC9D4, - 0x7A0E, 0xCBB0, - 0x7A14, 0xEFFE, - 0x7A17, 0xB0DE, - 0x7A1A, 0xD6C9, - 0x7A1E, 0xEFFD, - 0x7A20, 0xB3ED, - 0x7A23, 0xF6D5, - 0x7A33, 0xCEC8, - 0x7A37, 0xF0A2, - 0x7A39, 0xF0A1, - 0x7A3B, 0xB5BE, - 0x7A3C, 0xBCDA, - 0x7A3D, 0xBBFC, - 0x7A3F, 0xB8E5, - 0x7A46, 0xC4C2, - 0x7A51, 0xF0A3, - 0x7A57, 0xCBEB, - 0x7A70, 0xF0A6, - 0x7A74, 0xD1A8, - 0x7A76, 0xBEBF, - 0x7A77, 0xC7EE, - 0x7A78, 0xF1B6, - 0x7A79, 0xF1B7, - 0x7A7A, 0xBFD5, - 0x7A7F, 0xB4A9, - 0x7A80, 0xF1B8, - 0x7A81, 0xCDBB, - 0x7A83, 0xC7D4, - 0x7A84, 0xD5AD, - 0x7A86, 0xF1B9, - 0x7A88, 0xF1BA, - 0x7A8D, 0xC7CF, - 0x7A91, 0xD2A4, - 0x7A92, 0xD6CF, - 0x7A95, 0xF1BB, - 0x7A96, 0xBDD1, - 0x7A97, 0xB4B0, - 0x7A98, 0xBEBD, - 0x7A9C, 0xB4DC, - 0x7A9D, 0xCED1, - 0x7A9F, 0xBFDF, - 0x7AA0, 0xF1BD, - 0x7AA5, 0xBFFA, - 0x7AA6, 0xF1BC, - 0x7AA8, 0xF1BF, - 0x7AAC, 0xF1BE, - 0x7AAD, 0xF1C0, - 0x7AB3, 0xF1C1, - 0x7ABF, 0xC1FE, - 0x7ACB, 0xC1A2, - 0x7AD6, 0xCAFA, - 0x7AD9, 0xD5BE, - 0x7ADE, 0xBEBA, - 0x7ADF, 0xBEB9, - 0x7AE0, 0xD5C2, - 0x7AE3, 0xBFA2, - 0x7AE5, 0xCDAF, - 0x7AE6, 0xF1B5, - 0x7AED, 0xBDDF, - 0x7AEF, 0xB6CB, - 0x7AF9, 0xD6F1, - 0x7AFA, 0xF3C3, - 0x7AFD, 0xF3C4, - 0x7AFF, 0xB8CD, - 0x7B03, 0xF3C6, - 0x7B04, 0xF3C7, - 0x7B06, 0xB0CA, - 0x7B08, 0xF3C5, - 0x7B0A, 0xF3C9, - 0x7B0B, 0xCBF1, - 0x7B0F, 0xF3CB, - 0x7B11, 0xD0A6, - 0x7B14, 0xB1CA, - 0x7B15, 0xF3C8, - 0x7B19, 0xF3CF, - 0x7B1B, 0xB5D1, - 0x7B1E, 0xF3D7, - 0x7B20, 0xF3D2, - 0x7B24, 0xF3D4, - 0x7B25, 0xF3D3, - 0x7B26, 0xB7FB, - 0x7B28, 0xB1BF, - 0x7B2A, 0xF3CE, - 0x7B2B, 0xF3CA, - 0x7B2C, 0xB5DA, - 0x7B2E, 0xF3D0, - 0x7B31, 0xF3D1, - 0x7B33, 0xF3D5, - 0x7B38, 0xF3CD, - 0x7B3A, 0xBCE3, - 0x7B3C, 0xC1FD, - 0x7B3E, 0xF3D6, - 0x7B45, 0xF3DA, - 0x7B47, 0xF3CC, - 0x7B49, 0xB5C8, - 0x7B4B, 0xBDEE, - 0x7B4C, 0xF3DC, - 0x7B4F, 0xB7A4, - 0x7B50, 0xBFF0, - 0x7B51, 0xD6FE, - 0x7B52, 0xCDB2, - 0x7B54, 0xB4F0, - 0x7B56, 0xB2DF, - 0x7B58, 0xF3D8, - 0x7B5A, 0xF3D9, - 0x7B5B, 0xC9B8, - 0x7B5D, 0xF3DD, - 0x7B60, 0xF3DE, - 0x7B62, 0xF3E1, - 0x7B6E, 0xF3DF, - 0x7B71, 0xF3E3, - 0x7B72, 0xF3E2, - 0x7B75, 0xF3DB, - 0x7B77, 0xBFEA, - 0x7B79, 0xB3EF, - 0x7B7B, 0xF3E0, - 0x7B7E, 0xC7A9, - 0x7B80, 0xBCF2, - 0x7B85, 0xF3EB, - 0x7B8D, 0xB9BF, - 0x7B90, 0xF3E4, - 0x7B94, 0xB2AD, - 0x7B95, 0xBBFE, - 0x7B97, 0xCBE3, - 0x7B9C, 0xF3ED, - 0x7B9D, 0xF3E9, - 0x7BA1, 0xB9DC, - 0x7BA2, 0xF3EE, - 0x7BA6, 0xF3E5, - 0x7BA7, 0xF3E6, - 0x7BA8, 0xF3EA, - 0x7BA9, 0xC2E1, - 0x7BAA, 0xF3EC, - 0x7BAB, 0xF3EF, - 0x7BAC, 0xF3E8, - 0x7BAD, 0xBCFD, - 0x7BB1, 0xCFE4, - 0x7BB4, 0xF3F0, - 0x7BB8, 0xF3E7, - 0x7BC1, 0xF3F2, - 0x7BC6, 0xD7AD, - 0x7BC7, 0xC6AA, - 0x7BCC, 0xF3F3, - 0x7BD1, 0xF3F1, - 0x7BD3, 0xC2A8, - 0x7BD9, 0xB8DD, - 0x7BDA, 0xF3F5, - 0x7BDD, 0xF3F4, - 0x7BE1, 0xB4DB, - 0x7BE5, 0xF3F6, - 0x7BE6, 0xF3F7, - 0x7BEA, 0xF3F8, - 0x7BEE, 0xC0BA, - 0x7BF1, 0xC0E9, - 0x7BF7, 0xC5F1, - 0x7BFC, 0xF3FB, - 0x7BFE, 0xF3FA, - 0x7C07, 0xB4D8, - 0x7C0B, 0xF3FE, - 0x7C0C, 0xF3F9, - 0x7C0F, 0xF3FC, - 0x7C16, 0xF3FD, - 0x7C1F, 0xF4A1, - 0x7C26, 0xF4A3, - 0x7C27, 0xBBC9, - 0x7C2A, 0xF4A2, - 0x7C38, 0xF4A4, - 0x7C3F, 0xB2BE, - 0x7C40, 0xF4A6, - 0x7C41, 0xF4A5, - 0x7C4D, 0xBCAE, - 0x7C73, 0xC3D7, - 0x7C74, 0xD9E1, - 0x7C7B, 0xC0E0, - 0x7C7C, 0xF4CC, - 0x7C7D, 0xD7D1, - 0x7C89, 0xB7DB, - 0x7C91, 0xF4CE, - 0x7C92, 0xC1A3, - 0x7C95, 0xC6C9, - 0x7C97, 0xB4D6, - 0x7C98, 0xD5B3, - 0x7C9C, 0xF4D0, - 0x7C9D, 0xF4CF, - 0x7C9E, 0xF4D1, - 0x7C9F, 0xCBDA, - 0x7CA2, 0xF4D2, - 0x7CA4, 0xD4C1, - 0x7CA5, 0xD6E0, - 0x7CAA, 0xB7E0, - 0x7CAE, 0xC1B8, - 0x7CB1, 0xC1BB, - 0x7CB2, 0xF4D3, - 0x7CB3, 0xBEAC, - 0x7CB9, 0xB4E2, - 0x7CBC, 0xF4D4, - 0x7CBD, 0xF4D5, - 0x7CBE, 0xBEAB, - 0x7CC1, 0xF4D6, - 0x7CC5, 0xF4DB, - 0x7CC7, 0xF4D7, - 0x7CC8, 0xF4DA, - 0x7CCA, 0xBAFD, - 0x7CCC, 0xF4D8, - 0x7CCD, 0xF4D9, - 0x7CD5, 0xB8E2, - 0x7CD6, 0xCCC7, - 0x7CD7, 0xF4DC, - 0x7CD9, 0xB2DA, - 0x7CDC, 0xC3D3, - 0x7CDF, 0xD4E3, - 0x7CE0, 0xBFB7, - 0x7CE8, 0xF4DD, - 0x7CEF, 0xC5B4, - 0x7CF8, 0xF4E9, - 0x7CFB, 0xCFB5, - 0x7D0A, 0xCEC9, - 0x7D20, 0xCBD8, - 0x7D22, 0xCBF7, - 0x7D27, 0xBDF4, - 0x7D2B, 0xD7CF, - 0x7D2F, 0xC0DB, - 0x7D6E, 0xD0F5, - 0x7D77, 0xF4EA, - 0x7DA6, 0xF4EB, - 0x7DAE, 0xF4EC, - 0x7E3B, 0xF7E3, - 0x7E41, 0xB7B1, - 0x7E47, 0xF4ED, - 0x7E82, 0xD7EB, - 0x7E9B, 0xF4EE, - 0x7E9F, 0xE6F9, - 0x7EA0, 0xBEC0, - 0x7EA1, 0xE6FA, - 0x7EA2, 0xBAEC, - 0x7EA3, 0xE6FB, - 0x7EA4, 0xCFCB, - 0x7EA5, 0xE6FC, - 0x7EA6, 0xD4BC, - 0x7EA7, 0xBCB6, - 0x7EA8, 0xE6FD, - 0x7EA9, 0xE6FE, - 0x7EAA, 0xBCCD, - 0x7EAB, 0xC8D2, - 0x7EAC, 0xCEB3, - 0x7EAD, 0xE7A1, - 0x7EAF, 0xB4BF, - 0x7EB0, 0xE7A2, - 0x7EB1, 0xC9B4, - 0x7EB2, 0xB8D9, - 0x7EB3, 0xC4C9, - 0x7EB5, 0xD7DD, - 0x7EB6, 0xC2DA, - 0x7EB7, 0xB7D7, - 0x7EB8, 0xD6BD, - 0x7EB9, 0xCEC6, - 0x7EBA, 0xB7C4, - 0x7EBD, 0xC5A6, - 0x7EBE, 0xE7A3, - 0x7EBF, 0xCFDF, - 0x7EC0, 0xE7A4, - 0x7EC1, 0xE7A5, - 0x7EC2, 0xE7A6, - 0x7EC3, 0xC1B7, - 0x7EC4, 0xD7E9, - 0x7EC5, 0xC9F0, - 0x7EC6, 0xCFB8, - 0x7EC7, 0xD6AF, - 0x7EC8, 0xD6D5, - 0x7EC9, 0xE7A7, - 0x7ECA, 0xB0ED, - 0x7ECB, 0xE7A8, - 0x7ECC, 0xE7A9, - 0x7ECD, 0xC9DC, - 0x7ECE, 0xD2EF, - 0x7ECF, 0xBEAD, - 0x7ED0, 0xE7AA, - 0x7ED1, 0xB0F3, - 0x7ED2, 0xC8DE, - 0x7ED3, 0xBDE1, - 0x7ED4, 0xE7AB, - 0x7ED5, 0xC8C6, - 0x7ED7, 0xE7AC, - 0x7ED8, 0xBBE6, - 0x7ED9, 0xB8F8, - 0x7EDA, 0xD1A4, - 0x7EDB, 0xE7AD, - 0x7EDC, 0xC2E7, - 0x7EDD, 0xBEF8, - 0x7EDE, 0xBDCA, - 0x7EDF, 0xCDB3, - 0x7EE0, 0xE7AE, - 0x7EE1, 0xE7AF, - 0x7EE2, 0xBEEE, - 0x7EE3, 0xD0E5, - 0x7EE5, 0xCBE7, - 0x7EE6, 0xCCD0, - 0x7EE7, 0xBCCC, - 0x7EE8, 0xE7B0, - 0x7EE9, 0xBCA8, - 0x7EEA, 0xD0F7, - 0x7EEB, 0xE7B1, - 0x7EED, 0xD0F8, - 0x7EEE, 0xE7B2, - 0x7EEF, 0xE7B3, - 0x7EF0, 0xB4C2, - 0x7EF1, 0xE7B4, - 0x7EF2, 0xE7B5, - 0x7EF3, 0xC9FE, - 0x7EF4, 0xCEAC, - 0x7EF5, 0xC3E0, - 0x7EF6, 0xE7B7, - 0x7EF7, 0xB1C1, - 0x7EF8, 0xB3F1, - 0x7EFA, 0xE7B8, - 0x7EFB, 0xE7B9, - 0x7EFC, 0xD7DB, - 0x7EFD, 0xD5C0, - 0x7EFE, 0xE7BA, - 0x7EFF, 0xC2CC, - 0x7F00, 0xD7BA, - 0x7F01, 0xE7BB, - 0x7F02, 0xE7BC, - 0x7F03, 0xE7BD, - 0x7F04, 0xBCEA, - 0x7F05, 0xC3E5, - 0x7F06, 0xC0C2, - 0x7F07, 0xE7BE, - 0x7F08, 0xE7BF, - 0x7F09, 0xBCA9, - 0x7F0B, 0xE7C0, - 0x7F0C, 0xE7C1, - 0x7F0D, 0xE7B6, - 0x7F0E, 0xB6D0, - 0x7F0F, 0xE7C2, - 0x7F11, 0xE7C3, - 0x7F12, 0xE7C4, - 0x7F13, 0xBBBA, - 0x7F14, 0xB5DE, - 0x7F15, 0xC2C6, - 0x7F16, 0xB1E0, - 0x7F17, 0xE7C5, - 0x7F18, 0xD4B5, - 0x7F19, 0xE7C6, - 0x7F1A, 0xB8BF, - 0x7F1B, 0xE7C8, - 0x7F1C, 0xE7C7, - 0x7F1D, 0xB7EC, - 0x7F1F, 0xE7C9, - 0x7F20, 0xB2F8, - 0x7F21, 0xE7CA, - 0x7F22, 0xE7CB, - 0x7F23, 0xE7CC, - 0x7F24, 0xE7CD, - 0x7F25, 0xE7CE, - 0x7F26, 0xE7CF, - 0x7F27, 0xE7D0, - 0x7F28, 0xD3A7, - 0x7F29, 0xCBF5, - 0x7F2A, 0xE7D1, - 0x7F2B, 0xE7D2, - 0x7F2C, 0xE7D3, - 0x7F2D, 0xE7D4, - 0x7F2E, 0xC9C9, - 0x7F2F, 0xE7D5, - 0x7F30, 0xE7D6, - 0x7F31, 0xE7D7, - 0x7F32, 0xE7D8, - 0x7F33, 0xE7D9, - 0x7F34, 0xBDC9, - 0x7F35, 0xE7DA, - 0x7F36, 0xF3BE, - 0x7F38, 0xB8D7, - 0x7F3A, 0xC8B1, - 0x7F42, 0xF3BF, - 0x7F44, 0xF3C0, - 0x7F45, 0xF3C1, - 0x7F50, 0xB9DE, - 0x7F51, 0xCDF8, - 0x7F54, 0xD8E8, - 0x7F55, 0xBAB1, - 0x7F57, 0xC2DE, - 0x7F58, 0xEEB7, - 0x7F5A, 0xB7A3, - 0x7F5F, 0xEEB9, - 0x7F61, 0xEEB8, - 0x7F62, 0xB0D5, - 0x7F68, 0xEEBB, - 0x7F69, 0xD5D6, - 0x7F6A, 0xD7EF, - 0x7F6E, 0xD6C3, - 0x7F71, 0xEEBD, - 0x7F72, 0xCAF0, - 0x7F74, 0xEEBC, - 0x7F79, 0xEEBE, - 0x7F7E, 0xEEC0, - 0x7F81, 0xEEBF, - 0x7F8A, 0xD1F2, - 0x7F8C, 0xC7BC, - 0x7F8E, 0xC3C0, - 0x7F94, 0xB8E1, - 0x7F9A, 0xC1E7, - 0x7F9D, 0xF4C6, - 0x7F9E, 0xD0DF, - 0x7F9F, 0xF4C7, - 0x7FA1, 0xCFDB, - 0x7FA4, 0xC8BA, - 0x7FA7, 0xF4C8, - 0x7FAF, 0xF4C9, - 0x7FB0, 0xF4CA, - 0x7FB2, 0xF4CB, - 0x7FB8, 0xD9FA, - 0x7FB9, 0xB8FE, - 0x7FBC, 0xE5F1, - 0x7FBD, 0xD3F0, - 0x7FBF, 0xF4E0, - 0x7FC1, 0xCECC, - 0x7FC5, 0xB3E1, - 0x7FCA, 0xF1B4, - 0x7FCC, 0xD2EE, - 0x7FCE, 0xF4E1, - 0x7FD4, 0xCFE8, - 0x7FD5, 0xF4E2, - 0x7FD8, 0xC7CC, - 0x7FDF, 0xB5D4, - 0x7FE0, 0xB4E4, - 0x7FE1, 0xF4E4, - 0x7FE5, 0xF4E3, - 0x7FE6, 0xF4E5, - 0x7FE9, 0xF4E6, - 0x7FEE, 0xF4E7, - 0x7FF0, 0xBAB2, - 0x7FF1, 0xB0BF, - 0x7FF3, 0xF4E8, - 0x7FFB, 0xB7AD, - 0x7FFC, 0xD2ED, - 0x8000, 0xD2AB, - 0x8001, 0xC0CF, - 0x8003, 0xBFBC, - 0x8004, 0xEBA3, - 0x8005, 0xD5DF, - 0x8006, 0xEAC8, - 0x800B, 0xF1F3, - 0x800C, 0xB6F8, - 0x800D, 0xCBA3, - 0x8010, 0xC4CD, - 0x8012, 0xF1E7, - 0x8014, 0xF1E8, - 0x8015, 0xB8FB, - 0x8016, 0xF1E9, - 0x8017, 0xBAC4, - 0x8018, 0xD4C5, - 0x8019, 0xB0D2, - 0x801C, 0xF1EA, - 0x8020, 0xF1EB, - 0x8022, 0xF1EC, - 0x8025, 0xF1ED, - 0x8026, 0xF1EE, - 0x8027, 0xF1EF, - 0x8028, 0xF1F1, - 0x8029, 0xF1F0, - 0x802A, 0xC5D5, - 0x8031, 0xF1F2, - 0x8033, 0xB6FA, - 0x8035, 0xF1F4, - 0x8036, 0xD2AE, - 0x8037, 0xDEC7, - 0x8038, 0xCBCA, - 0x803B, 0xB3DC, - 0x803D, 0xB5A2, - 0x803F, 0xB9A2, - 0x8042, 0xC4F4, - 0x8043, 0xF1F5, - 0x8046, 0xF1F6, - 0x804A, 0xC1C4, - 0x804B, 0xC1FB, - 0x804C, 0xD6B0, - 0x804D, 0xF1F7, - 0x8052, 0xF1F8, - 0x8054, 0xC1AA, - 0x8058, 0xC6B8, - 0x805A, 0xBEDB, - 0x8069, 0xF1F9, - 0x806A, 0xB4CF, - 0x8071, 0xF1FA, - 0x807F, 0xEDB2, - 0x8080, 0xEDB1, - 0x8083, 0xCBE0, - 0x8084, 0xD2DE, - 0x8086, 0xCBC1, - 0x8087, 0xD5D8, - 0x8089, 0xC8E2, - 0x808B, 0xC0DF, - 0x808C, 0xBCA1, - 0x8093, 0xEBC1, - 0x8096, 0xD0A4, - 0x8098, 0xD6E2, - 0x809A, 0xB6C7, - 0x809B, 0xB8D8, - 0x809C, 0xEBC0, - 0x809D, 0xB8CE, - 0x809F, 0xEBBF, - 0x80A0, 0xB3A6, - 0x80A1, 0xB9C9, - 0x80A2, 0xD6AB, - 0x80A4, 0xB7F4, - 0x80A5, 0xB7CA, - 0x80A9, 0xBCE7, - 0x80AA, 0xB7BE, - 0x80AB, 0xEBC6, - 0x80AD, 0xEBC7, - 0x80AE, 0xB0B9, - 0x80AF, 0xBFCF, - 0x80B1, 0xEBC5, - 0x80B2, 0xD3FD, - 0x80B4, 0xEBC8, - 0x80B7, 0xEBC9, - 0x80BA, 0xB7CE, - 0x80BC, 0xEBC2, - 0x80BD, 0xEBC4, - 0x80BE, 0xC9F6, - 0x80BF, 0xD6D7, - 0x80C0, 0xD5CD, - 0x80C1, 0xD0B2, - 0x80C2, 0xEBCF, - 0x80C3, 0xCEB8, - 0x80C4, 0xEBD0, - 0x80C6, 0xB5A8, - 0x80CC, 0xB1B3, - 0x80CD, 0xEBD2, - 0x80CE, 0xCCA5, - 0x80D6, 0xC5D6, - 0x80D7, 0xEBD3, - 0x80D9, 0xEBD1, - 0x80DA, 0xC5DF, - 0x80DB, 0xEBCE, - 0x80DC, 0xCAA4, - 0x80DD, 0xEBD5, - 0x80DE, 0xB0FB, - 0x80E1, 0xBAFA, - 0x80E4, 0xD8B7, - 0x80E5, 0xF1E3, - 0x80E7, 0xEBCA, - 0x80E8, 0xEBCB, - 0x80E9, 0xEBCC, - 0x80EA, 0xEBCD, - 0x80EB, 0xEBD6, - 0x80EC, 0xE6C0, - 0x80ED, 0xEBD9, - 0x80EF, 0xBFE8, - 0x80F0, 0xD2C8, - 0x80F1, 0xEBD7, - 0x80F2, 0xEBDC, - 0x80F3, 0xB8EC, - 0x80F4, 0xEBD8, - 0x80F6, 0xBDBA, - 0x80F8, 0xD0D8, - 0x80FA, 0xB0B7, - 0x80FC, 0xEBDD, - 0x80FD, 0xC4DC, - 0x8102, 0xD6AC, - 0x8106, 0xB4E0, - 0x8109, 0xC2F6, - 0x810A, 0xBCB9, - 0x810D, 0xEBDA, - 0x810E, 0xEBDB, - 0x810F, 0xD4E0, - 0x8110, 0xC6EA, - 0x8111, 0xC4D4, - 0x8112, 0xEBDF, - 0x8113, 0xC5A7, - 0x8114, 0xD9F5, - 0x8116, 0xB2B1, - 0x8118, 0xEBE4, - 0x811A, 0xBDC5, - 0x811E, 0xEBE2, - 0x812C, 0xEBE3, - 0x812F, 0xB8AC, - 0x8131, 0xCDD1, - 0x8132, 0xEBE5, - 0x8136, 0xEBE1, - 0x8138, 0xC1B3, - 0x813E, 0xC6A2, - 0x8146, 0xCCF3, - 0x8148, 0xEBE6, - 0x814A, 0xC0B0, - 0x814B, 0xD2B8, - 0x814C, 0xEBE7, - 0x8150, 0xB8AF, - 0x8151, 0xB8AD, - 0x8153, 0xEBE8, - 0x8154, 0xC7BB, - 0x8155, 0xCDF3, - 0x8159, 0xEBEA, - 0x815A, 0xEBEB, - 0x8160, 0xEBED, - 0x8165, 0xD0C8, - 0x8167, 0xEBF2, - 0x8169, 0xEBEE, - 0x816D, 0xEBF1, - 0x816E, 0xC8F9, - 0x8170, 0xD1FC, - 0x8171, 0xEBEC, - 0x8174, 0xEBE9, - 0x8179, 0xB8B9, - 0x817A, 0xCFD9, - 0x817B, 0xC4E5, - 0x817C, 0xEBEF, - 0x817D, 0xEBF0, - 0x817E, 0xCCDA, - 0x817F, 0xCDC8, - 0x8180, 0xB0F2, - 0x8182, 0xEBF6, - 0x8188, 0xEBF5, - 0x818A, 0xB2B2, - 0x818F, 0xB8E0, - 0x8191, 0xEBF7, - 0x8198, 0xB1EC, - 0x819B, 0xCCC5, - 0x819C, 0xC4A4, - 0x819D, 0xCFA5, - 0x81A3, 0xEBF9, - 0x81A6, 0xECA2, - 0x81A8, 0xC5F2, - 0x81AA, 0xEBFA, - 0x81B3, 0xC9C5, - 0x81BA, 0xE2DF, - 0x81BB, 0xEBFE, - 0x81C0, 0xCDCE, - 0x81C1, 0xECA1, - 0x81C2, 0xB1DB, - 0x81C3, 0xD3B7, - 0x81C6, 0xD2DC, - 0x81CA, 0xEBFD, - 0x81CC, 0xEBFB, - 0x81E3, 0xB3BC, - 0x81E7, 0xEAB0, - 0x81EA, 0xD7D4, - 0x81EC, 0xF4AB, - 0x81ED, 0xB3F4, - 0x81F3, 0xD6C1, - 0x81F4, 0xD6C2, - 0x81FB, 0xD5E9, - 0x81FC, 0xBECA, - 0x81FE, 0xF4A7, - 0x8200, 0xD2A8, - 0x8201, 0xF4A8, - 0x8202, 0xF4A9, - 0x8204, 0xF4AA, - 0x8205, 0xBECB, - 0x8206, 0xD3DF, - 0x820C, 0xC9E0, - 0x820D, 0xC9E1, - 0x8210, 0xF3C2, - 0x8212, 0xCAE6, - 0x8214, 0xCCF2, - 0x821B, 0xE2B6, - 0x821C, 0xCBB4, - 0x821E, 0xCEE8, - 0x821F, 0xD6DB, - 0x8221, 0xF4AD, - 0x8222, 0xF4AE, - 0x8223, 0xF4AF, - 0x8228, 0xF4B2, - 0x822A, 0xBABD, - 0x822B, 0xF4B3, - 0x822C, 0xB0E3, - 0x822D, 0xF4B0, - 0x822F, 0xF4B1, - 0x8230, 0xBDA2, - 0x8231, 0xB2D5, - 0x8233, 0xF4B6, - 0x8234, 0xF4B7, - 0x8235, 0xB6E6, - 0x8236, 0xB2B0, - 0x8237, 0xCFCF, - 0x8238, 0xF4B4, - 0x8239, 0xB4AC, - 0x823B, 0xF4B5, - 0x823E, 0xF4B8, - 0x8244, 0xF4B9, - 0x8247, 0xCDA7, - 0x8249, 0xF4BA, - 0x824B, 0xF4BB, - 0x824F, 0xF4BC, - 0x8258, 0xCBD2, - 0x825A, 0xF4BD, - 0x825F, 0xF4BE, - 0x8268, 0xF4BF, - 0x826E, 0xF4DE, - 0x826F, 0xC1BC, - 0x8270, 0xBCE8, - 0x8272, 0xC9AB, - 0x8273, 0xD1DE, - 0x8274, 0xE5F5, - 0x8279, 0xDCB3, - 0x827A, 0xD2D5, - 0x827D, 0xDCB4, - 0x827E, 0xB0AC, - 0x827F, 0xDCB5, - 0x8282, 0xBDDA, - 0x8284, 0xDCB9, - 0x8288, 0xD8C2, - 0x828A, 0xDCB7, - 0x828B, 0xD3F3, - 0x828D, 0xC9D6, - 0x828E, 0xDCBA, - 0x828F, 0xDCB6, - 0x8291, 0xDCBB, - 0x8292, 0xC3A2, - 0x8297, 0xDCBC, - 0x8298, 0xDCC5, - 0x8299, 0xDCBD, - 0x829C, 0xCEDF, - 0x829D, 0xD6A5, - 0x829F, 0xDCCF, - 0x82A1, 0xDCCD, - 0x82A4, 0xDCD2, - 0x82A5, 0xBDE6, - 0x82A6, 0xC2AB, - 0x82A8, 0xDCB8, - 0x82A9, 0xDCCB, - 0x82AA, 0xDCCE, - 0x82AB, 0xDCBE, - 0x82AC, 0xB7D2, - 0x82AD, 0xB0C5, - 0x82AE, 0xDCC7, - 0x82AF, 0xD0BE, - 0x82B0, 0xDCC1, - 0x82B1, 0xBBA8, - 0x82B3, 0xB7BC, - 0x82B4, 0xDCCC, - 0x82B7, 0xDCC6, - 0x82B8, 0xDCBF, - 0x82B9, 0xC7DB, - 0x82BD, 0xD1BF, - 0x82BE, 0xDCC0, - 0x82C1, 0xDCCA, - 0x82C4, 0xDCD0, - 0x82C7, 0xCEAD, - 0x82C8, 0xDCC2, - 0x82CA, 0xDCC3, - 0x82CB, 0xDCC8, - 0x82CC, 0xDCC9, - 0x82CD, 0xB2D4, - 0x82CE, 0xDCD1, - 0x82CF, 0xCBD5, - 0x82D1, 0xD4B7, - 0x82D2, 0xDCDB, - 0x82D3, 0xDCDF, - 0x82D4, 0xCCA6, - 0x82D5, 0xDCE6, - 0x82D7, 0xC3E7, - 0x82D8, 0xDCDC, - 0x82DB, 0xBFC1, - 0x82DC, 0xDCD9, - 0x82DE, 0xB0FA, - 0x82DF, 0xB9B6, - 0x82E0, 0xDCE5, - 0x82E1, 0xDCD3, - 0x82E3, 0xDCC4, - 0x82E4, 0xDCD6, - 0x82E5, 0xC8F4, - 0x82E6, 0xBFE0, - 0x82EB, 0xC9BB, - 0x82EF, 0xB1BD, - 0x82F1, 0xD3A2, - 0x82F4, 0xDCDA, - 0x82F7, 0xDCD5, - 0x82F9, 0xC6BB, - 0x82FB, 0xDCDE, - 0x8301, 0xD7C2, - 0x8302, 0xC3AF, - 0x8303, 0xB7B6, - 0x8304, 0xC7D1, - 0x8305, 0xC3A9, - 0x8306, 0xDCE2, - 0x8307, 0xDCD8, - 0x8308, 0xDCEB, - 0x8309, 0xDCD4, - 0x830C, 0xDCDD, - 0x830E, 0xBEA5, - 0x830F, 0xDCD7, - 0x8311, 0xDCE0, - 0x8314, 0xDCE3, - 0x8315, 0xDCE4, - 0x8317, 0xDCF8, - 0x831A, 0xDCE1, - 0x831B, 0xDDA2, - 0x831C, 0xDCE7, - 0x8327, 0xBCEB, - 0x8328, 0xB4C4, - 0x832B, 0xC3A3, - 0x832C, 0xB2E7, - 0x832D, 0xDCFA, - 0x832F, 0xDCF2, - 0x8331, 0xDCEF, - 0x8333, 0xDCFC, - 0x8334, 0xDCEE, - 0x8335, 0xD2F0, - 0x8336, 0xB2E8, - 0x8338, 0xC8D7, - 0x8339, 0xC8E3, - 0x833A, 0xDCFB, - 0x833C, 0xDCED, - 0x8340, 0xDCF7, - 0x8343, 0xDCF5, - 0x8346, 0xBEA3, - 0x8347, 0xDCF4, - 0x8349, 0xB2DD, - 0x834F, 0xDCF3, - 0x8350, 0xBCF6, - 0x8351, 0xDCE8, - 0x8352, 0xBBC4, - 0x8354, 0xC0F3, - 0x835A, 0xBCD4, - 0x835B, 0xDCE9, - 0x835C, 0xDCEA, - 0x835E, 0xDCF1, - 0x835F, 0xDCF6, - 0x8360, 0xDCF9, - 0x8361, 0xB5B4, - 0x8363, 0xC8D9, - 0x8364, 0xBBE7, - 0x8365, 0xDCFE, - 0x8366, 0xDCFD, - 0x8367, 0xD3AB, - 0x8368, 0xDDA1, - 0x8369, 0xDDA3, - 0x836A, 0xDDA5, - 0x836B, 0xD2F1, - 0x836C, 0xDDA4, - 0x836D, 0xDDA6, - 0x836E, 0xDDA7, - 0x836F, 0xD2A9, - 0x8377, 0xBAC9, - 0x8378, 0xDDA9, - 0x837B, 0xDDB6, - 0x837C, 0xDDB1, - 0x837D, 0xDDB4, - 0x8385, 0xDDB0, - 0x8386, 0xC6CE, - 0x8389, 0xC0F2, - 0x838E, 0xC9AF, - 0x8392, 0xDCEC, - 0x8393, 0xDDAE, - 0x8398, 0xDDB7, - 0x839B, 0xDCF0, - 0x839C, 0xDDAF, - 0x839E, 0xDDB8, - 0x83A0, 0xDDAC, - 0x83A8, 0xDDB9, - 0x83A9, 0xDDB3, - 0x83AA, 0xDDAD, - 0x83AB, 0xC4AA, - 0x83B0, 0xDDA8, - 0x83B1, 0xC0B3, - 0x83B2, 0xC1AB, - 0x83B3, 0xDDAA, - 0x83B4, 0xDDAB, - 0x83B6, 0xDDB2, - 0x83B7, 0xBBF1, - 0x83B8, 0xDDB5, - 0x83B9, 0xD3A8, - 0x83BA, 0xDDBA, - 0x83BC, 0xDDBB, - 0x83BD, 0xC3A7, - 0x83C0, 0xDDD2, - 0x83C1, 0xDDBC, - 0x83C5, 0xDDD1, - 0x83C7, 0xB9BD, - 0x83CA, 0xBED5, - 0x83CC, 0xBEFA, - 0x83CF, 0xBACA, - 0x83D4, 0xDDCA, - 0x83D6, 0xDDC5, - 0x83D8, 0xDDBF, - 0x83DC, 0xB2CB, - 0x83DD, 0xDDC3, - 0x83DF, 0xDDCB, - 0x83E0, 0xB2A4, - 0x83E1, 0xDDD5, - 0x83E5, 0xDDBE, - 0x83E9, 0xC6D0, - 0x83EA, 0xDDD0, - 0x83F0, 0xDDD4, - 0x83F1, 0xC1E2, - 0x83F2, 0xB7C6, - 0x83F8, 0xDDCE, - 0x83F9, 0xDDCF, - 0x83FD, 0xDDC4, - 0x8401, 0xDDBD, - 0x8403, 0xDDCD, - 0x8404, 0xCCD1, - 0x8406, 0xDDC9, - 0x840B, 0xDDC2, - 0x840C, 0xC3C8, - 0x840D, 0xC6BC, - 0x840E, 0xCEAE, - 0x840F, 0xDDCC, - 0x8411, 0xDDC8, - 0x8418, 0xDDC1, - 0x841C, 0xDDC6, - 0x841D, 0xC2DC, - 0x8424, 0xD3A9, - 0x8425, 0xD3AA, - 0x8426, 0xDDD3, - 0x8427, 0xCFF4, - 0x8428, 0xC8F8, - 0x8431, 0xDDE6, - 0x8438, 0xDDC7, - 0x843C, 0xDDE0, - 0x843D, 0xC2E4, - 0x8446, 0xDDE1, - 0x8451, 0xDDD7, - 0x8457, 0xD6F8, - 0x8459, 0xDDD9, - 0x845A, 0xDDD8, - 0x845B, 0xB8F0, - 0x845C, 0xDDD6, - 0x8461, 0xC6CF, - 0x8463, 0xB6AD, - 0x8469, 0xDDE2, - 0x846B, 0xBAF9, - 0x846C, 0xD4E1, - 0x846D, 0xDDE7, - 0x8471, 0xB4D0, - 0x8473, 0xDDDA, - 0x8475, 0xBFFB, - 0x8476, 0xDDE3, - 0x8478, 0xDDDF, - 0x847A, 0xDDDD, - 0x8482, 0xB5D9, - 0x8487, 0xDDDB, - 0x8488, 0xDDDC, - 0x8489, 0xDDDE, - 0x848B, 0xBDAF, - 0x848C, 0xDDE4, - 0x848E, 0xDDE5, - 0x8497, 0xDDF5, - 0x8499, 0xC3C9, - 0x849C, 0xCBE2, - 0x84A1, 0xDDF2, - 0x84AF, 0xD8E1, - 0x84B2, 0xC6D1, - 0x84B4, 0xDDF4, - 0x84B8, 0xD5F4, - 0x84B9, 0xDDF3, - 0x84BA, 0xDDF0, - 0x84BD, 0xDDEC, - 0x84BF, 0xDDEF, - 0x84C1, 0xDDE8, - 0x84C4, 0xD0EE, - 0x84C9, 0xC8D8, - 0x84CA, 0xDDEE, - 0x84CD, 0xDDE9, - 0x84D0, 0xDDEA, - 0x84D1, 0xCBF2, - 0x84D3, 0xDDED, - 0x84D6, 0xB1CD, - 0x84DD, 0xC0B6, - 0x84DF, 0xBCBB, - 0x84E0, 0xDDF1, - 0x84E3, 0xDDF7, - 0x84E5, 0xDDF6, - 0x84E6, 0xDDEB, - 0x84EC, 0xC5EE, - 0x84F0, 0xDDFB, - 0x84FC, 0xDEA4, - 0x84FF, 0xDEA3, - 0x850C, 0xDDF8, - 0x8511, 0xC3EF, - 0x8513, 0xC2FB, - 0x8517, 0xD5E1, - 0x851A, 0xCEB5, - 0x851F, 0xDDFD, - 0x8521, 0xB2CC, - 0x852B, 0xC4E8, - 0x852C, 0xCADF, - 0x8537, 0xC7BE, - 0x8538, 0xDDFA, - 0x8539, 0xDDFC, - 0x853A, 0xDDFE, - 0x853B, 0xDEA2, - 0x853C, 0xB0AA, - 0x853D, 0xB1CE, - 0x8543, 0xDEAC, - 0x8548, 0xDEA6, - 0x8549, 0xBDB6, - 0x854A, 0xC8EF, - 0x8556, 0xDEA1, - 0x8559, 0xDEA5, - 0x855E, 0xDEA9, - 0x8564, 0xDEA8, - 0x8568, 0xDEA7, - 0x8572, 0xDEAD, - 0x8574, 0xD4CC, - 0x8579, 0xDEB3, - 0x857A, 0xDEAA, - 0x857B, 0xDEAE, - 0x857E, 0xC0D9, - 0x8584, 0xB1A1, - 0x8585, 0xDEB6, - 0x8587, 0xDEB1, - 0x858F, 0xDEB2, - 0x859B, 0xD1A6, - 0x859C, 0xDEB5, - 0x85A4, 0xDEAF, - 0x85A8, 0xDEB0, - 0x85AA, 0xD0BD, - 0x85AE, 0xDEB4, - 0x85AF, 0xCAED, - 0x85B0, 0xDEB9, - 0x85B7, 0xDEB8, - 0x85B9, 0xDEB7, - 0x85C1, 0xDEBB, - 0x85C9, 0xBDE5, - 0x85CF, 0xB2D8, - 0x85D0, 0xC3EA, - 0x85D3, 0xDEBA, - 0x85D5, 0xC5BA, - 0x85DC, 0xDEBC, - 0x85E4, 0xCCD9, - 0x85E9, 0xB7AA, - 0x85FB, 0xD4E5, - 0x85FF, 0xDEBD, - 0x8605, 0xDEBF, - 0x8611, 0xC4A2, - 0x8616, 0xDEC1, - 0x8627, 0xDEBE, - 0x8629, 0xDEC0, - 0x8638, 0xD5BA, - 0x863C, 0xDEC2, - 0x864D, 0xF2AE, - 0x864E, 0xBBA2, - 0x864F, 0xC2B2, - 0x8650, 0xC5B0, - 0x8651, 0xC2C7, - 0x8654, 0xF2AF, - 0x865A, 0xD0E9, - 0x865E, 0xD3DD, - 0x8662, 0xEBBD, - 0x866B, 0xB3E6, - 0x866C, 0xF2B0, - 0x866E, 0xF2B1, - 0x8671, 0xCAAD, - 0x8679, 0xBAE7, - 0x867A, 0xF2B3, - 0x867B, 0xF2B5, - 0x867C, 0xF2B4, - 0x867D, 0xCBE4, - 0x867E, 0xCFBA, - 0x867F, 0xF2B2, - 0x8680, 0xCAB4, - 0x8681, 0xD2CF, - 0x8682, 0xC2EC, - 0x868A, 0xCEC3, - 0x868B, 0xF2B8, - 0x868C, 0xB0F6, - 0x868D, 0xF2B7, - 0x8693, 0xF2BE, - 0x8695, 0xB2CF, - 0x869C, 0xD1C1, - 0x869D, 0xF2BA, - 0x86A3, 0xF2BC, - 0x86A4, 0xD4E9, - 0x86A7, 0xF2BB, - 0x86A8, 0xF2B6, - 0x86A9, 0xF2BF, - 0x86AA, 0xF2BD, - 0x86AC, 0xF2B9, - 0x86AF, 0xF2C7, - 0x86B0, 0xF2C4, - 0x86B1, 0xF2C6, - 0x86B4, 0xF2CA, - 0x86B5, 0xF2C2, - 0x86B6, 0xF2C0, - 0x86BA, 0xF2C5, - 0x86C0, 0xD6FB, - 0x86C4, 0xF2C1, - 0x86C6, 0xC7F9, - 0x86C7, 0xC9DF, - 0x86C9, 0xF2C8, - 0x86CA, 0xB9C6, - 0x86CB, 0xB5B0, - 0x86CE, 0xF2C3, - 0x86CF, 0xF2C9, - 0x86D0, 0xF2D0, - 0x86D1, 0xF2D6, - 0x86D4, 0xBBD7, - 0x86D8, 0xF2D5, - 0x86D9, 0xCDDC, - 0x86DB, 0xD6EB, - 0x86DE, 0xF2D2, - 0x86DF, 0xF2D4, - 0x86E4, 0xB8F2, - 0x86E9, 0xF2CB, - 0x86ED, 0xF2CE, - 0x86EE, 0xC2F9, - 0x86F0, 0xD5DD, - 0x86F1, 0xF2CC, - 0x86F2, 0xF2CD, - 0x86F3, 0xF2CF, - 0x86F4, 0xF2D3, - 0x86F8, 0xF2D9, - 0x86F9, 0xD3BC, - 0x86FE, 0xB6EA, - 0x8700, 0xCAF1, - 0x8702, 0xB7E4, - 0x8703, 0xF2D7, - 0x8707, 0xF2D8, - 0x8708, 0xF2DA, - 0x8709, 0xF2DD, - 0x870A, 0xF2DB, - 0x870D, 0xF2DC, - 0x8712, 0xD1D1, - 0x8713, 0xF2D1, - 0x8715, 0xCDC9, - 0x8717, 0xCECF, - 0x8718, 0xD6A9, - 0x871A, 0xF2E3, - 0x871C, 0xC3DB, - 0x871E, 0xF2E0, - 0x8721, 0xC0AF, - 0x8722, 0xF2EC, - 0x8723, 0xF2DE, - 0x8725, 0xF2E1, - 0x8729, 0xF2E8, - 0x872E, 0xF2E2, - 0x8731, 0xF2E7, - 0x8734, 0xF2E6, - 0x8737, 0xF2E9, - 0x873B, 0xF2DF, - 0x873E, 0xF2E4, - 0x873F, 0xF2EA, - 0x8747, 0xD3AC, - 0x8748, 0xF2E5, - 0x8749, 0xB2F5, - 0x874C, 0xF2F2, - 0x874E, 0xD0AB, - 0x8753, 0xF2F5, - 0x8757, 0xBBC8, - 0x8759, 0xF2F9, - 0x8760, 0xF2F0, - 0x8763, 0xF2F6, - 0x8764, 0xF2F8, - 0x8765, 0xF2FA, - 0x876E, 0xF2F3, - 0x8770, 0xF2F1, - 0x8774, 0xBAFB, - 0x8776, 0xB5FB, - 0x877B, 0xF2EF, - 0x877C, 0xF2F7, - 0x877D, 0xF2ED, - 0x877E, 0xF2EE, - 0x8782, 0xF2EB, - 0x8783, 0xF3A6, - 0x8785, 0xF3A3, - 0x8788, 0xF3A2, - 0x878B, 0xF2F4, - 0x878D, 0xC8DA, - 0x8793, 0xF2FB, - 0x8797, 0xF3A5, - 0x879F, 0xC3F8, - 0x87A8, 0xF2FD, - 0x87AB, 0xF3A7, - 0x87AC, 0xF3A9, - 0x87AD, 0xF3A4, - 0x87AF, 0xF2FC, - 0x87B3, 0xF3AB, - 0x87B5, 0xF3AA, - 0x87BA, 0xC2DD, - 0x87BD, 0xF3AE, - 0x87C0, 0xF3B0, - 0x87C6, 0xF3A1, - 0x87CA, 0xF3B1, - 0x87CB, 0xF3AC, - 0x87D1, 0xF3AF, - 0x87D2, 0xF2FE, - 0x87D3, 0xF3AD, - 0x87DB, 0xF3B2, - 0x87E0, 0xF3B4, - 0x87E5, 0xF3A8, - 0x87EA, 0xF3B3, - 0x87EE, 0xF3B5, - 0x87F9, 0xD0B7, - 0x87FE, 0xF3B8, - 0x8803, 0xD9F9, - 0x880A, 0xF3B9, - 0x8813, 0xF3B7, - 0x8815, 0xC8E4, - 0x8816, 0xF3B6, - 0x881B, 0xF3BA, - 0x8821, 0xF3BB, - 0x8822, 0xB4C0, - 0x8832, 0xEEC3, - 0x8839, 0xF3BC, - 0x883C, 0xF3BD, - 0x8840, 0xD1AA, - 0x8844, 0xF4AC, - 0x8845, 0xD0C6, - 0x884C, 0xD0D0, - 0x884D, 0xD1DC, - 0x8854, 0xCFCE, - 0x8857, 0xBDD6, - 0x8859, 0xD1C3, - 0x8861, 0xBAE2, - 0x8862, 0xE1E9, - 0x8863, 0xD2C2, - 0x8864, 0xF1C2, - 0x8865, 0xB2B9, - 0x8868, 0xB1ED, - 0x8869, 0xF1C3, - 0x886B, 0xC9C0, - 0x886C, 0xB3C4, - 0x886E, 0xD9F2, - 0x8870, 0xCBA5, - 0x8872, 0xF1C4, - 0x8877, 0xD6D4, - 0x887D, 0xF1C5, - 0x887E, 0xF4C0, - 0x887F, 0xF1C6, - 0x8881, 0xD4AC, - 0x8882, 0xF1C7, - 0x8884, 0xB0C0, - 0x8885, 0xF4C1, - 0x8888, 0xF4C2, - 0x888B, 0xB4FC, - 0x888D, 0xC5DB, - 0x8892, 0xCCBB, - 0x8896, 0xD0E4, - 0x889C, 0xCDE0, - 0x88A2, 0xF1C8, - 0x88A4, 0xD9F3, - 0x88AB, 0xB1BB, - 0x88AD, 0xCFAE, - 0x88B1, 0xB8A4, - 0x88B7, 0xF1CA, - 0x88BC, 0xF1CB, - 0x88C1, 0xB2C3, - 0x88C2, 0xC1D1, - 0x88C5, 0xD7B0, - 0x88C6, 0xF1C9, - 0x88C9, 0xF1CC, - 0x88CE, 0xF1CE, - 0x88D2, 0xD9F6, - 0x88D4, 0xD2E1, - 0x88D5, 0xD4A3, - 0x88D8, 0xF4C3, - 0x88D9, 0xC8B9, - 0x88DF, 0xF4C4, - 0x88E2, 0xF1CD, - 0x88E3, 0xF1CF, - 0x88E4, 0xBFE3, - 0x88E5, 0xF1D0, - 0x88E8, 0xF1D4, - 0x88F0, 0xF1D6, - 0x88F1, 0xF1D1, - 0x88F3, 0xC9D1, - 0x88F4, 0xC5E1, - 0x88F8, 0xC2E3, - 0x88F9, 0xB9FC, - 0x88FC, 0xF1D3, - 0x88FE, 0xF1D5, - 0x8902, 0xB9D3, - 0x890A, 0xF1DB, - 0x8910, 0xBAD6, - 0x8912, 0xB0FD, - 0x8913, 0xF1D9, - 0x8919, 0xF1D8, - 0x891A, 0xF1D2, - 0x891B, 0xF1DA, - 0x8921, 0xF1D7, - 0x8925, 0xC8EC, - 0x892A, 0xCDCA, - 0x892B, 0xF1DD, - 0x8930, 0xE5BD, - 0x8934, 0xF1DC, - 0x8936, 0xF1DE, - 0x8941, 0xF1DF, - 0x8944, 0xCFE5, - 0x895E, 0xF4C5, - 0x895F, 0xBDF3, - 0x8966, 0xF1E0, - 0x897B, 0xF1E1, - 0x897F, 0xCEF7, - 0x8981, 0xD2AA, - 0x8983, 0xF1FB, - 0x8986, 0xB8B2, - 0x89C1, 0xBCFB, - 0x89C2, 0xB9DB, - 0x89C4, 0xB9E6, - 0x89C5, 0xC3D9, - 0x89C6, 0xCAD3, - 0x89C7, 0xEAE8, - 0x89C8, 0xC0C0, - 0x89C9, 0xBEF5, - 0x89CA, 0xEAE9, - 0x89CB, 0xEAEA, - 0x89CC, 0xEAEB, - 0x89CE, 0xEAEC, - 0x89CF, 0xEAED, - 0x89D0, 0xEAEE, - 0x89D1, 0xEAEF, - 0x89D2, 0xBDC7, - 0x89D6, 0xF5FB, - 0x89DA, 0xF5FD, - 0x89DC, 0xF5FE, - 0x89DE, 0xF5FC, - 0x89E3, 0xBDE2, - 0x89E5, 0xF6A1, - 0x89E6, 0xB4A5, - 0x89EB, 0xF6A2, - 0x89EF, 0xF6A3, - 0x89F3, 0xECB2, - 0x8A00, 0xD1D4, - 0x8A07, 0xD9EA, - 0x8A3E, 0xF6A4, - 0x8A48, 0xEEBA, - 0x8A79, 0xD5B2, - 0x8A89, 0xD3FE, - 0x8A8A, 0xCCDC, - 0x8A93, 0xCAC4, - 0x8B07, 0xE5C0, - 0x8B26, 0xF6A5, - 0x8B66, 0xBEAF, - 0x8B6C, 0xC6A9, - 0x8BA0, 0xDAA5, - 0x8BA1, 0xBCC6, - 0x8BA2, 0xB6A9, - 0x8BA3, 0xB8BC, - 0x8BA4, 0xC8CF, - 0x8BA5, 0xBCA5, - 0x8BA6, 0xDAA6, - 0x8BA7, 0xDAA7, - 0x8BA8, 0xCCD6, - 0x8BA9, 0xC8C3, - 0x8BAA, 0xDAA8, - 0x8BAB, 0xC6FD, - 0x8BAD, 0xD1B5, - 0x8BAE, 0xD2E9, - 0x8BAF, 0xD1B6, - 0x8BB0, 0xBCC7, - 0x8BB2, 0xBDB2, - 0x8BB3, 0xBBE4, - 0x8BB4, 0xDAA9, - 0x8BB5, 0xDAAA, - 0x8BB6, 0xD1C8, - 0x8BB7, 0xDAAB, - 0x8BB8, 0xD0ED, - 0x8BB9, 0xB6EF, - 0x8BBA, 0xC2DB, - 0x8BBC, 0xCBCF, - 0x8BBD, 0xB7ED, - 0x8BBE, 0xC9E8, - 0x8BBF, 0xB7C3, - 0x8BC0, 0xBEF7, - 0x8BC1, 0xD6A4, - 0x8BC2, 0xDAAC, - 0x8BC3, 0xDAAD, - 0x8BC4, 0xC6C0, - 0x8BC5, 0xD7E7, - 0x8BC6, 0xCAB6, - 0x8BC8, 0xD5A9, - 0x8BC9, 0xCBDF, - 0x8BCA, 0xD5EF, - 0x8BCB, 0xDAAE, - 0x8BCC, 0xD6DF, - 0x8BCD, 0xB4CA, - 0x8BCE, 0xDAB0, - 0x8BCF, 0xDAAF, - 0x8BD1, 0xD2EB, - 0x8BD2, 0xDAB1, - 0x8BD3, 0xDAB2, - 0x8BD4, 0xDAB3, - 0x8BD5, 0xCAD4, - 0x8BD6, 0xDAB4, - 0x8BD7, 0xCAAB, - 0x8BD8, 0xDAB5, - 0x8BD9, 0xDAB6, - 0x8BDA, 0xB3CF, - 0x8BDB, 0xD6EF, - 0x8BDC, 0xDAB7, - 0x8BDD, 0xBBB0, - 0x8BDE, 0xB5AE, - 0x8BDF, 0xDAB8, - 0x8BE0, 0xDAB9, - 0x8BE1, 0xB9EE, - 0x8BE2, 0xD1AF, - 0x8BE3, 0xD2E8, - 0x8BE4, 0xDABA, - 0x8BE5, 0xB8C3, - 0x8BE6, 0xCFEA, - 0x8BE7, 0xB2EF, - 0x8BE8, 0xDABB, - 0x8BE9, 0xDABC, - 0x8BEB, 0xBDEB, - 0x8BEC, 0xCEDC, - 0x8BED, 0xD3EF, - 0x8BEE, 0xDABD, - 0x8BEF, 0xCEF3, - 0x8BF0, 0xDABE, - 0x8BF1, 0xD3D5, - 0x8BF2, 0xBBE5, - 0x8BF3, 0xDABF, - 0x8BF4, 0xCBB5, - 0x8BF5, 0xCBD0, - 0x8BF6, 0xDAC0, - 0x8BF7, 0xC7EB, - 0x8BF8, 0xD6EE, - 0x8BF9, 0xDAC1, - 0x8BFA, 0xC5B5, - 0x8BFB, 0xB6C1, - 0x8BFC, 0xDAC2, - 0x8BFD, 0xB7CC, - 0x8BFE, 0xBFCE, - 0x8BFF, 0xDAC3, - 0x8C00, 0xDAC4, - 0x8C01, 0xCBAD, - 0x8C02, 0xDAC5, - 0x8C03, 0xB5F7, - 0x8C04, 0xDAC6, - 0x8C05, 0xC1C2, - 0x8C06, 0xD7BB, - 0x8C07, 0xDAC7, - 0x8C08, 0xCCB8, - 0x8C0A, 0xD2EA, - 0x8C0B, 0xC4B1, - 0x8C0C, 0xDAC8, - 0x8C0D, 0xB5FD, - 0x8C0E, 0xBBD1, - 0x8C0F, 0xDAC9, - 0x8C10, 0xD0B3, - 0x8C11, 0xDACA, - 0x8C12, 0xDACB, - 0x8C13, 0xCEBD, - 0x8C14, 0xDACC, - 0x8C15, 0xDACD, - 0x8C16, 0xDACE, - 0x8C17, 0xB2F7, - 0x8C18, 0xDAD1, - 0x8C19, 0xDACF, - 0x8C1A, 0xD1E8, - 0x8C1B, 0xDAD0, - 0x8C1C, 0xC3D5, - 0x8C1D, 0xDAD2, - 0x8C1F, 0xDAD3, - 0x8C20, 0xDAD4, - 0x8C21, 0xDAD5, - 0x8C22, 0xD0BB, - 0x8C23, 0xD2A5, - 0x8C24, 0xB0F9, - 0x8C25, 0xDAD6, - 0x8C26, 0xC7AB, - 0x8C27, 0xDAD7, - 0x8C28, 0xBDF7, - 0x8C29, 0xC3A1, - 0x8C2A, 0xDAD8, - 0x8C2B, 0xDAD9, - 0x8C2C, 0xC3FD, - 0x8C2D, 0xCCB7, - 0x8C2E, 0xDADA, - 0x8C2F, 0xDADB, - 0x8C30, 0xC0BE, - 0x8C31, 0xC6D7, - 0x8C32, 0xDADC, - 0x8C33, 0xDADD, - 0x8C34, 0xC7B4, - 0x8C35, 0xDADE, - 0x8C36, 0xDADF, - 0x8C37, 0xB9C8, - 0x8C41, 0xBBED, - 0x8C46, 0xB6B9, - 0x8C47, 0xF4F8, - 0x8C49, 0xF4F9, - 0x8C4C, 0xCDE3, - 0x8C55, 0xF5B9, - 0x8C5A, 0xEBE0, - 0x8C61, 0xCFF3, - 0x8C62, 0xBBBF, - 0x8C6A, 0xBAC0, - 0x8C6B, 0xD4A5, - 0x8C73, 0xE1D9, - 0x8C78, 0xF5F4, - 0x8C79, 0xB1AA, - 0x8C7A, 0xB2F2, - 0x8C82, 0xF5F5, - 0x8C85, 0xF5F7, - 0x8C89, 0xBAD1, - 0x8C8A, 0xF5F6, - 0x8C8C, 0xC3B2, - 0x8C94, 0xF5F9, - 0x8C98, 0xF5F8, - 0x8D1D, 0xB1B4, - 0x8D1E, 0xD5EA, - 0x8D1F, 0xB8BA, - 0x8D21, 0xB9B1, - 0x8D22, 0xB2C6, - 0x8D23, 0xD4F0, - 0x8D24, 0xCFCD, - 0x8D25, 0xB0DC, - 0x8D26, 0xD5CB, - 0x8D27, 0xBBF5, - 0x8D28, 0xD6CA, - 0x8D29, 0xB7B7, - 0x8D2A, 0xCCB0, - 0x8D2B, 0xC6B6, - 0x8D2C, 0xB1E1, - 0x8D2D, 0xB9BA, - 0x8D2E, 0xD6FC, - 0x8D2F, 0xB9E1, - 0x8D30, 0xB7A1, - 0x8D31, 0xBCFA, - 0x8D32, 0xEADA, - 0x8D33, 0xEADB, - 0x8D34, 0xCCF9, - 0x8D35, 0xB9F3, - 0x8D36, 0xEADC, - 0x8D37, 0xB4FB, - 0x8D38, 0xC3B3, - 0x8D39, 0xB7D1, - 0x8D3A, 0xBAD8, - 0x8D3B, 0xEADD, - 0x8D3C, 0xD4F4, - 0x8D3D, 0xEADE, - 0x8D3E, 0xBCD6, - 0x8D3F, 0xBBDF, - 0x8D40, 0xEADF, - 0x8D41, 0xC1DE, - 0x8D42, 0xC2B8, - 0x8D43, 0xD4DF, - 0x8D44, 0xD7CA, - 0x8D45, 0xEAE0, - 0x8D46, 0xEAE1, - 0x8D47, 0xEAE4, - 0x8D48, 0xEAE2, - 0x8D49, 0xEAE3, - 0x8D4A, 0xC9DE, - 0x8D4B, 0xB8B3, - 0x8D4C, 0xB6C4, - 0x8D4D, 0xEAE5, - 0x8D4E, 0xCAEA, - 0x8D4F, 0xC9CD, - 0x8D50, 0xB4CD, - 0x8D53, 0xE2D9, - 0x8D54, 0xC5E2, - 0x8D55, 0xEAE6, - 0x8D56, 0xC0B5, - 0x8D58, 0xD7B8, - 0x8D59, 0xEAE7, - 0x8D5A, 0xD7AC, - 0x8D5B, 0xC8FC, - 0x8D5C, 0xD8D3, - 0x8D5D, 0xD8CD, - 0x8D5E, 0xD4DE, - 0x8D60, 0xD4F9, - 0x8D61, 0xC9C4, - 0x8D62, 0xD3AE, - 0x8D63, 0xB8D3, - 0x8D64, 0xB3E0, - 0x8D66, 0xC9E2, - 0x8D67, 0xF4F6, - 0x8D6B, 0xBAD5, - 0x8D6D, 0xF4F7, - 0x8D70, 0xD7DF, - 0x8D73, 0xF4F1, - 0x8D74, 0xB8B0, - 0x8D75, 0xD5D4, - 0x8D76, 0xB8CF, - 0x8D77, 0xC6F0, - 0x8D81, 0xB3C3, - 0x8D84, 0xF4F2, - 0x8D85, 0xB3AC, - 0x8D8A, 0xD4BD, - 0x8D8B, 0xC7F7, - 0x8D91, 0xF4F4, - 0x8D94, 0xF4F3, - 0x8D9F, 0xCCCB, - 0x8DA3, 0xC8A4, - 0x8DB1, 0xF4F5, - 0x8DB3, 0xD7E3, - 0x8DB4, 0xC5BF, - 0x8DB5, 0xF5C0, - 0x8DB8, 0xF5BB, - 0x8DBA, 0xF5C3, - 0x8DBC, 0xF5C2, - 0x8DBE, 0xD6BA, - 0x8DBF, 0xF5C1, - 0x8DC3, 0xD4BE, - 0x8DC4, 0xF5C4, - 0x8DC6, 0xF5CC, - 0x8DCB, 0xB0CF, - 0x8DCC, 0xB5F8, - 0x8DCE, 0xF5C9, - 0x8DCF, 0xF5CA, - 0x8DD1, 0xC5DC, - 0x8DD6, 0xF5C5, - 0x8DD7, 0xF5C6, - 0x8DDA, 0xF5C7, - 0x8DDB, 0xF5CB, - 0x8DDD, 0xBEE0, - 0x8DDE, 0xF5C8, - 0x8DDF, 0xB8FA, - 0x8DE3, 0xF5D0, - 0x8DE4, 0xF5D3, - 0x8DE8, 0xBFE7, - 0x8DEA, 0xB9F2, - 0x8DEB, 0xF5BC, - 0x8DEC, 0xF5CD, - 0x8DEF, 0xC2B7, - 0x8DF3, 0xCCF8, - 0x8DF5, 0xBCF9, - 0x8DF7, 0xF5CE, - 0x8DF8, 0xF5CF, - 0x8DF9, 0xF5D1, - 0x8DFA, 0xB6E5, - 0x8DFB, 0xF5D2, - 0x8DFD, 0xF5D5, - 0x8E05, 0xF5BD, - 0x8E09, 0xF5D4, - 0x8E0A, 0xD3BB, - 0x8E0C, 0xB3EC, - 0x8E0F, 0xCCA4, - 0x8E14, 0xF5D6, - 0x8E1D, 0xF5D7, - 0x8E1E, 0xBEE1, - 0x8E1F, 0xF5D8, - 0x8E22, 0xCCDF, - 0x8E23, 0xF5DB, - 0x8E29, 0xB2C8, - 0x8E2A, 0xD7D9, - 0x8E2C, 0xF5D9, - 0x8E2E, 0xF5DA, - 0x8E2F, 0xF5DC, - 0x8E31, 0xF5E2, - 0x8E35, 0xF5E0, - 0x8E39, 0xF5DF, - 0x8E3A, 0xF5DD, - 0x8E3D, 0xF5E1, - 0x8E40, 0xF5DE, - 0x8E41, 0xF5E4, - 0x8E42, 0xF5E5, - 0x8E44, 0xCCE3, - 0x8E47, 0xE5BF, - 0x8E48, 0xB5B8, - 0x8E49, 0xF5E3, - 0x8E4A, 0xF5E8, - 0x8E4B, 0xCCA3, - 0x8E51, 0xF5E6, - 0x8E52, 0xF5E7, - 0x8E59, 0xF5BE, - 0x8E66, 0xB1C4, - 0x8E69, 0xF5BF, - 0x8E6C, 0xB5C5, - 0x8E6D, 0xB2E4, - 0x8E6F, 0xF5EC, - 0x8E70, 0xF5E9, - 0x8E72, 0xB6D7, - 0x8E74, 0xF5ED, - 0x8E76, 0xF5EA, - 0x8E7C, 0xF5EB, - 0x8E7F, 0xB4DA, - 0x8E81, 0xD4EA, - 0x8E85, 0xF5EE, - 0x8E87, 0xB3F9, - 0x8E8F, 0xF5EF, - 0x8E90, 0xF5F1, - 0x8E94, 0xF5F0, - 0x8E9C, 0xF5F2, - 0x8E9E, 0xF5F3, - 0x8EAB, 0xC9ED, - 0x8EAC, 0xB9AA, - 0x8EAF, 0xC7FB, - 0x8EB2, 0xB6E3, - 0x8EBA, 0xCCC9, - 0x8ECE, 0xEAA6, - 0x8F66, 0xB3B5, - 0x8F67, 0xD4FE, - 0x8F68, 0xB9EC, - 0x8F69, 0xD0F9, - 0x8F6B, 0xE9ED, - 0x8F6C, 0xD7AA, - 0x8F6D, 0xE9EE, - 0x8F6E, 0xC2D6, - 0x8F6F, 0xC8ED, - 0x8F70, 0xBAE4, - 0x8F71, 0xE9EF, - 0x8F72, 0xE9F0, - 0x8F73, 0xE9F1, - 0x8F74, 0xD6E1, - 0x8F75, 0xE9F2, - 0x8F76, 0xE9F3, - 0x8F77, 0xE9F5, - 0x8F78, 0xE9F4, - 0x8F79, 0xE9F6, - 0x8F7A, 0xE9F7, - 0x8F7B, 0xC7E1, - 0x8F7C, 0xE9F8, - 0x8F7D, 0xD4D8, - 0x8F7E, 0xE9F9, - 0x8F7F, 0xBDCE, - 0x8F81, 0xE9FA, - 0x8F82, 0xE9FB, - 0x8F83, 0xBDCF, - 0x8F84, 0xE9FC, - 0x8F85, 0xB8A8, - 0x8F86, 0xC1BE, - 0x8F87, 0xE9FD, - 0x8F88, 0xB1B2, - 0x8F89, 0xBBD4, - 0x8F8A, 0xB9F5, - 0x8F8B, 0xE9FE, - 0x8F8D, 0xEAA1, - 0x8F8E, 0xEAA2, - 0x8F8F, 0xEAA3, - 0x8F90, 0xB7F8, - 0x8F91, 0xBCAD, - 0x8F93, 0xCAE4, - 0x8F94, 0xE0CE, - 0x8F95, 0xD4AF, - 0x8F96, 0xCFBD, - 0x8F97, 0xD5B7, - 0x8F98, 0xEAA4, - 0x8F99, 0xD5DE, - 0x8F9A, 0xEAA5, - 0x8F9B, 0xD0C1, - 0x8F9C, 0xB9BC, - 0x8F9E, 0xB4C7, - 0x8F9F, 0xB1D9, - 0x8FA3, 0xC0B1, - 0x8FA8, 0xB1E6, - 0x8FA9, 0xB1E7, - 0x8FAB, 0xB1E8, - 0x8FB0, 0xB3BD, - 0x8FB1, 0xC8E8, - 0x8FB6, 0xE5C1, - 0x8FB9, 0xB1DF, - 0x8FBD, 0xC1C9, - 0x8FBE, 0xB4EF, - 0x8FC1, 0xC7A8, - 0x8FC2, 0xD3D8, - 0x8FC4, 0xC6F9, - 0x8FC5, 0xD1B8, - 0x8FC7, 0xB9FD, - 0x8FC8, 0xC2F5, - 0x8FCE, 0xD3AD, - 0x8FD0, 0xD4CB, - 0x8FD1, 0xBDFC, - 0x8FD3, 0xE5C2, - 0x8FD4, 0xB7B5, - 0x8FD5, 0xE5C3, - 0x8FD8, 0xBBB9, - 0x8FD9, 0xD5E2, - 0x8FDB, 0xBDF8, - 0x8FDC, 0xD4B6, - 0x8FDD, 0xCEA5, - 0x8FDE, 0xC1AC, - 0x8FDF, 0xB3D9, - 0x8FE2, 0xCCF6, - 0x8FE4, 0xE5C6, - 0x8FE5, 0xE5C4, - 0x8FE6, 0xE5C8, - 0x8FE8, 0xE5CA, - 0x8FE9, 0xE5C7, - 0x8FEA, 0xB5CF, - 0x8FEB, 0xC6C8, - 0x8FED, 0xB5FC, - 0x8FEE, 0xE5C5, - 0x8FF0, 0xCAF6, - 0x8FF3, 0xE5C9, - 0x8FF7, 0xC3D4, - 0x8FF8, 0xB1C5, - 0x8FF9, 0xBCA3, - 0x8FFD, 0xD7B7, - 0x9000, 0xCDCB, - 0x9001, 0xCBCD, - 0x9002, 0xCACA, - 0x9003, 0xCCD3, - 0x9004, 0xE5CC, - 0x9005, 0xE5CB, - 0x9006, 0xC4E6, - 0x9009, 0xD1A1, - 0x900A, 0xD1B7, - 0x900B, 0xE5CD, - 0x900D, 0xE5D0, - 0x900F, 0xCDB8, - 0x9010, 0xD6F0, - 0x9011, 0xE5CF, - 0x9012, 0xB5DD, - 0x9014, 0xCDBE, - 0x9016, 0xE5D1, - 0x9017, 0xB6BA, - 0x901A, 0xCDA8, - 0x901B, 0xB9E4, - 0x901D, 0xCAC5, - 0x901E, 0xB3D1, - 0x901F, 0xCBD9, - 0x9020, 0xD4EC, - 0x9021, 0xE5D2, - 0x9022, 0xB7EA, - 0x9026, 0xE5CE, - 0x902D, 0xE5D5, - 0x902E, 0xB4FE, - 0x902F, 0xE5D6, - 0x9035, 0xE5D3, - 0x9036, 0xE5D4, - 0x9038, 0xD2DD, - 0x903B, 0xC2DF, - 0x903C, 0xB1C6, - 0x903E, 0xD3E2, - 0x9041, 0xB6DD, - 0x9042, 0xCBEC, - 0x9044, 0xE5D7, - 0x9047, 0xD3F6, - 0x904D, 0xB1E9, - 0x904F, 0xB6F4, - 0x9050, 0xE5DA, - 0x9051, 0xE5D8, - 0x9052, 0xE5D9, - 0x9053, 0xB5C0, - 0x9057, 0xD2C5, - 0x9058, 0xE5DC, - 0x905B, 0xE5DE, - 0x9062, 0xE5DD, - 0x9063, 0xC7B2, - 0x9065, 0xD2A3, - 0x9068, 0xE5DB, - 0x906D, 0xD4E2, - 0x906E, 0xD5DA, - 0x9074, 0xE5E0, - 0x9075, 0xD7F1, - 0x907D, 0xE5E1, - 0x907F, 0xB1DC, - 0x9080, 0xD1FB, - 0x9082, 0xE5E2, - 0x9083, 0xE5E4, - 0x9088, 0xE5E3, - 0x908B, 0xE5E5, - 0x9091, 0xD2D8, - 0x9093, 0xB5CB, - 0x9095, 0xE7DF, - 0x9097, 0xDAF5, - 0x9099, 0xDAF8, - 0x909B, 0xDAF6, - 0x909D, 0xDAF7, - 0x90A1, 0xDAFA, - 0x90A2, 0xD0CF, - 0x90A3, 0xC4C7, - 0x90A6, 0xB0EE, - 0x90AA, 0xD0B0, - 0x90AC, 0xDAF9, - 0x90AE, 0xD3CA, - 0x90AF, 0xBAAA, - 0x90B0, 0xDBA2, - 0x90B1, 0xC7F1, - 0x90B3, 0xDAFC, - 0x90B4, 0xDAFB, - 0x90B5, 0xC9DB, - 0x90B6, 0xDAFD, - 0x90B8, 0xDBA1, - 0x90B9, 0xD7DE, - 0x90BA, 0xDAFE, - 0x90BB, 0xC1DA, - 0x90BE, 0xDBA5, - 0x90C1, 0xD3F4, - 0x90C4, 0xDBA7, - 0x90C5, 0xDBA4, - 0x90C7, 0xDBA8, - 0x90CA, 0xBDBC, - 0x90CE, 0xC0C9, - 0x90CF, 0xDBA3, - 0x90D0, 0xDBA6, - 0x90D1, 0xD6A3, - 0x90D3, 0xDBA9, - 0x90D7, 0xDBAD, - 0x90DB, 0xDBAE, - 0x90DC, 0xDBAC, - 0x90DD, 0xBAC2, - 0x90E1, 0xBFA4, - 0x90E2, 0xDBAB, - 0x90E6, 0xDBAA, - 0x90E7, 0xD4C7, - 0x90E8, 0xB2BF, - 0x90EB, 0xDBAF, - 0x90ED, 0xB9F9, - 0x90EF, 0xDBB0, - 0x90F4, 0xB3BB, - 0x90F8, 0xB5A6, - 0x90FD, 0xB6BC, - 0x90FE, 0xDBB1, - 0x9102, 0xB6F5, - 0x9104, 0xDBB2, - 0x9119, 0xB1C9, - 0x911E, 0xDBB4, - 0x9122, 0xDBB3, - 0x9123, 0xDBB5, - 0x912F, 0xDBB7, - 0x9131, 0xDBB6, - 0x9139, 0xDBB8, - 0x9143, 0xDBB9, - 0x9146, 0xDBBA, - 0x9149, 0xD3CF, - 0x914A, 0xF4FA, - 0x914B, 0xC7F5, - 0x914C, 0xD7C3, - 0x914D, 0xC5E4, - 0x914E, 0xF4FC, - 0x914F, 0xF4FD, - 0x9150, 0xF4FB, - 0x9152, 0xBEC6, - 0x9157, 0xD0EF, - 0x915A, 0xB7D3, - 0x915D, 0xD4CD, - 0x915E, 0xCCAA, - 0x9161, 0xF5A2, - 0x9162, 0xF5A1, - 0x9163, 0xBAA8, - 0x9164, 0xF4FE, - 0x9165, 0xCBD6, - 0x9169, 0xF5A4, - 0x916A, 0xC0D2, - 0x916C, 0xB3EA, - 0x916E, 0xCDAA, - 0x916F, 0xF5A5, - 0x9170, 0xF5A3, - 0x9171, 0xBDB4, - 0x9172, 0xF5A8, - 0x9174, 0xF5A9, - 0x9175, 0xBDCD, - 0x9176, 0xC3B8, - 0x9177, 0xBFE1, - 0x9178, 0xCBE1, - 0x9179, 0xF5AA, - 0x917D, 0xF5A6, - 0x917E, 0xF5A7, - 0x917F, 0xC4F0, - 0x9185, 0xF5AC, - 0x9187, 0xB4BC, - 0x9189, 0xD7ED, - 0x918B, 0xB4D7, - 0x918C, 0xF5AB, - 0x918D, 0xF5AE, - 0x9190, 0xF5AD, - 0x9191, 0xF5AF, - 0x9192, 0xD0D1, - 0x919A, 0xC3D1, - 0x919B, 0xC8A9, - 0x91A2, 0xF5B0, - 0x91A3, 0xF5B1, - 0x91AA, 0xF5B2, - 0x91AD, 0xF5B3, - 0x91AE, 0xF5B4, - 0x91AF, 0xF5B5, - 0x91B4, 0xF5B7, - 0x91B5, 0xF5B6, - 0x91BA, 0xF5B8, - 0x91C7, 0xB2C9, - 0x91C9, 0xD3D4, - 0x91CA, 0xCACD, - 0x91CC, 0xC0EF, - 0x91CD, 0xD6D8, - 0x91CE, 0xD2B0, - 0x91CF, 0xC1BF, - 0x91D1, 0xBDF0, - 0x91DC, 0xB8AA, - 0x9274, 0xBCF8, - 0x928E, 0xF6C6, - 0x92AE, 0xF6C7, - 0x92C8, 0xF6C8, - 0x933E, 0xF6C9, - 0x936A, 0xF6CA, - 0x938F, 0xF6CC, - 0x93CA, 0xF6CB, - 0x93D6, 0xF7E9, - 0x943E, 0xF6CD, - 0x946B, 0xF6CE, - 0x9485, 0xEEC4, - 0x9486, 0xEEC5, - 0x9487, 0xEEC6, - 0x9488, 0xD5EB, - 0x9489, 0xB6A4, - 0x948A, 0xEEC8, - 0x948B, 0xEEC7, - 0x948C, 0xEEC9, - 0x948D, 0xEECA, - 0x948E, 0xC7A5, - 0x948F, 0xEECB, - 0x9490, 0xEECC, - 0x9492, 0xB7B0, - 0x9493, 0xB5F6, - 0x9494, 0xEECD, - 0x9495, 0xEECF, - 0x9497, 0xEECE, - 0x9499, 0xB8C6, - 0x949A, 0xEED0, - 0x949B, 0xEED1, - 0x949C, 0xEED2, - 0x949D, 0xB6DB, - 0x949E, 0xB3AE, - 0x949F, 0xD6D3, - 0x94A0, 0xC4C6, - 0x94A1, 0xB1B5, - 0x94A2, 0xB8D6, - 0x94A3, 0xEED3, - 0x94A4, 0xEED4, - 0x94A5, 0xD4BF, - 0x94A6, 0xC7D5, - 0x94A7, 0xBEFB, - 0x94A8, 0xCED9, - 0x94A9, 0xB9B3, - 0x94AA, 0xEED6, - 0x94AB, 0xEED5, - 0x94AC, 0xEED8, - 0x94AD, 0xEED7, - 0x94AE, 0xC5A5, - 0x94AF, 0xEED9, - 0x94B0, 0xEEDA, - 0x94B1, 0xC7AE, - 0x94B2, 0xEEDB, - 0x94B3, 0xC7AF, - 0x94B4, 0xEEDC, - 0x94B5, 0xB2A7, - 0x94B6, 0xEEDD, - 0x94B7, 0xEEDE, - 0x94B8, 0xEEDF, - 0x94B9, 0xEEE0, - 0x94BA, 0xEEE1, - 0x94BB, 0xD7EA, - 0x94BC, 0xEEE2, - 0x94BD, 0xEEE3, - 0x94BE, 0xBCD8, - 0x94BF, 0xEEE4, - 0x94C0, 0xD3CB, - 0x94C1, 0xCCFA, - 0x94C2, 0xB2AC, - 0x94C3, 0xC1E5, - 0x94C4, 0xEEE5, - 0x94C5, 0xC7A6, - 0x94C6, 0xC3AD, - 0x94C8, 0xEEE6, - 0x94C9, 0xEEE7, - 0x94CA, 0xEEE8, - 0x94CB, 0xEEE9, - 0x94CC, 0xEEEA, - 0x94CD, 0xEEEB, - 0x94CE, 0xEEEC, - 0x94D0, 0xEEED, - 0x94D1, 0xEEEE, - 0x94D2, 0xEEEF, - 0x94D5, 0xEEF0, - 0x94D6, 0xEEF1, - 0x94D7, 0xEEF2, - 0x94D8, 0xEEF4, - 0x94D9, 0xEEF3, - 0x94DB, 0xEEF5, - 0x94DC, 0xCDAD, - 0x94DD, 0xC2C1, - 0x94DE, 0xEEF6, - 0x94DF, 0xEEF7, - 0x94E0, 0xEEF8, - 0x94E1, 0xD5A1, - 0x94E2, 0xEEF9, - 0x94E3, 0xCFB3, - 0x94E4, 0xEEFA, - 0x94E5, 0xEEFB, - 0x94E7, 0xEEFC, - 0x94E8, 0xEEFD, - 0x94E9, 0xEFA1, - 0x94EA, 0xEEFE, - 0x94EB, 0xEFA2, - 0x94EC, 0xB8F5, - 0x94ED, 0xC3FA, - 0x94EE, 0xEFA3, - 0x94EF, 0xEFA4, - 0x94F0, 0xBDC2, - 0x94F1, 0xD2BF, - 0x94F2, 0xB2F9, - 0x94F3, 0xEFA5, - 0x94F4, 0xEFA6, - 0x94F5, 0xEFA7, - 0x94F6, 0xD2F8, - 0x94F7, 0xEFA8, - 0x94F8, 0xD6FD, - 0x94F9, 0xEFA9, - 0x94FA, 0xC6CC, - 0x94FC, 0xEFAA, - 0x94FD, 0xEFAB, - 0x94FE, 0xC1B4, - 0x94FF, 0xEFAC, - 0x9500, 0xCFFA, - 0x9501, 0xCBF8, - 0x9502, 0xEFAE, - 0x9503, 0xEFAD, - 0x9504, 0xB3FA, - 0x9505, 0xB9F8, - 0x9506, 0xEFAF, - 0x9507, 0xEFB0, - 0x9508, 0xD0E2, - 0x9509, 0xEFB1, - 0x950A, 0xEFB2, - 0x950B, 0xB7E6, - 0x950C, 0xD0BF, - 0x950D, 0xEFB3, - 0x950E, 0xEFB4, - 0x950F, 0xEFB5, - 0x9510, 0xC8F1, - 0x9511, 0xCCE0, - 0x9512, 0xEFB6, - 0x9513, 0xEFB7, - 0x9514, 0xEFB8, - 0x9515, 0xEFB9, - 0x9516, 0xEFBA, - 0x9517, 0xD5E0, - 0x9518, 0xEFBB, - 0x9519, 0xB4ED, - 0x951A, 0xC3AA, - 0x951B, 0xEFBC, - 0x951D, 0xEFBD, - 0x951E, 0xEFBE, - 0x951F, 0xEFBF, - 0x9521, 0xCEFD, - 0x9522, 0xEFC0, - 0x9523, 0xC2E0, - 0x9524, 0xB4B8, - 0x9525, 0xD7B6, - 0x9526, 0xBDF5, - 0x9528, 0xCFC7, - 0x9529, 0xEFC3, - 0x952A, 0xEFC1, - 0x952B, 0xEFC2, - 0x952C, 0xEFC4, - 0x952D, 0xB6A7, - 0x952E, 0xBCFC, - 0x952F, 0xBEE2, - 0x9530, 0xC3CC, - 0x9531, 0xEFC5, - 0x9532, 0xEFC6, - 0x9534, 0xEFC7, - 0x9535, 0xEFCF, - 0x9536, 0xEFC8, - 0x9537, 0xEFC9, - 0x9538, 0xEFCA, - 0x9539, 0xC7C2, - 0x953A, 0xEFF1, - 0x953B, 0xB6CD, - 0x953C, 0xEFCB, - 0x953E, 0xEFCC, - 0x953F, 0xEFCD, - 0x9540, 0xB6C6, - 0x9541, 0xC3BE, - 0x9542, 0xEFCE, - 0x9544, 0xEFD0, - 0x9545, 0xEFD1, - 0x9546, 0xEFD2, - 0x9547, 0xD5F2, - 0x9549, 0xEFD3, - 0x954A, 0xC4F7, - 0x954C, 0xEFD4, - 0x954D, 0xC4F8, - 0x954E, 0xEFD5, - 0x954F, 0xEFD6, - 0x9550, 0xB8E4, - 0x9551, 0xB0F7, - 0x9552, 0xEFD7, - 0x9553, 0xEFD8, - 0x9554, 0xEFD9, - 0x9556, 0xEFDA, - 0x9557, 0xEFDB, - 0x9558, 0xEFDC, - 0x9559, 0xEFDD, - 0x955B, 0xEFDE, - 0x955C, 0xBEB5, - 0x955D, 0xEFE1, - 0x955E, 0xEFDF, - 0x955F, 0xEFE0, - 0x9561, 0xEFE2, - 0x9562, 0xEFE3, - 0x9563, 0xC1CD, - 0x9564, 0xEFE4, - 0x9565, 0xEFE5, - 0x9566, 0xEFE6, - 0x9567, 0xEFE7, - 0x9568, 0xEFE8, - 0x9569, 0xEFE9, - 0x956A, 0xEFEA, - 0x956B, 0xEFEB, - 0x956C, 0xEFEC, - 0x956D, 0xC0D8, - 0x956F, 0xEFED, - 0x9570, 0xC1AD, - 0x9571, 0xEFEE, - 0x9572, 0xEFEF, - 0x9573, 0xEFF0, - 0x9576, 0xCFE2, - 0x957F, 0xB3A4, - 0x95E8, 0xC3C5, - 0x95E9, 0xE3C5, - 0x95EA, 0xC9C1, - 0x95EB, 0xE3C6, - 0x95ED, 0xB1D5, - 0x95EE, 0xCECA, - 0x95EF, 0xB4B3, - 0x95F0, 0xC8F2, - 0x95F1, 0xE3C7, - 0x95F2, 0xCFD0, - 0x95F3, 0xE3C8, - 0x95F4, 0xBCE4, - 0x95F5, 0xE3C9, - 0x95F6, 0xE3CA, - 0x95F7, 0xC3C6, - 0x95F8, 0xD5A2, - 0x95F9, 0xC4D6, - 0x95FA, 0xB9EB, - 0x95FB, 0xCEC5, - 0x95FC, 0xE3CB, - 0x95FD, 0xC3F6, - 0x95FE, 0xE3CC, - 0x9600, 0xB7A7, - 0x9601, 0xB8F3, - 0x9602, 0xBAD2, - 0x9603, 0xE3CD, - 0x9604, 0xE3CE, - 0x9605, 0xD4C4, - 0x9606, 0xE3CF, - 0x9608, 0xE3D0, - 0x9609, 0xD1CB, - 0x960A, 0xE3D1, - 0x960B, 0xE3D2, - 0x960C, 0xE3D3, - 0x960D, 0xE3D4, - 0x960E, 0xD1D6, - 0x960F, 0xE3D5, - 0x9610, 0xB2FB, - 0x9611, 0xC0BB, - 0x9612, 0xE3D6, - 0x9614, 0xC0AB, - 0x9615, 0xE3D7, - 0x9616, 0xE3D8, - 0x9617, 0xE3D9, - 0x9619, 0xE3DA, - 0x961A, 0xE3DB, - 0x961C, 0xB8B7, - 0x961D, 0xDAE2, - 0x961F, 0xB6D3, - 0x9621, 0xDAE4, - 0x9622, 0xDAE3, - 0x962A, 0xDAE6, - 0x962E, 0xC8EE, - 0x9631, 0xDAE5, - 0x9632, 0xB7C0, - 0x9633, 0xD1F4, - 0x9634, 0xD2F5, - 0x9635, 0xD5F3, - 0x9636, 0xBDD7, - 0x963B, 0xD7E8, - 0x963C, 0xDAE8, - 0x963D, 0xDAE7, - 0x963F, 0xB0A2, - 0x9640, 0xCDD3, - 0x9642, 0xDAE9, - 0x9644, 0xB8BD, - 0x9645, 0xBCCA, - 0x9646, 0xC2BD, - 0x9647, 0xC2A4, - 0x9648, 0xB3C2, - 0x9649, 0xDAEA, - 0x964B, 0xC2AA, - 0x964C, 0xC4B0, - 0x964D, 0xBDB5, - 0x9650, 0xCFDE, - 0x9654, 0xDAEB, - 0x9655, 0xC9C2, - 0x965B, 0xB1DD, - 0x965F, 0xDAEC, - 0x9661, 0xB6B8, - 0x9662, 0xD4BA, - 0x9664, 0xB3FD, - 0x9667, 0xDAED, - 0x9668, 0xD4C9, - 0x9669, 0xCFD5, - 0x966A, 0xC5E3, - 0x966C, 0xDAEE, - 0x9672, 0xDAEF, - 0x9674, 0xDAF0, - 0x9675, 0xC1EA, - 0x9676, 0xCCD5, - 0x9677, 0xCFDD, - 0x9685, 0xD3E7, - 0x9686, 0xC2A1, - 0x9688, 0xDAF1, - 0x968B, 0xCBE5, - 0x968D, 0xDAF2, - 0x968F, 0xCBE6, - 0x9690, 0xD2FE, - 0x9694, 0xB8F4, - 0x9697, 0xDAF3, - 0x9698, 0xB0AF, - 0x9699, 0xCFB6, - 0x969C, 0xD5CF, - 0x96A7, 0xCBED, - 0x96B0, 0xDAF4, - 0x96B3, 0xE3C4, - 0x96B6, 0xC1A5, - 0x96B9, 0xF6BF, - 0x96BC, 0xF6C0, - 0x96BD, 0xF6C1, - 0x96BE, 0xC4D1, - 0x96C0, 0xC8B8, - 0x96C1, 0xD1E3, - 0x96C4, 0xD0DB, - 0x96C5, 0xD1C5, - 0x96C6, 0xBCAF, - 0x96C7, 0xB9CD, - 0x96C9, 0xEFF4, - 0x96CC, 0xB4C6, - 0x96CD, 0xD3BA, - 0x96CE, 0xF6C2, - 0x96CF, 0xB3FB, - 0x96D2, 0xF6C3, - 0x96D5, 0xB5F1, - 0x96E0, 0xF6C5, - 0x96E8, 0xD3EA, - 0x96E9, 0xF6A7, - 0x96EA, 0xD1A9, - 0x96EF, 0xF6A9, - 0x96F3, 0xF6A8, - 0x96F6, 0xC1E3, - 0x96F7, 0xC0D7, - 0x96F9, 0xB1A2, - 0x96FE, 0xCEED, - 0x9700, 0xD0E8, - 0x9701, 0xF6AB, - 0x9704, 0xCFF6, - 0x9706, 0xF6AA, - 0x9707, 0xD5F0, - 0x9708, 0xF6AC, - 0x9709, 0xC3B9, - 0x970D, 0xBBF4, - 0x970E, 0xF6AE, - 0x970F, 0xF6AD, - 0x9713, 0xC4DE, - 0x9716, 0xC1D8, - 0x971C, 0xCBAA, - 0x971E, 0xCFBC, - 0x972A, 0xF6AF, - 0x972D, 0xF6B0, - 0x9730, 0xF6B1, - 0x9732, 0xC2B6, - 0x9738, 0xB0D4, - 0x9739, 0xC5F9, - 0x973E, 0xF6B2, - 0x9752, 0xC7E0, - 0x9753, 0xF6A6, - 0x9756, 0xBEB8, - 0x9759, 0xBEB2, - 0x975B, 0xB5E5, - 0x975E, 0xB7C7, - 0x9760, 0xBFBF, - 0x9761, 0xC3D2, - 0x9762, 0xC3E6, - 0x9765, 0xD8CC, - 0x9769, 0xB8EF, - 0x9773, 0xBDF9, - 0x9774, 0xD1A5, - 0x9776, 0xB0D0, - 0x977C, 0xF7B0, - 0x9785, 0xF7B1, - 0x978B, 0xD0AC, - 0x978D, 0xB0B0, - 0x9791, 0xF7B2, - 0x9792, 0xF7B3, - 0x9794, 0xF7B4, - 0x9798, 0xC7CA, - 0x97A0, 0xBECF, - 0x97A3, 0xF7B7, - 0x97AB, 0xF7B6, - 0x97AD, 0xB1DE, - 0x97AF, 0xF7B5, - 0x97B2, 0xF7B8, - 0x97B4, 0xF7B9, - 0x97E6, 0xCEA4, - 0x97E7, 0xC8CD, - 0x97E9, 0xBAAB, - 0x97EA, 0xE8B8, - 0x97EB, 0xE8B9, - 0x97EC, 0xE8BA, - 0x97ED, 0xBEC2, - 0x97F3, 0xD2F4, - 0x97F5, 0xD4CF, - 0x97F6, 0xC9D8, - 0x9875, 0xD2B3, - 0x9876, 0xB6A5, - 0x9877, 0xC7EA, - 0x9878, 0xF1FC, - 0x9879, 0xCFEE, - 0x987A, 0xCBB3, - 0x987B, 0xD0EB, - 0x987C, 0xE7EF, - 0x987D, 0xCDE7, - 0x987E, 0xB9CB, - 0x987F, 0xB6D9, - 0x9880, 0xF1FD, - 0x9881, 0xB0E4, - 0x9882, 0xCBCC, - 0x9883, 0xF1FE, - 0x9884, 0xD4A4, - 0x9885, 0xC2AD, - 0x9886, 0xC1EC, - 0x9887, 0xC6C4, - 0x9888, 0xBEB1, - 0x9889, 0xF2A1, - 0x988A, 0xBCD5, - 0x988C, 0xF2A2, - 0x988D, 0xF2A3, - 0x988F, 0xF2A4, - 0x9890, 0xD2C3, - 0x9891, 0xC6B5, - 0x9893, 0xCDC7, - 0x9894, 0xF2A5, - 0x9896, 0xD3B1, - 0x9897, 0xBFC5, - 0x9898, 0xCCE2, - 0x989A, 0xF2A6, - 0x989B, 0xF2A7, - 0x989C, 0xD1D5, - 0x989D, 0xB6EE, - 0x989E, 0xF2A8, - 0x989F, 0xF2A9, - 0x98A0, 0xB5DF, - 0x98A1, 0xF2AA, - 0x98A2, 0xF2AB, - 0x98A4, 0xB2FC, - 0x98A5, 0xF2AC, - 0x98A6, 0xF2AD, - 0x98A7, 0xC8A7, - 0x98CE, 0xB7E7, - 0x98D1, 0xECA9, - 0x98D2, 0xECAA, - 0x98D3, 0xECAB, - 0x98D5, 0xECAC, - 0x98D8, 0xC6AE, - 0x98D9, 0xECAD, - 0x98DA, 0xECAE, - 0x98DE, 0xB7C9, - 0x98DF, 0xCAB3, - 0x98E7, 0xE2B8, - 0x98E8, 0xF7CF, - 0x990D, 0xF7D0, - 0x9910, 0xB2CD, - 0x992E, 0xF7D1, - 0x9954, 0xF7D3, - 0x9955, 0xF7D2, - 0x9963, 0xE2BB, - 0x9965, 0xBCA2, - 0x9967, 0xE2BC, - 0x9968, 0xE2BD, - 0x9969, 0xE2BE, - 0x996A, 0xE2BF, - 0x996B, 0xE2C0, - 0x996C, 0xE2C1, - 0x996D, 0xB7B9, - 0x996E, 0xD2FB, - 0x996F, 0xBDA4, - 0x9970, 0xCACE, - 0x9971, 0xB1A5, - 0x9972, 0xCBC7, - 0x9974, 0xE2C2, - 0x9975, 0xB6FC, - 0x9976, 0xC8C4, - 0x9977, 0xE2C3, - 0x997A, 0xBDC8, - 0x997C, 0xB1FD, - 0x997D, 0xE2C4, - 0x997F, 0xB6F6, - 0x9980, 0xE2C5, - 0x9981, 0xC4D9, - 0x9984, 0xE2C6, - 0x9985, 0xCFDA, - 0x9986, 0xB9DD, - 0x9987, 0xE2C7, - 0x9988, 0xC0A1, - 0x998A, 0xE2C8, - 0x998B, 0xB2F6, - 0x998D, 0xE2C9, - 0x998F, 0xC1F3, - 0x9990, 0xE2CA, - 0x9991, 0xE2CB, - 0x9992, 0xC2F8, - 0x9993, 0xE2CC, - 0x9994, 0xE2CD, - 0x9995, 0xE2CE, - 0x9996, 0xCAD7, - 0x9997, 0xD8B8, - 0x9998, 0xD9E5, - 0x9999, 0xCFE3, - 0x99A5, 0xF0A5, - 0x99A8, 0xDCB0, - 0x9A6C, 0xC2ED, - 0x9A6D, 0xD4A6, - 0x9A6E, 0xCDD4, - 0x9A6F, 0xD1B1, - 0x9A70, 0xB3DB, - 0x9A71, 0xC7FD, - 0x9A73, 0xB2B5, - 0x9A74, 0xC2BF, - 0x9A75, 0xE6E0, - 0x9A76, 0xCABB, - 0x9A77, 0xE6E1, - 0x9A78, 0xE6E2, - 0x9A79, 0xBED4, - 0x9A7A, 0xE6E3, - 0x9A7B, 0xD7A4, - 0x9A7C, 0xCDD5, - 0x9A7D, 0xE6E5, - 0x9A7E, 0xBCDD, - 0x9A7F, 0xE6E4, - 0x9A80, 0xE6E6, - 0x9A81, 0xE6E7, - 0x9A82, 0xC2EE, - 0x9A84, 0xBDBE, - 0x9A85, 0xE6E8, - 0x9A86, 0xC2E6, - 0x9A87, 0xBAA7, - 0x9A88, 0xE6E9, - 0x9A8A, 0xE6EA, - 0x9A8B, 0xB3D2, - 0x9A8C, 0xD1E9, - 0x9A8F, 0xBFA5, - 0x9A90, 0xE6EB, - 0x9A91, 0xC6EF, - 0x9A92, 0xE6EC, - 0x9A93, 0xE6ED, - 0x9A96, 0xE6EE, - 0x9A97, 0xC6AD, - 0x9A98, 0xE6EF, - 0x9A9A, 0xC9A7, - 0x9A9B, 0xE6F0, - 0x9A9C, 0xE6F1, - 0x9A9D, 0xE6F2, - 0x9A9E, 0xE5B9, - 0x9A9F, 0xE6F3, - 0x9AA0, 0xE6F4, - 0x9AA1, 0xC2E2, - 0x9AA2, 0xE6F5, - 0x9AA3, 0xE6F6, - 0x9AA4, 0xD6E8, - 0x9AA5, 0xE6F7, - 0x9AA7, 0xE6F8, - 0x9AA8, 0xB9C7, - 0x9AB0, 0xF7BB, - 0x9AB1, 0xF7BA, - 0x9AB6, 0xF7BE, - 0x9AB7, 0xF7BC, - 0x9AB8, 0xBAA1, - 0x9ABA, 0xF7BF, - 0x9ABC, 0xF7C0, - 0x9AC0, 0xF7C2, - 0x9AC1, 0xF7C1, - 0x9AC2, 0xF7C4, - 0x9AC5, 0xF7C3, - 0x9ACB, 0xF7C5, - 0x9ACC, 0xF7C6, - 0x9AD1, 0xF7C7, - 0x9AD3, 0xCBE8, - 0x9AD8, 0xB8DF, - 0x9ADF, 0xF7D4, - 0x9AE1, 0xF7D5, - 0x9AE6, 0xF7D6, - 0x9AEB, 0xF7D8, - 0x9AED, 0xF7DA, - 0x9AEF, 0xF7D7, - 0x9AF9, 0xF7DB, - 0x9AFB, 0xF7D9, - 0x9B03, 0xD7D7, - 0x9B08, 0xF7DC, - 0x9B0F, 0xF7DD, - 0x9B13, 0xF7DE, - 0x9B1F, 0xF7DF, - 0x9B23, 0xF7E0, - 0x9B2F, 0xDBCB, - 0x9B32, 0xD8AA, - 0x9B3B, 0xE5F7, - 0x9B3C, 0xB9ED, - 0x9B41, 0xBFFD, - 0x9B42, 0xBBEA, - 0x9B43, 0xF7C9, - 0x9B44, 0xC6C7, - 0x9B45, 0xF7C8, - 0x9B47, 0xF7CA, - 0x9B48, 0xF7CC, - 0x9B49, 0xF7CB, - 0x9B4D, 0xF7CD, - 0x9B4F, 0xCEBA, - 0x9B51, 0xF7CE, - 0x9B54, 0xC4A7, - 0x9C7C, 0xD3E3, - 0x9C7F, 0xF6CF, - 0x9C81, 0xC2B3, - 0x9C82, 0xF6D0, - 0x9C85, 0xF6D1, - 0x9C86, 0xF6D2, - 0x9C87, 0xF6D3, - 0x9C88, 0xF6D4, - 0x9C8B, 0xF6D6, - 0x9C8D, 0xB1AB, - 0x9C8E, 0xF6D7, - 0x9C90, 0xF6D8, - 0x9C91, 0xF6D9, - 0x9C92, 0xF6DA, - 0x9C94, 0xF6DB, - 0x9C95, 0xF6DC, - 0x9C9A, 0xF6DD, - 0x9C9B, 0xF6DE, - 0x9C9C, 0xCFCA, - 0x9C9E, 0xF6DF, - 0x9C9F, 0xF6E0, - 0x9CA0, 0xF6E1, - 0x9CA1, 0xF6E2, - 0x9CA2, 0xF6E3, - 0x9CA3, 0xF6E4, - 0x9CA4, 0xC0F0, - 0x9CA5, 0xF6E5, - 0x9CA6, 0xF6E6, - 0x9CA7, 0xF6E7, - 0x9CA8, 0xF6E8, - 0x9CA9, 0xF6E9, - 0x9CAB, 0xF6EA, - 0x9CAD, 0xF6EB, - 0x9CAE, 0xF6EC, - 0x9CB0, 0xF6ED, - 0x9CB1, 0xF6EE, - 0x9CB2, 0xF6EF, - 0x9CB3, 0xF6F0, - 0x9CB4, 0xF6F1, - 0x9CB5, 0xF6F2, - 0x9CB6, 0xF6F3, - 0x9CB7, 0xF6F4, - 0x9CB8, 0xBEA8, - 0x9CBA, 0xF6F5, - 0x9CBB, 0xF6F6, - 0x9CBC, 0xF6F7, - 0x9CBD, 0xF6F8, - 0x9CC3, 0xC8FA, - 0x9CC4, 0xF6F9, - 0x9CC5, 0xF6FA, - 0x9CC6, 0xF6FB, - 0x9CC7, 0xF6FC, - 0x9CCA, 0xF6FD, - 0x9CCB, 0xF6FE, - 0x9CCC, 0xF7A1, - 0x9CCD, 0xF7A2, - 0x9CCE, 0xF7A3, - 0x9CCF, 0xF7A4, - 0x9CD0, 0xF7A5, - 0x9CD3, 0xF7A6, - 0x9CD4, 0xF7A7, - 0x9CD5, 0xF7A8, - 0x9CD6, 0xB1EE, - 0x9CD7, 0xF7A9, - 0x9CD8, 0xF7AA, - 0x9CD9, 0xF7AB, - 0x9CDC, 0xF7AC, - 0x9CDD, 0xF7AD, - 0x9CDE, 0xC1DB, - 0x9CDF, 0xF7AE, - 0x9CE2, 0xF7AF, - 0x9E1F, 0xC4F1, - 0x9E20, 0xF0AF, - 0x9E21, 0xBCA6, - 0x9E22, 0xF0B0, - 0x9E23, 0xC3F9, - 0x9E25, 0xC5B8, - 0x9E26, 0xD1BB, - 0x9E28, 0xF0B1, - 0x9E29, 0xF0B2, - 0x9E2A, 0xF0B3, - 0x9E2B, 0xF0B4, - 0x9E2C, 0xF0B5, - 0x9E2D, 0xD1BC, - 0x9E2F, 0xD1EC, - 0x9E31, 0xF0B7, - 0x9E32, 0xF0B6, - 0x9E33, 0xD4A7, - 0x9E35, 0xCDD2, - 0x9E36, 0xF0B8, - 0x9E37, 0xF0BA, - 0x9E38, 0xF0B9, - 0x9E39, 0xF0BB, - 0x9E3A, 0xF0BC, - 0x9E3D, 0xB8EB, - 0x9E3E, 0xF0BD, - 0x9E3F, 0xBAE8, - 0x9E41, 0xF0BE, - 0x9E42, 0xF0BF, - 0x9E43, 0xBEE9, - 0x9E44, 0xF0C0, - 0x9E45, 0xB6EC, - 0x9E46, 0xF0C1, - 0x9E47, 0xF0C2, - 0x9E48, 0xF0C3, - 0x9E49, 0xF0C4, - 0x9E4A, 0xC8B5, - 0x9E4B, 0xF0C5, - 0x9E4C, 0xF0C6, - 0x9E4E, 0xF0C7, - 0x9E4F, 0xC5F4, - 0x9E51, 0xF0C8, - 0x9E55, 0xF0C9, - 0x9E57, 0xF0CA, - 0x9E58, 0xF7BD, - 0x9E5A, 0xF0CB, - 0x9E5B, 0xF0CC, - 0x9E5C, 0xF0CD, - 0x9E5E, 0xF0CE, - 0x9E63, 0xF0CF, - 0x9E64, 0xBAD7, - 0x9E66, 0xF0D0, - 0x9E67, 0xF0D1, - 0x9E68, 0xF0D2, - 0x9E69, 0xF0D3, - 0x9E6A, 0xF0D4, - 0x9E6B, 0xF0D5, - 0x9E6C, 0xF0D6, - 0x9E6D, 0xF0D8, - 0x9E70, 0xD3A5, - 0x9E71, 0xF0D7, - 0x9E73, 0xF0D9, - 0x9E7E, 0xF5BA, - 0x9E7F, 0xC2B9, - 0x9E82, 0xF7E4, - 0x9E87, 0xF7E5, - 0x9E88, 0xF7E6, - 0x9E8B, 0xF7E7, - 0x9E92, 0xF7E8, - 0x9E93, 0xC2B4, - 0x9E9D, 0xF7EA, - 0x9E9F, 0xF7EB, - 0x9EA6, 0xC2F3, - 0x9EB4, 0xF4F0, - 0x9EB8, 0xF4EF, - 0x9EBB, 0xC2E9, - 0x9EBD, 0xF7E1, - 0x9EBE, 0xF7E2, - 0x9EC4, 0xBBC6, - 0x9EC9, 0xD9E4, - 0x9ECD, 0xCAF2, - 0x9ECE, 0xC0E8, - 0x9ECF, 0xF0A4, - 0x9ED1, 0xBADA, - 0x9ED4, 0xC7AD, - 0x9ED8, 0xC4AC, - 0x9EDB, 0xF7EC, - 0x9EDC, 0xF7ED, - 0x9EDD, 0xF7EE, - 0x9EDF, 0xF7F0, - 0x9EE0, 0xF7EF, - 0x9EE2, 0xF7F1, - 0x9EE5, 0xF7F4, - 0x9EE7, 0xF7F3, - 0x9EE9, 0xF7F2, - 0x9EEA, 0xF7F5, - 0x9EEF, 0xF7F6, - 0x9EF9, 0xEDE9, - 0x9EFB, 0xEDEA, - 0x9EFC, 0xEDEB, - 0x9EFE, 0xF6BC, - 0x9F0B, 0xF6BD, - 0x9F0D, 0xF6BE, - 0x9F0E, 0xB6A6, - 0x9F10, 0xD8BE, - 0x9F13, 0xB9C4, - 0x9F17, 0xD8BB, - 0x9F19, 0xDCB1, - 0x9F20, 0xCAF3, - 0x9F22, 0xF7F7, - 0x9F2C, 0xF7F8, - 0x9F2F, 0xF7F9, - 0x9F37, 0xF7FB, - 0x9F39, 0xF7FA, - 0x9F3B, 0xB1C7, - 0x9F3D, 0xF7FC, - 0x9F3E, 0xF7FD, - 0x9F44, 0xF7FE, - 0x9F50, 0xC6EB, - 0x9F51, 0xECB4, - 0x9F7F, 0xB3DD, - 0x9F80, 0xF6B3, - 0x9F83, 0xF6B4, - 0x9F84, 0xC1E4, - 0x9F85, 0xF6B5, - 0x9F86, 0xF6B6, - 0x9F87, 0xF6B7, - 0x9F88, 0xF6B8, - 0x9F89, 0xF6B9, - 0x9F8A, 0xF6BA, - 0x9F8B, 0xC8A3, - 0x9F8C, 0xF6BB, - 0x9F99, 0xC1FA, - 0x9F9A, 0xB9A8, - 0x9F9B, 0xEDE8, - 0x9F9F, 0xB9EA, - 0x9FA0, 0xD9DF, - 0xFF01, 0xA3A1, - 0xFF02, 0xA3A2, - 0xFF03, 0xA3A3, - 0xFF04, 0xA1E7, - 0xFF05, 0xA3A5, - 0xFF06, 0xA3A6, - 0xFF07, 0xA3A7, - 0xFF08, 0xA3A8, - 0xFF09, 0xA3A9, - 0xFF0A, 0xA3AA, - 0xFF0B, 0xA3AB, - 0xFF0C, 0xA3AC, - 0xFF0D, 0xA3AD, - 0xFF0E, 0xA3AE, - 0xFF0F, 0xA3AF, - 0xFF10, 0xA3B0, - 0xFF11, 0xA3B1, - 0xFF12, 0xA3B2, - 0xFF13, 0xA3B3, - 0xFF14, 0xA3B4, - 0xFF15, 0xA3B5, - 0xFF16, 0xA3B6, - 0xFF17, 0xA3B7, - 0xFF18, 0xA3B8, - 0xFF19, 0xA3B9, - 0xFF1A, 0xA3BA, - 0xFF1B, 0xA3BB, - 0xFF1C, 0xA3BC, - 0xFF1D, 0xA3BD, - 0xFF1E, 0xA3BE, - 0xFF1F, 0xA3BF, - 0xFF20, 0xA3C0, - 0xFF21, 0xA3C1, - 0xFF22, 0xA3C2, - 0xFF23, 0xA3C3, - 0xFF24, 0xA3C4, - 0xFF25, 0xA3C5, - 0xFF26, 0xA3C6, - 0xFF27, 0xA3C7, - 0xFF28, 0xA3C8, - 0xFF29, 0xA3C9, - 0xFF2A, 0xA3CA, - 0xFF2B, 0xA3CB, - 0xFF2C, 0xA3CC, - 0xFF2D, 0xA3CD, - 0xFF2E, 0xA3CE, - 0xFF2F, 0xA3CF, - 0xFF30, 0xA3D0, - 0xFF31, 0xA3D1, - 0xFF32, 0xA3D2, - 0xFF33, 0xA3D3, - 0xFF34, 0xA3D4, - 0xFF35, 0xA3D5, - 0xFF36, 0xA3D6, - 0xFF37, 0xA3D7, - 0xFF38, 0xA3D8, - 0xFF39, 0xA3D9, - 0xFF3A, 0xA3DA, - 0xFF3B, 0xA3DB, - 0xFF3C, 0xA3DC, - 0xFF3D, 0xA3DD, - 0xFF3E, 0xA3DE, - 0xFF3F, 0xA3DF, - 0xFF40, 0xA3E0, - 0xFF41, 0xA3E1, - 0xFF42, 0xA3E2, - 0xFF43, 0xA3E3, - 0xFF44, 0xA3E4, - 0xFF45, 0xA3E5, - 0xFF46, 0xA3E6, - 0xFF47, 0xA3E7, - 0xFF48, 0xA3E8, - 0xFF49, 0xA3E9, - 0xFF4A, 0xA3EA, - 0xFF4B, 0xA3EB, - 0xFF4C, 0xA3EC, - 0xFF4D, 0xA3ED, - 0xFF4E, 0xA3EE, - 0xFF4F, 0xA3EF, - 0xFF50, 0xA3F0, - 0xFF51, 0xA3F1, - 0xFF52, 0xA3F2, - 0xFF53, 0xA3F3, - 0xFF54, 0xA3F4, - 0xFF55, 0xA3F5, - 0xFF56, 0xA3F6, - 0xFF57, 0xA3F7, - 0xFF58, 0xA3F8, - 0xFF59, 0xA3F9, - 0xFF5A, 0xA3FA, - 0xFF5B, 0xA3FB, - 0xFF5C, 0xA3FC, - 0xFF5D, 0xA3FD, - 0xFF5E, 0xA1AB, - 0xFFE0, 0xA1E9, - 0xFFE1, 0xA1EA, - 0xFFE3, 0xA3FE, - 0xFFE5, 0xA3A4 + 0x00A4, 0xA1E8, + 0x00A7, 0xA1EC, + 0x00A8, 0xA1A7, + 0x00B0, 0xA1E3, + 0x00B1, 0xA1C0, + 0x00B7, 0xA1A4, + 0x00D7, 0xA1C1, + 0x00E0, 0xA8A4, + 0x00E1, 0xA8A2, + 0x00E8, 0xA8A8, + 0x00E9, 0xA8A6, + 0x00EA, 0xA8BA, + 0x00EC, 0xA8AC, + 0x00ED, 0xA8AA, + 0x00F2, 0xA8B0, + 0x00F3, 0xA8AE, + 0x00F7, 0xA1C2, + 0x00F9, 0xA8B4, + 0x00FA, 0xA8B2, + 0x00FC, 0xA8B9, + 0x0101, 0xA8A1, + 0x0113, 0xA8A5, + 0x011B, 0xA8A7, + 0x012B, 0xA8A9, + 0x014D, 0xA8AD, + 0x016B, 0xA8B1, + 0x01CE, 0xA8A3, + 0x01D0, 0xA8AB, + 0x01D2, 0xA8AF, + 0x01D4, 0xA8B3, + 0x01D6, 0xA8B5, + 0x01D8, 0xA8B6, + 0x01DA, 0xA8B7, + 0x01DC, 0xA8B8, + 0x02C7, 0xA1A6, + 0x02C9, 0xA1A5, + 0x0391, 0xA6A1, + 0x0392, 0xA6A2, + 0x0393, 0xA6A3, + 0x0394, 0xA6A4, + 0x0395, 0xA6A5, + 0x0396, 0xA6A6, + 0x0397, 0xA6A7, + 0x0398, 0xA6A8, + 0x0399, 0xA6A9, + 0x039A, 0xA6AA, + 0x039B, 0xA6AB, + 0x039C, 0xA6AC, + 0x039D, 0xA6AD, + 0x039E, 0xA6AE, + 0x039F, 0xA6AF, + 0x03A0, 0xA6B0, + 0x03A1, 0xA6B1, + 0x03A3, 0xA6B2, + 0x03A4, 0xA6B3, + 0x03A5, 0xA6B4, + 0x03A6, 0xA6B5, + 0x03A7, 0xA6B6, + 0x03A8, 0xA6B7, + 0x03A9, 0xA6B8, + 0x03B1, 0xA6C1, + 0x03B2, 0xA6C2, + 0x03B3, 0xA6C3, + 0x03B4, 0xA6C4, + 0x03B5, 0xA6C5, + 0x03B6, 0xA6C6, + 0x03B7, 0xA6C7, + 0x03B8, 0xA6C8, + 0x03B9, 0xA6C9, + 0x03BA, 0xA6CA, + 0x03BB, 0xA6CB, + 0x03BC, 0xA6CC, + 0x03BD, 0xA6CD, + 0x03BE, 0xA6CE, + 0x03BF, 0xA6CF, + 0x03C0, 0xA6D0, + 0x03C1, 0xA6D1, + 0x03C3, 0xA6D2, + 0x03C4, 0xA6D3, + 0x03C5, 0xA6D4, + 0x03C6, 0xA6D5, + 0x03C7, 0xA6D6, + 0x03C8, 0xA6D7, + 0x03C9, 0xA6D8, + 0x0401, 0xA7A7, + 0x0410, 0xA7A1, + 0x0411, 0xA7A2, + 0x0412, 0xA7A3, + 0x0413, 0xA7A4, + 0x0414, 0xA7A5, + 0x0415, 0xA7A6, + 0x0416, 0xA7A8, + 0x0417, 0xA7A9, + 0x0418, 0xA7AA, + 0x0419, 0xA7AB, + 0x041A, 0xA7AC, + 0x041B, 0xA7AD, + 0x041C, 0xA7AE, + 0x041D, 0xA7AF, + 0x041E, 0xA7B0, + 0x041F, 0xA7B1, + 0x0420, 0xA7B2, + 0x0421, 0xA7B3, + 0x0422, 0xA7B4, + 0x0423, 0xA7B5, + 0x0424, 0xA7B6, + 0x0425, 0xA7B7, + 0x0426, 0xA7B8, + 0x0427, 0xA7B9, + 0x0428, 0xA7BA, + 0x0429, 0xA7BB, + 0x042A, 0xA7BC, + 0x042B, 0xA7BD, + 0x042C, 0xA7BE, + 0x042D, 0xA7BF, + 0x042E, 0xA7C0, + 0x042F, 0xA7C1, + 0x0430, 0xA7D1, + 0x0431, 0xA7D2, + 0x0432, 0xA7D3, + 0x0433, 0xA7D4, + 0x0434, 0xA7D5, + 0x0435, 0xA7D6, + 0x0436, 0xA7D8, + 0x0437, 0xA7D9, + 0x0438, 0xA7DA, + 0x0439, 0xA7DB, + 0x043A, 0xA7DC, + 0x043B, 0xA7DD, + 0x043C, 0xA7DE, + 0x043D, 0xA7DF, + 0x043E, 0xA7E0, + 0x043F, 0xA7E1, + 0x0440, 0xA7E2, + 0x0441, 0xA7E3, + 0x0442, 0xA7E4, + 0x0443, 0xA7E5, + 0x0444, 0xA7E6, + 0x0445, 0xA7E7, + 0x0446, 0xA7E8, + 0x0447, 0xA7E9, + 0x0448, 0xA7EA, + 0x0449, 0xA7EB, + 0x044A, 0xA7EC, + 0x044B, 0xA7ED, + 0x044C, 0xA7EE, + 0x044D, 0xA7EF, + 0x044E, 0xA7F0, + 0x044F, 0xA7F1, + 0x0451, 0xA7D7, + 0x2014, 0xA1AA, + 0x2016, 0xA1AC, + 0x2018, 0xA1AE, + 0x2019, 0xA1AF, + 0x201C, 0xA1B0, + 0x201D, 0xA1B1, + 0x2026, 0xA1AD, + 0x2030, 0xA1EB, + 0x2032, 0xA1E4, + 0x2033, 0xA1E5, + 0x203B, 0xA1F9, + 0x2103, 0xA1E6, + 0x2116, 0xA1ED, + 0x2160, 0xA2F1, + 0x2161, 0xA2F2, + 0x2162, 0xA2F3, + 0x2163, 0xA2F4, + 0x2164, 0xA2F5, + 0x2165, 0xA2F6, + 0x2166, 0xA2F7, + 0x2167, 0xA2F8, + 0x2168, 0xA2F9, + 0x2169, 0xA2FA, + 0x216A, 0xA2FB, + 0x216B, 0xA2FC, + 0x2190, 0xA1FB, + 0x2191, 0xA1FC, + 0x2192, 0xA1FA, + 0x2193, 0xA1FD, + 0x2208, 0xA1CA, + 0x220F, 0xA1C7, + 0x2211, 0xA1C6, + 0x221A, 0xA1CC, + 0x221D, 0xA1D8, + 0x221E, 0xA1DE, + 0x2220, 0xA1CF, + 0x2225, 0xA1CE, + 0x2227, 0xA1C4, + 0x2228, 0xA1C5, + 0x2229, 0xA1C9, + 0x222A, 0xA1C8, + 0x222B, 0xA1D2, + 0x222E, 0xA1D3, + 0x2234, 0xA1E0, + 0x2235, 0xA1DF, + 0x2236, 0xA1C3, + 0x2237, 0xA1CB, + 0x223D, 0xA1D7, + 0x2248, 0xA1D6, + 0x224C, 0xA1D5, + 0x2260, 0xA1D9, + 0x2261, 0xA1D4, + 0x2264, 0xA1DC, + 0x2265, 0xA1DD, + 0x226E, 0xA1DA, + 0x226F, 0xA1DB, + 0x2299, 0xA1D1, + 0x22A5, 0xA1CD, + 0x2312, 0xA1D0, + 0x2460, 0xA2D9, + 0x2461, 0xA2DA, + 0x2462, 0xA2DB, + 0x2463, 0xA2DC, + 0x2464, 0xA2DD, + 0x2465, 0xA2DE, + 0x2466, 0xA2DF, + 0x2467, 0xA2E0, + 0x2468, 0xA2E1, + 0x2469, 0xA2E2, + 0x2474, 0xA2C5, + 0x2475, 0xA2C6, + 0x2476, 0xA2C7, + 0x2477, 0xA2C8, + 0x2478, 0xA2C9, + 0x2479, 0xA2CA, + 0x247A, 0xA2CB, + 0x247B, 0xA2CC, + 0x247C, 0xA2CD, + 0x247D, 0xA2CE, + 0x247E, 0xA2CF, + 0x247F, 0xA2D0, + 0x2480, 0xA2D1, + 0x2481, 0xA2D2, + 0x2482, 0xA2D3, + 0x2483, 0xA2D4, + 0x2484, 0xA2D5, + 0x2485, 0xA2D6, + 0x2486, 0xA2D7, + 0x2487, 0xA2D8, + 0x2488, 0xA2B1, + 0x2489, 0xA2B2, + 0x248A, 0xA2B3, + 0x248B, 0xA2B4, + 0x248C, 0xA2B5, + 0x248D, 0xA2B6, + 0x248E, 0xA2B7, + 0x248F, 0xA2B8, + 0x2490, 0xA2B9, + 0x2491, 0xA2BA, + 0x2492, 0xA2BB, + 0x2493, 0xA2BC, + 0x2494, 0xA2BD, + 0x2495, 0xA2BE, + 0x2496, 0xA2BF, + 0x2497, 0xA2C0, + 0x2498, 0xA2C1, + 0x2499, 0xA2C2, + 0x249A, 0xA2C3, + 0x249B, 0xA2C4, + 0x2500, 0xA9A4, + 0x2501, 0xA9A5, + 0x2502, 0xA9A6, + 0x2503, 0xA9A7, + 0x2504, 0xA9A8, + 0x2505, 0xA9A9, + 0x2506, 0xA9AA, + 0x2507, 0xA9AB, + 0x2508, 0xA9AC, + 0x2509, 0xA9AD, + 0x250A, 0xA9AE, + 0x250B, 0xA9AF, + 0x250C, 0xA9B0, + 0x250D, 0xA9B1, + 0x250E, 0xA9B2, + 0x250F, 0xA9B3, + 0x2510, 0xA9B4, + 0x2511, 0xA9B5, + 0x2512, 0xA9B6, + 0x2513, 0xA9B7, + 0x2514, 0xA9B8, + 0x2515, 0xA9B9, + 0x2516, 0xA9BA, + 0x2517, 0xA9BB, + 0x2518, 0xA9BC, + 0x2519, 0xA9BD, + 0x251A, 0xA9BE, + 0x251B, 0xA9BF, + 0x251C, 0xA9C0, + 0x251D, 0xA9C1, + 0x251E, 0xA9C2, + 0x251F, 0xA9C3, + 0x2520, 0xA9C4, + 0x2521, 0xA9C5, + 0x2522, 0xA9C6, + 0x2523, 0xA9C7, + 0x2524, 0xA9C8, + 0x2525, 0xA9C9, + 0x2526, 0xA9CA, + 0x2527, 0xA9CB, + 0x2528, 0xA9CC, + 0x2529, 0xA9CD, + 0x252A, 0xA9CE, + 0x252B, 0xA9CF, + 0x252C, 0xA9D0, + 0x252D, 0xA9D1, + 0x252E, 0xA9D2, + 0x252F, 0xA9D3, + 0x2530, 0xA9D4, + 0x2531, 0xA9D5, + 0x2532, 0xA9D6, + 0x2533, 0xA9D7, + 0x2534, 0xA9D8, + 0x2535, 0xA9D9, + 0x2536, 0xA9DA, + 0x2537, 0xA9DB, + 0x2538, 0xA9DC, + 0x2539, 0xA9DD, + 0x253A, 0xA9DE, + 0x253B, 0xA9DF, + 0x253C, 0xA9E0, + 0x253D, 0xA9E1, + 0x253E, 0xA9E2, + 0x253F, 0xA9E3, + 0x2540, 0xA9E4, + 0x2541, 0xA9E5, + 0x2542, 0xA9E6, + 0x2543, 0xA9E7, + 0x2544, 0xA9E8, + 0x2545, 0xA9E9, + 0x2546, 0xA9EA, + 0x2547, 0xA9EB, + 0x2548, 0xA9EC, + 0x2549, 0xA9ED, + 0x254A, 0xA9EE, + 0x254B, 0xA9EF, + 0x25A0, 0xA1F6, + 0x25A1, 0xA1F5, + 0x25B2, 0xA1F8, + 0x25B3, 0xA1F7, + 0x25C6, 0xA1F4, + 0x25C7, 0xA1F3, + 0x25CB, 0xA1F0, + 0x25CE, 0xA1F2, + 0x25CF, 0xA1F1, + 0x2605, 0xA1EF, + 0x2606, 0xA1EE, + 0x2640, 0xA1E2, + 0x2642, 0xA1E1, + 0x3000, 0xA1A1, + 0x3001, 0xA1A2, + 0x3002, 0xA1A3, + 0x3003, 0xA1A8, + 0x3005, 0xA1A9, + 0x3008, 0xA1B4, + 0x3009, 0xA1B5, + 0x300A, 0xA1B6, + 0x300B, 0xA1B7, + 0x300C, 0xA1B8, + 0x300D, 0xA1B9, + 0x300E, 0xA1BA, + 0x300F, 0xA1BB, + 0x3010, 0xA1BE, + 0x3011, 0xA1BF, + 0x3013, 0xA1FE, + 0x3014, 0xA1B2, + 0x3015, 0xA1B3, + 0x3016, 0xA1BC, + 0x3017, 0xA1BD, + 0x3041, 0xA4A1, + 0x3042, 0xA4A2, + 0x3043, 0xA4A3, + 0x3044, 0xA4A4, + 0x3045, 0xA4A5, + 0x3046, 0xA4A6, + 0x3047, 0xA4A7, + 0x3048, 0xA4A8, + 0x3049, 0xA4A9, + 0x304A, 0xA4AA, + 0x304B, 0xA4AB, + 0x304C, 0xA4AC, + 0x304D, 0xA4AD, + 0x304E, 0xA4AE, + 0x304F, 0xA4AF, + 0x3050, 0xA4B0, + 0x3051, 0xA4B1, + 0x3052, 0xA4B2, + 0x3053, 0xA4B3, + 0x3054, 0xA4B4, + 0x3055, 0xA4B5, + 0x3056, 0xA4B6, + 0x3057, 0xA4B7, + 0x3058, 0xA4B8, + 0x3059, 0xA4B9, + 0x305A, 0xA4BA, + 0x305B, 0xA4BB, + 0x305C, 0xA4BC, + 0x305D, 0xA4BD, + 0x305E, 0xA4BE, + 0x305F, 0xA4BF, + 0x3060, 0xA4C0, + 0x3061, 0xA4C1, + 0x3062, 0xA4C2, + 0x3063, 0xA4C3, + 0x3064, 0xA4C4, + 0x3065, 0xA4C5, + 0x3066, 0xA4C6, + 0x3067, 0xA4C7, + 0x3068, 0xA4C8, + 0x3069, 0xA4C9, + 0x306A, 0xA4CA, + 0x306B, 0xA4CB, + 0x306C, 0xA4CC, + 0x306D, 0xA4CD, + 0x306E, 0xA4CE, + 0x306F, 0xA4CF, + 0x3070, 0xA4D0, + 0x3071, 0xA4D1, + 0x3072, 0xA4D2, + 0x3073, 0xA4D3, + 0x3074, 0xA4D4, + 0x3075, 0xA4D5, + 0x3076, 0xA4D6, + 0x3077, 0xA4D7, + 0x3078, 0xA4D8, + 0x3079, 0xA4D9, + 0x307A, 0xA4DA, + 0x307B, 0xA4DB, + 0x307C, 0xA4DC, + 0x307D, 0xA4DD, + 0x307E, 0xA4DE, + 0x307F, 0xA4DF, + 0x3080, 0xA4E0, + 0x3081, 0xA4E1, + 0x3082, 0xA4E2, + 0x3083, 0xA4E3, + 0x3084, 0xA4E4, + 0x3085, 0xA4E5, + 0x3086, 0xA4E6, + 0x3087, 0xA4E7, + 0x3088, 0xA4E8, + 0x3089, 0xA4E9, + 0x308A, 0xA4EA, + 0x308B, 0xA4EB, + 0x308C, 0xA4EC, + 0x308D, 0xA4ED, + 0x308E, 0xA4EE, + 0x308F, 0xA4EF, + 0x3090, 0xA4F0, + 0x3091, 0xA4F1, + 0x3092, 0xA4F2, + 0x3093, 0xA4F3, + 0x30A1, 0xA5A1, + 0x30A2, 0xA5A2, + 0x30A3, 0xA5A3, + 0x30A4, 0xA5A4, + 0x30A5, 0xA5A5, + 0x30A6, 0xA5A6, + 0x30A7, 0xA5A7, + 0x30A8, 0xA5A8, + 0x30A9, 0xA5A9, + 0x30AA, 0xA5AA, + 0x30AB, 0xA5AB, + 0x30AC, 0xA5AC, + 0x30AD, 0xA5AD, + 0x30AE, 0xA5AE, + 0x30AF, 0xA5AF, + 0x30B0, 0xA5B0, + 0x30B1, 0xA5B1, + 0x30B2, 0xA5B2, + 0x30B3, 0xA5B3, + 0x30B4, 0xA5B4, + 0x30B5, 0xA5B5, + 0x30B6, 0xA5B6, + 0x30B7, 0xA5B7, + 0x30B8, 0xA5B8, + 0x30B9, 0xA5B9, + 0x30BA, 0xA5BA, + 0x30BB, 0xA5BB, + 0x30BC, 0xA5BC, + 0x30BD, 0xA5BD, + 0x30BE, 0xA5BE, + 0x30BF, 0xA5BF, + 0x30C0, 0xA5C0, + 0x30C1, 0xA5C1, + 0x30C2, 0xA5C2, + 0x30C3, 0xA5C3, + 0x30C4, 0xA5C4, + 0x30C5, 0xA5C5, + 0x30C6, 0xA5C6, + 0x30C7, 0xA5C7, + 0x30C8, 0xA5C8, + 0x30C9, 0xA5C9, + 0x30CA, 0xA5CA, + 0x30CB, 0xA5CB, + 0x30CC, 0xA5CC, + 0x30CD, 0xA5CD, + 0x30CE, 0xA5CE, + 0x30CF, 0xA5CF, + 0x30D0, 0xA5D0, + 0x30D1, 0xA5D1, + 0x30D2, 0xA5D2, + 0x30D3, 0xA5D3, + 0x30D4, 0xA5D4, + 0x30D5, 0xA5D5, + 0x30D6, 0xA5D6, + 0x30D7, 0xA5D7, + 0x30D8, 0xA5D8, + 0x30D9, 0xA5D9, + 0x30DA, 0xA5DA, + 0x30DB, 0xA5DB, + 0x30DC, 0xA5DC, + 0x30DD, 0xA5DD, + 0x30DE, 0xA5DE, + 0x30DF, 0xA5DF, + 0x30E0, 0xA5E0, + 0x30E1, 0xA5E1, + 0x30E2, 0xA5E2, + 0x30E3, 0xA5E3, + 0x30E4, 0xA5E4, + 0x30E5, 0xA5E5, + 0x30E6, 0xA5E6, + 0x30E7, 0xA5E7, + 0x30E8, 0xA5E8, + 0x30E9, 0xA5E9, + 0x30EA, 0xA5EA, + 0x30EB, 0xA5EB, + 0x30EC, 0xA5EC, + 0x30ED, 0xA5ED, + 0x30EE, 0xA5EE, + 0x30EF, 0xA5EF, + 0x30F0, 0xA5F0, + 0x30F1, 0xA5F1, + 0x30F2, 0xA5F2, + 0x30F3, 0xA5F3, + 0x30F4, 0xA5F4, + 0x30F5, 0xA5F5, + 0x30F6, 0xA5F6, + 0x3105, 0xA8C5, + 0x3106, 0xA8C6, + 0x3107, 0xA8C7, + 0x3108, 0xA8C8, + 0x3109, 0xA8C9, + 0x310A, 0xA8CA, + 0x310B, 0xA8CB, + 0x310C, 0xA8CC, + 0x310D, 0xA8CD, + 0x310E, 0xA8CE, + 0x310F, 0xA8CF, + 0x3110, 0xA8D0, + 0x3111, 0xA8D1, + 0x3112, 0xA8D2, + 0x3113, 0xA8D3, + 0x3114, 0xA8D4, + 0x3115, 0xA8D5, + 0x3116, 0xA8D6, + 0x3117, 0xA8D7, + 0x3118, 0xA8D8, + 0x3119, 0xA8D9, + 0x311A, 0xA8DA, + 0x311B, 0xA8DB, + 0x311C, 0xA8DC, + 0x311D, 0xA8DD, + 0x311E, 0xA8DE, + 0x311F, 0xA8DF, + 0x3120, 0xA8E0, + 0x3121, 0xA8E1, + 0x3122, 0xA8E2, + 0x3123, 0xA8E3, + 0x3124, 0xA8E4, + 0x3125, 0xA8E5, + 0x3126, 0xA8E6, + 0x3127, 0xA8E7, + 0x3128, 0xA8E8, + 0x3129, 0xA8E9, + 0x3220, 0xA2E5, + 0x3221, 0xA2E6, + 0x3222, 0xA2E7, + 0x3223, 0xA2E8, + 0x3224, 0xA2E9, + 0x3225, 0xA2EA, + 0x3226, 0xA2EB, + 0x3227, 0xA2EC, + 0x3228, 0xA2ED, + 0x3229, 0xA2EE, + 0x4E00, 0xD2BB, + 0x4E01, 0xB6A1, + 0x4E03, 0xC6DF, + 0x4E07, 0xCDF2, + 0x4E08, 0xD5C9, + 0x4E09, 0xC8FD, + 0x4E0A, 0xC9CF, + 0x4E0B, 0xCFC2, + 0x4E0C, 0xD8A2, + 0x4E0D, 0xB2BB, + 0x4E0E, 0xD3EB, + 0x4E10, 0xD8A4, + 0x4E11, 0xB3F3, + 0x4E13, 0xD7A8, + 0x4E14, 0xC7D2, + 0x4E15, 0xD8A7, + 0x4E16, 0xCAC0, + 0x4E18, 0xC7F0, + 0x4E19, 0xB1FB, + 0x4E1A, 0xD2B5, + 0x4E1B, 0xB4D4, + 0x4E1C, 0xB6AB, + 0x4E1D, 0xCBBF, + 0x4E1E, 0xD8A9, + 0x4E22, 0xB6AA, + 0x4E24, 0xC1BD, + 0x4E25, 0xD1CF, + 0x4E27, 0xC9A5, + 0x4E28, 0xD8AD, + 0x4E2A, 0xB8F6, + 0x4E2B, 0xD1BE, + 0x4E2C, 0xE3DC, + 0x4E2D, 0xD6D0, + 0x4E30, 0xB7E1, + 0x4E32, 0xB4AE, + 0x4E34, 0xC1D9, + 0x4E36, 0xD8BC, + 0x4E38, 0xCDE8, + 0x4E39, 0xB5A4, + 0x4E3A, 0xCEAA, + 0x4E3B, 0xD6F7, + 0x4E3D, 0xC0F6, + 0x4E3E, 0xBED9, + 0x4E3F, 0xD8AF, + 0x4E43, 0xC4CB, + 0x4E45, 0xBEC3, + 0x4E47, 0xD8B1, + 0x4E48, 0xC3B4, + 0x4E49, 0xD2E5, + 0x4E4B, 0xD6AE, + 0x4E4C, 0xCEDA, + 0x4E4D, 0xD5A7, + 0x4E4E, 0xBAF5, + 0x4E4F, 0xB7A6, + 0x4E50, 0xC0D6, + 0x4E52, 0xC6B9, + 0x4E53, 0xC5D2, + 0x4E54, 0xC7C7, + 0x4E56, 0xB9D4, + 0x4E58, 0xB3CB, + 0x4E59, 0xD2D2, + 0x4E5C, 0xD8BF, + 0x4E5D, 0xBEC5, + 0x4E5E, 0xC6F2, + 0x4E5F, 0xD2B2, + 0x4E60, 0xCFB0, + 0x4E61, 0xCFE7, + 0x4E66, 0xCAE9, + 0x4E69, 0xD8C0, + 0x4E70, 0xC2F2, + 0x4E71, 0xC2D2, + 0x4E73, 0xC8E9, + 0x4E7E, 0xC7AC, + 0x4E86, 0xC1CB, + 0x4E88, 0xD3E8, + 0x4E89, 0xD5F9, + 0x4E8B, 0xCAC2, + 0x4E8C, 0xB6FE, + 0x4E8D, 0xD8A1, + 0x4E8E, 0xD3DA, + 0x4E8F, 0xBFF7, + 0x4E91, 0xD4C6, + 0x4E92, 0xBBA5, + 0x4E93, 0xD8C1, + 0x4E94, 0xCEE5, + 0x4E95, 0xBEAE, + 0x4E98, 0xD8A8, + 0x4E9A, 0xD1C7, + 0x4E9B, 0xD0A9, + 0x4E9F, 0xD8BD, + 0x4EA0, 0xD9EF, + 0x4EA1, 0xCDF6, + 0x4EA2, 0xBFBA, + 0x4EA4, 0xBDBB, + 0x4EA5, 0xBAA5, + 0x4EA6, 0xD2E0, + 0x4EA7, 0xB2FA, + 0x4EA8, 0xBAE0, + 0x4EA9, 0xC4B6, + 0x4EAB, 0xCFED, + 0x4EAC, 0xBEA9, + 0x4EAD, 0xCDA4, + 0x4EAE, 0xC1C1, + 0x4EB2, 0xC7D7, + 0x4EB3, 0xD9F1, + 0x4EB5, 0xD9F4, + 0x4EBA, 0xC8CB, + 0x4EBB, 0xD8E9, + 0x4EBF, 0xD2DA, + 0x4EC0, 0xCAB2, + 0x4EC1, 0xC8CA, + 0x4EC2, 0xD8EC, + 0x4EC3, 0xD8EA, + 0x4EC4, 0xD8C6, + 0x4EC5, 0xBDF6, + 0x4EC6, 0xC6CD, + 0x4EC7, 0xB3F0, + 0x4EC9, 0xD8EB, + 0x4ECA, 0xBDF1, + 0x4ECB, 0xBDE9, + 0x4ECD, 0xC8D4, + 0x4ECE, 0xB4D3, + 0x4ED1, 0xC2D8, + 0x4ED3, 0xB2D6, + 0x4ED4, 0xD7D0, + 0x4ED5, 0xCACB, + 0x4ED6, 0xCBFB, + 0x4ED7, 0xD5CC, + 0x4ED8, 0xB8B6, + 0x4ED9, 0xCFC9, + 0x4EDD, 0xD9DA, + 0x4EDE, 0xD8F0, + 0x4EDF, 0xC7AA, + 0x4EE1, 0xD8EE, + 0x4EE3, 0xB4FA, + 0x4EE4, 0xC1EE, + 0x4EE5, 0xD2D4, + 0x4EE8, 0xD8ED, + 0x4EEA, 0xD2C7, + 0x4EEB, 0xD8EF, + 0x4EEC, 0xC3C7, + 0x4EF0, 0xD1F6, + 0x4EF2, 0xD6D9, + 0x4EF3, 0xD8F2, + 0x4EF5, 0xD8F5, + 0x4EF6, 0xBCFE, + 0x4EF7, 0xBCDB, + 0x4EFB, 0xC8CE, + 0x4EFD, 0xB7DD, + 0x4EFF, 0xB7C2, + 0x4F01, 0xC6F3, + 0x4F09, 0xD8F8, + 0x4F0A, 0xD2C1, + 0x4F0D, 0xCEE9, + 0x4F0E, 0xBCBF, + 0x4F0F, 0xB7FC, + 0x4F10, 0xB7A5, + 0x4F11, 0xD0DD, + 0x4F17, 0xD6DA, + 0x4F18, 0xD3C5, + 0x4F19, 0xBBEF, + 0x4F1A, 0xBBE1, + 0x4F1B, 0xD8F1, + 0x4F1E, 0xC9A1, + 0x4F1F, 0xCEB0, + 0x4F20, 0xB4AB, + 0x4F22, 0xD8F3, + 0x4F24, 0xC9CB, + 0x4F25, 0xD8F6, + 0x4F26, 0xC2D7, + 0x4F27, 0xD8F7, + 0x4F2A, 0xCEB1, + 0x4F2B, 0xD8F9, + 0x4F2F, 0xB2AE, + 0x4F30, 0xB9C0, + 0x4F32, 0xD9A3, + 0x4F34, 0xB0E9, + 0x4F36, 0xC1E6, + 0x4F38, 0xC9EC, + 0x4F3A, 0xCBC5, + 0x4F3C, 0xCBC6, + 0x4F3D, 0xD9A4, + 0x4F43, 0xB5E8, + 0x4F46, 0xB5AB, + 0x4F4D, 0xCEBB, + 0x4F4E, 0xB5CD, + 0x4F4F, 0xD7A1, + 0x4F50, 0xD7F4, + 0x4F51, 0xD3D3, + 0x4F53, 0xCCE5, + 0x4F55, 0xBACE, + 0x4F57, 0xD9A2, + 0x4F58, 0xD9DC, + 0x4F59, 0xD3E0, + 0x4F5A, 0xD8FD, + 0x4F5B, 0xB7F0, + 0x4F5C, 0xD7F7, + 0x4F5D, 0xD8FE, + 0x4F5E, 0xD8FA, + 0x4F5F, 0xD9A1, + 0x4F60, 0xC4E3, + 0x4F63, 0xD3B6, + 0x4F64, 0xD8F4, + 0x4F65, 0xD9DD, + 0x4F67, 0xD8FB, + 0x4F69, 0xC5E5, + 0x4F6C, 0xC0D0, + 0x4F6F, 0xD1F0, + 0x4F70, 0xB0DB, + 0x4F73, 0xBCD1, + 0x4F74, 0xD9A6, + 0x4F76, 0xD9A5, + 0x4F7B, 0xD9AC, + 0x4F7C, 0xD9AE, + 0x4F7E, 0xD9AB, + 0x4F7F, 0xCAB9, + 0x4F83, 0xD9A9, + 0x4F84, 0xD6B6, + 0x4F88, 0xB3DE, + 0x4F89, 0xD9A8, + 0x4F8B, 0xC0FD, + 0x4F8D, 0xCACC, + 0x4F8F, 0xD9AA, + 0x4F91, 0xD9A7, + 0x4F94, 0xD9B0, + 0x4F97, 0xB6B1, + 0x4F9B, 0xB9A9, + 0x4F9D, 0xD2C0, + 0x4FA0, 0xCFC0, + 0x4FA3, 0xC2C2, + 0x4FA5, 0xBDC4, + 0x4FA6, 0xD5EC, + 0x4FA7, 0xB2E0, + 0x4FA8, 0xC7C8, + 0x4FA9, 0xBFEB, + 0x4FAA, 0xD9AD, + 0x4FAC, 0xD9AF, + 0x4FAE, 0xCEEA, + 0x4FAF, 0xBAEE, + 0x4FB5, 0xC7D6, + 0x4FBF, 0xB1E3, + 0x4FC3, 0xB4D9, + 0x4FC4, 0xB6ED, + 0x4FC5, 0xD9B4, + 0x4FCA, 0xBFA1, + 0x4FCE, 0xD9DE, + 0x4FCF, 0xC7CE, + 0x4FD0, 0xC0FE, + 0x4FD1, 0xD9B8, + 0x4FD7, 0xCBD7, + 0x4FD8, 0xB7FD, + 0x4FDA, 0xD9B5, + 0x4FDC, 0xD9B7, + 0x4FDD, 0xB1A3, + 0x4FDE, 0xD3E1, + 0x4FDF, 0xD9B9, + 0x4FE1, 0xD0C5, + 0x4FE3, 0xD9B6, + 0x4FE6, 0xD9B1, + 0x4FE8, 0xD9B2, + 0x4FE9, 0xC1A9, + 0x4FEA, 0xD9B3, + 0x4FED, 0xBCF3, + 0x4FEE, 0xD0DE, + 0x4FEF, 0xB8A9, + 0x4FF1, 0xBEE3, + 0x4FF3, 0xD9BD, + 0x4FF8, 0xD9BA, + 0x4FFA, 0xB0B3, + 0x4FFE, 0xD9C2, + 0x500C, 0xD9C4, + 0x500D, 0xB1B6, + 0x500F, 0xD9BF, + 0x5012, 0xB5B9, + 0x5014, 0xBEF3, + 0x5018, 0xCCC8, + 0x5019, 0xBAF2, + 0x501A, 0xD2D0, + 0x501C, 0xD9C3, + 0x501F, 0xBDE8, + 0x5021, 0xB3AB, + 0x5025, 0xD9C5, + 0x5026, 0xBEEB, + 0x5028, 0xD9C6, + 0x5029, 0xD9BB, + 0x502A, 0xC4DF, + 0x502C, 0xD9BE, + 0x502D, 0xD9C1, + 0x502E, 0xD9C0, + 0x503A, 0xD5AE, + 0x503C, 0xD6B5, + 0x503E, 0xC7E3, + 0x5043, 0xD9C8, + 0x5047, 0xBCD9, + 0x5048, 0xD9CA, + 0x504C, 0xD9BC, + 0x504E, 0xD9CB, + 0x504F, 0xC6AB, + 0x5055, 0xD9C9, + 0x505A, 0xD7F6, + 0x505C, 0xCDA3, + 0x5065, 0xBDA1, + 0x506C, 0xD9CC, + 0x5076, 0xC5BC, + 0x5077, 0xCDB5, + 0x507B, 0xD9CD, + 0x507E, 0xD9C7, + 0x507F, 0xB3A5, + 0x5080, 0xBFFE, + 0x5085, 0xB8B5, + 0x5088, 0xC0FC, + 0x508D, 0xB0F8, + 0x50A3, 0xB4F6, + 0x50A5, 0xD9CE, + 0x50A7, 0xD9CF, + 0x50A8, 0xB4A2, + 0x50A9, 0xD9D0, + 0x50AC, 0xB4DF, + 0x50B2, 0xB0C1, + 0x50BA, 0xD9D1, + 0x50BB, 0xC9B5, + 0x50CF, 0xCFF1, + 0x50D6, 0xD9D2, + 0x50DA, 0xC1C5, + 0x50E6, 0xD9D6, + 0x50E7, 0xC9AE, + 0x50EC, 0xD9D5, + 0x50ED, 0xD9D4, + 0x50EE, 0xD9D7, + 0x50F3, 0xCBDB, + 0x50F5, 0xBDA9, + 0x50FB, 0xC6A7, + 0x5106, 0xD9D3, + 0x5107, 0xD9D8, + 0x510B, 0xD9D9, + 0x5112, 0xC8E5, + 0x5121, 0xC0DC, + 0x513F, 0xB6F9, + 0x5140, 0xD8A3, + 0x5141, 0xD4CA, + 0x5143, 0xD4AA, + 0x5144, 0xD0D6, + 0x5145, 0xB3E4, + 0x5146, 0xD5D7, + 0x5148, 0xCFC8, + 0x5149, 0xB9E2, + 0x514B, 0xBFCB, + 0x514D, 0xC3E2, + 0x5151, 0xB6D2, + 0x5154, 0xCDC3, + 0x5155, 0xD9EE, + 0x5156, 0xD9F0, + 0x515A, 0xB5B3, + 0x515C, 0xB6B5, + 0x5162, 0xBEA4, + 0x5165, 0xC8EB, + 0x5168, 0xC8AB, + 0x516B, 0xB0CB, + 0x516C, 0xB9AB, + 0x516D, 0xC1F9, + 0x516E, 0xD9E2, + 0x5170, 0xC0BC, + 0x5171, 0xB9B2, + 0x5173, 0xB9D8, + 0x5174, 0xD0CB, + 0x5175, 0xB1F8, + 0x5176, 0xC6E4, + 0x5177, 0xBEDF, + 0x5178, 0xB5E4, + 0x5179, 0xD7C8, + 0x517B, 0xD1F8, + 0x517C, 0xBCE6, + 0x517D, 0xCADE, + 0x5180, 0xBCBD, + 0x5181, 0xD9E6, + 0x5182, 0xD8E7, + 0x5185, 0xC4DA, + 0x5188, 0xB8D4, + 0x5189, 0xC8BD, + 0x518C, 0xB2E1, + 0x518D, 0xD4D9, + 0x5192, 0xC3B0, + 0x5195, 0xC3E1, + 0x5196, 0xDAA2, + 0x5197, 0xC8DF, + 0x5199, 0xD0B4, + 0x519B, 0xBEFC, + 0x519C, 0xC5A9, + 0x51A0, 0xB9DA, + 0x51A2, 0xDAA3, + 0x51A4, 0xD4A9, + 0x51A5, 0xDAA4, + 0x51AB, 0xD9FB, + 0x51AC, 0xB6AC, + 0x51AF, 0xB7EB, + 0x51B0, 0xB1F9, + 0x51B1, 0xD9FC, + 0x51B2, 0xB3E5, + 0x51B3, 0xBEF6, + 0x51B5, 0xBFF6, + 0x51B6, 0xD2B1, + 0x51B7, 0xC0E4, + 0x51BB, 0xB6B3, + 0x51BC, 0xD9FE, + 0x51BD, 0xD9FD, + 0x51C0, 0xBEBB, + 0x51C4, 0xC6E0, + 0x51C6, 0xD7BC, + 0x51C7, 0xDAA1, + 0x51C9, 0xC1B9, + 0x51CB, 0xB5F2, + 0x51CC, 0xC1E8, + 0x51CF, 0xBCF5, + 0x51D1, 0xB4D5, + 0x51DB, 0xC1DD, + 0x51DD, 0xC4FD, + 0x51E0, 0xBCB8, + 0x51E1, 0xB7B2, + 0x51E4, 0xB7EF, + 0x51EB, 0xD9EC, + 0x51ED, 0xC6BE, + 0x51EF, 0xBFAD, + 0x51F0, 0xBBCB, + 0x51F3, 0xB5CA, + 0x51F5, 0xDBC9, + 0x51F6, 0xD0D7, + 0x51F8, 0xCDB9, + 0x51F9, 0xB0BC, + 0x51FA, 0xB3F6, + 0x51FB, 0xBBF7, + 0x51FC, 0xDBCA, + 0x51FD, 0xBAAF, + 0x51FF, 0xD4E4, + 0x5200, 0xB5B6, + 0x5201, 0xB5F3, + 0x5202, 0xD8D6, + 0x5203, 0xC8D0, + 0x5206, 0xB7D6, + 0x5207, 0xC7D0, + 0x5208, 0xD8D7, + 0x520A, 0xBFAF, + 0x520D, 0xDBBB, + 0x520E, 0xD8D8, + 0x5211, 0xD0CC, + 0x5212, 0xBBAE, + 0x5216, 0xEBBE, + 0x5217, 0xC1D0, + 0x5218, 0xC1F5, + 0x5219, 0xD4F2, + 0x521A, 0xB8D5, + 0x521B, 0xB4B4, + 0x521D, 0xB3F5, + 0x5220, 0xC9BE, + 0x5224, 0xC5D0, + 0x5228, 0xC5D9, + 0x5229, 0xC0FB, + 0x522B, 0xB1F0, + 0x522D, 0xD8D9, + 0x522E, 0xB9CE, + 0x5230, 0xB5BD, + 0x5233, 0xD8DA, + 0x5236, 0xD6C6, + 0x5237, 0xCBA2, + 0x5238, 0xC8AF, + 0x5239, 0xC9B2, + 0x523A, 0xB4CC, + 0x523B, 0xBFCC, + 0x523D, 0xB9F4, + 0x523F, 0xD8DB, + 0x5240, 0xD8DC, + 0x5241, 0xB6E7, + 0x5242, 0xBCC1, + 0x5243, 0xCCEA, + 0x524A, 0xCFF7, + 0x524C, 0xD8DD, + 0x524D, 0xC7B0, + 0x5250, 0xB9D0, + 0x5251, 0xBDA3, + 0x5254, 0xCCDE, + 0x5256, 0xC6CA, + 0x525C, 0xD8E0, + 0x525E, 0xD8DE, + 0x5261, 0xD8DF, + 0x5265, 0xB0FE, + 0x5267, 0xBEE7, + 0x5269, 0xCAA3, + 0x526A, 0xBCF4, + 0x526F, 0xB8B1, + 0x5272, 0xB8EE, + 0x527D, 0xD8E2, + 0x527F, 0xBDCB, + 0x5281, 0xD8E4, + 0x5282, 0xD8E3, + 0x5288, 0xC5FC, + 0x5290, 0xD8E5, + 0x5293, 0xD8E6, + 0x529B, 0xC1A6, + 0x529D, 0xC8B0, + 0x529E, 0xB0EC, + 0x529F, 0xB9A6, + 0x52A0, 0xBCD3, + 0x52A1, 0xCEF1, + 0x52A2, 0xDBBD, + 0x52A3, 0xC1D3, + 0x52A8, 0xB6AF, + 0x52A9, 0xD6FA, + 0x52AA, 0xC5AC, + 0x52AB, 0xBDD9, + 0x52AC, 0xDBBE, + 0x52AD, 0xDBBF, + 0x52B1, 0xC0F8, + 0x52B2, 0xBEA2, + 0x52B3, 0xC0CD, + 0x52BE, 0xDBC0, + 0x52BF, 0xCAC6, + 0x52C3, 0xB2AA, + 0x52C7, 0xD3C2, + 0x52C9, 0xC3E3, + 0x52CB, 0xD1AB, + 0x52D0, 0xDBC2, + 0x52D2, 0xC0D5, + 0x52D6, 0xDBC3, + 0x52D8, 0xBFB1, + 0x52DF, 0xC4BC, + 0x52E4, 0xC7DA, + 0x52F0, 0xDBC4, + 0x52F9, 0xD9E8, + 0x52FA, 0xC9D7, + 0x52FE, 0xB9B4, + 0x52FF, 0xCEF0, + 0x5300, 0xD4C8, + 0x5305, 0xB0FC, + 0x5306, 0xB4D2, + 0x5308, 0xD0D9, + 0x530D, 0xD9E9, + 0x530F, 0xDECB, + 0x5310, 0xD9EB, + 0x5315, 0xD8B0, + 0x5316, 0xBBAF, + 0x5317, 0xB1B1, + 0x5319, 0xB3D7, + 0x531A, 0xD8CE, + 0x531D, 0xD4D1, + 0x5320, 0xBDB3, + 0x5321, 0xBFEF, + 0x5323, 0xCFBB, + 0x5326, 0xD8D0, + 0x532A, 0xB7CB, + 0x532E, 0xD8D1, + 0x5339, 0xC6A5, + 0x533A, 0xC7F8, + 0x533B, 0xD2BD, + 0x533E, 0xD8D2, + 0x533F, 0xC4E4, + 0x5341, 0xCAAE, + 0x5343, 0xC7A7, + 0x5345, 0xD8A6, + 0x5347, 0xC9FD, + 0x5348, 0xCEE7, + 0x5349, 0xBBDC, + 0x534A, 0xB0EB, + 0x534E, 0xBBAA, + 0x534F, 0xD0AD, + 0x5351, 0xB1B0, + 0x5352, 0xD7E4, + 0x5353, 0xD7BF, + 0x5355, 0xB5A5, + 0x5356, 0xC2F4, + 0x5357, 0xC4CF, + 0x535A, 0xB2A9, + 0x535C, 0xB2B7, + 0x535E, 0xB1E5, + 0x535F, 0xDFB2, + 0x5360, 0xD5BC, + 0x5361, 0xBFA8, + 0x5362, 0xC2AC, + 0x5363, 0xD8D5, + 0x5364, 0xC2B1, + 0x5366, 0xD8D4, + 0x5367, 0xCED4, + 0x5369, 0xDAE0, + 0x536B, 0xCEC0, + 0x536E, 0xD8B4, + 0x536F, 0xC3AE, + 0x5370, 0xD3A1, + 0x5371, 0xCEA3, + 0x5373, 0xBCB4, + 0x5374, 0xC8B4, + 0x5375, 0xC2D1, + 0x5377, 0xBEED, + 0x5378, 0xD0B6, + 0x537A, 0xDAE1, + 0x537F, 0xC7E4, + 0x5382, 0xB3A7, + 0x5384, 0xB6F2, + 0x5385, 0xCCFC, + 0x5386, 0xC0FA, + 0x5389, 0xC0F7, + 0x538B, 0xD1B9, + 0x538C, 0xD1E1, + 0x538D, 0xD8C7, + 0x5395, 0xB2DE, + 0x5398, 0xC0E5, + 0x539A, 0xBAF1, + 0x539D, 0xD8C8, + 0x539F, 0xD4AD, + 0x53A2, 0xCFE1, + 0x53A3, 0xD8C9, + 0x53A5, 0xD8CA, + 0x53A6, 0xCFC3, + 0x53A8, 0xB3F8, + 0x53A9, 0xBEC7, + 0x53AE, 0xD8CB, + 0x53B6, 0xDBCC, + 0x53BB, 0xC8A5, + 0x53BF, 0xCFD8, + 0x53C1, 0xC8FE, + 0x53C2, 0xB2CE, + 0x53C8, 0xD3D6, + 0x53C9, 0xB2E6, + 0x53CA, 0xBCB0, + 0x53CB, 0xD3D1, + 0x53CC, 0xCBAB, + 0x53CD, 0xB7B4, + 0x53D1, 0xB7A2, + 0x53D4, 0xCAE5, + 0x53D6, 0xC8A1, + 0x53D7, 0xCADC, + 0x53D8, 0xB1E4, + 0x53D9, 0xD0F0, + 0x53DB, 0xC5D1, + 0x53DF, 0xDBC5, + 0x53E0, 0xB5FE, + 0x53E3, 0xBFDA, + 0x53E4, 0xB9C5, + 0x53E5, 0xBEE4, + 0x53E6, 0xC1ED, + 0x53E8, 0xDFB6, + 0x53E9, 0xDFB5, + 0x53EA, 0xD6BB, + 0x53EB, 0xBDD0, + 0x53EC, 0xD5D9, + 0x53ED, 0xB0C8, + 0x53EE, 0xB6A3, + 0x53EF, 0xBFC9, + 0x53F0, 0xCCA8, + 0x53F1, 0xDFB3, + 0x53F2, 0xCAB7, + 0x53F3, 0xD3D2, + 0x53F5, 0xD8CF, + 0x53F6, 0xD2B6, + 0x53F7, 0xBAC5, + 0x53F8, 0xCBBE, + 0x53F9, 0xCCBE, + 0x53FB, 0xDFB7, + 0x53FC, 0xB5F0, + 0x53FD, 0xDFB4, + 0x5401, 0xD3F5, + 0x5403, 0xB3D4, + 0x5404, 0xB8F7, + 0x5406, 0xDFBA, + 0x5408, 0xBACF, + 0x5409, 0xBCAA, + 0x540A, 0xB5F5, + 0x540C, 0xCDAC, + 0x540D, 0xC3FB, + 0x540E, 0xBAF3, + 0x540F, 0xC0F4, + 0x5410, 0xCDC2, + 0x5411, 0xCFF2, + 0x5412, 0xDFB8, + 0x5413, 0xCFC5, + 0x5415, 0xC2C0, + 0x5416, 0xDFB9, + 0x5417, 0xC2F0, + 0x541B, 0xBEFD, + 0x541D, 0xC1DF, + 0x541E, 0xCDCC, + 0x541F, 0xD2F7, + 0x5420, 0xB7CD, + 0x5421, 0xDFC1, + 0x5423, 0xDFC4, + 0x5426, 0xB7F1, + 0x5427, 0xB0C9, + 0x5428, 0xB6D6, + 0x5429, 0xB7D4, + 0x542B, 0xBAAC, + 0x542C, 0xCCFD, + 0x542D, 0xBFD4, + 0x542E, 0xCBB1, + 0x542F, 0xC6F4, + 0x5431, 0xD6A8, + 0x5432, 0xDFC5, + 0x5434, 0xCEE2, + 0x5435, 0xB3B3, + 0x5438, 0xCEFC, + 0x5439, 0xB4B5, + 0x543B, 0xCEC7, + 0x543C, 0xBAF0, + 0x543E, 0xCEE1, + 0x5440, 0xD1BD, + 0x5443, 0xDFC0, + 0x5446, 0xB4F4, + 0x5448, 0xB3CA, + 0x544A, 0xB8E6, + 0x544B, 0xDFBB, + 0x5450, 0xC4C5, + 0x5452, 0xDFBC, + 0x5453, 0xDFBD, + 0x5454, 0xDFBE, + 0x5455, 0xC5BB, + 0x5456, 0xDFBF, + 0x5457, 0xDFC2, + 0x5458, 0xD4B1, + 0x5459, 0xDFC3, + 0x545B, 0xC7BA, + 0x545C, 0xCED8, + 0x5462, 0xC4D8, + 0x5464, 0xDFCA, + 0x5466, 0xDFCF, + 0x5468, 0xD6DC, + 0x5471, 0xDFC9, + 0x5472, 0xDFDA, + 0x5473, 0xCEB6, + 0x5475, 0xBAC7, + 0x5476, 0xDFCE, + 0x5477, 0xDFC8, + 0x5478, 0xC5DE, + 0x547B, 0xC9EB, + 0x547C, 0xBAF4, + 0x547D, 0xC3FC, + 0x5480, 0xBED7, + 0x5482, 0xDFC6, + 0x5484, 0xDFCD, + 0x5486, 0xC5D8, + 0x548B, 0xD5A6, + 0x548C, 0xBACD, + 0x548E, 0xBECC, + 0x548F, 0xD3BD, + 0x5490, 0xB8C0, + 0x5492, 0xD6E4, + 0x5494, 0xDFC7, + 0x5495, 0xB9BE, + 0x5496, 0xBFA7, + 0x5499, 0xC1FC, + 0x549A, 0xDFCB, + 0x549B, 0xDFCC, + 0x549D, 0xDFD0, + 0x54A3, 0xDFDB, + 0x54A4, 0xDFE5, + 0x54A6, 0xDFD7, + 0x54A7, 0xDFD6, + 0x54A8, 0xD7C9, + 0x54A9, 0xDFE3, + 0x54AA, 0xDFE4, + 0x54AB, 0xE5EB, + 0x54AC, 0xD2A7, + 0x54AD, 0xDFD2, + 0x54AF, 0xBFA9, + 0x54B1, 0xD4DB, + 0x54B3, 0xBFC8, + 0x54B4, 0xDFD4, + 0x54B8, 0xCFCC, + 0x54BB, 0xDFDD, + 0x54BD, 0xD1CA, + 0x54BF, 0xDFDE, + 0x54C0, 0xB0A7, + 0x54C1, 0xC6B7, + 0x54C2, 0xDFD3, + 0x54C4, 0xBAE5, + 0x54C6, 0xB6DF, + 0x54C7, 0xCDDB, + 0x54C8, 0xB9FE, + 0x54C9, 0xD4D5, + 0x54CC, 0xDFDF, + 0x54CD, 0xCFEC, + 0x54CE, 0xB0A5, + 0x54CF, 0xDFE7, + 0x54D0, 0xDFD1, + 0x54D1, 0xD1C6, + 0x54D2, 0xDFD5, + 0x54D3, 0xDFD8, + 0x54D4, 0xDFD9, + 0x54D5, 0xDFDC, + 0x54D7, 0xBBA9, + 0x54D9, 0xDFE0, + 0x54DA, 0xDFE1, + 0x54DC, 0xDFE2, + 0x54DD, 0xDFE6, + 0x54DE, 0xDFE8, + 0x54DF, 0xD3B4, + 0x54E5, 0xB8E7, + 0x54E6, 0xC5B6, + 0x54E7, 0xDFEA, + 0x54E8, 0xC9DA, + 0x54E9, 0xC1A8, + 0x54EA, 0xC4C4, + 0x54ED, 0xBFDE, + 0x54EE, 0xCFF8, + 0x54F2, 0xD5DC, + 0x54F3, 0xDFEE, + 0x54FA, 0xB2B8, + 0x54FC, 0xBADF, + 0x54FD, 0xDFEC, + 0x54FF, 0xDBC1, + 0x5501, 0xD1E4, + 0x5506, 0xCBF4, + 0x5507, 0xB4BD, + 0x5509, 0xB0A6, + 0x550F, 0xDFF1, + 0x5510, 0xCCC6, + 0x5511, 0xDFF2, + 0x5514, 0xDFED, + 0x551B, 0xDFE9, + 0x5520, 0xDFEB, + 0x5522, 0xDFEF, + 0x5523, 0xDFF0, + 0x5524, 0xBBBD, + 0x5527, 0xDFF3, + 0x552A, 0xDFF4, + 0x552C, 0xBBA3, + 0x552E, 0xCADB, + 0x552F, 0xCEA8, + 0x5530, 0xE0A7, + 0x5531, 0xB3AA, + 0x5533, 0xE0A6, + 0x5537, 0xE0A1, + 0x553C, 0xDFFE, + 0x553E, 0xCDD9, + 0x553F, 0xDFFC, + 0x5541, 0xDFFA, + 0x5543, 0xBFD0, + 0x5544, 0xD7C4, + 0x5546, 0xC9CC, + 0x5549, 0xDFF8, + 0x554A, 0xB0A1, + 0x5550, 0xDFFD, + 0x5555, 0xDFFB, + 0x5556, 0xE0A2, + 0x555C, 0xE0A8, + 0x5561, 0xB7C8, + 0x5564, 0xC6A1, + 0x5565, 0xC9B6, + 0x5566, 0xC0B2, + 0x5567, 0xDFF5, + 0x556A, 0xC5BE, + 0x556C, 0xD8C4, + 0x556D, 0xDFF9, + 0x556E, 0xC4F6, + 0x5575, 0xE0A3, + 0x5576, 0xE0A4, + 0x5577, 0xE0A5, + 0x5578, 0xD0A5, + 0x557B, 0xE0B4, + 0x557C, 0xCCE4, + 0x557E, 0xE0B1, + 0x5580, 0xBFA6, + 0x5581, 0xE0AF, + 0x5582, 0xCEB9, + 0x5583, 0xE0AB, + 0x5584, 0xC9C6, + 0x5587, 0xC0AE, + 0x5588, 0xE0AE, + 0x5589, 0xBAED, + 0x558A, 0xBAB0, + 0x558B, 0xE0A9, + 0x558F, 0xDFF6, + 0x5591, 0xE0B3, + 0x5594, 0xE0B8, + 0x5598, 0xB4AD, + 0x5599, 0xE0B9, + 0x559C, 0xCFB2, + 0x559D, 0xBAC8, + 0x559F, 0xE0B0, + 0x55A7, 0xD0FA, + 0x55B1, 0xE0AC, + 0x55B3, 0xD4FB, + 0x55B5, 0xDFF7, + 0x55B7, 0xC5E7, + 0x55B9, 0xE0AD, + 0x55BB, 0xD3F7, + 0x55BD, 0xE0B6, + 0x55BE, 0xE0B7, + 0x55C4, 0xE0C4, + 0x55C5, 0xD0E1, + 0x55C9, 0xE0BC, + 0x55CC, 0xE0C9, + 0x55CD, 0xE0CA, + 0x55D1, 0xE0BE, + 0x55D2, 0xE0AA, + 0x55D3, 0xC9A4, + 0x55D4, 0xE0C1, + 0x55D6, 0xE0B2, + 0x55DC, 0xCAC8, + 0x55DD, 0xE0C3, + 0x55DF, 0xE0B5, + 0x55E1, 0xCECB, + 0x55E3, 0xCBC3, + 0x55E4, 0xE0CD, + 0x55E5, 0xE0C6, + 0x55E6, 0xE0C2, + 0x55E8, 0xE0CB, + 0x55EA, 0xE0BA, + 0x55EB, 0xE0BF, + 0x55EC, 0xE0C0, + 0x55EF, 0xE0C5, + 0x55F2, 0xE0C7, + 0x55F3, 0xE0C8, + 0x55F5, 0xE0CC, + 0x55F7, 0xE0BB, + 0x55FD, 0xCBD4, + 0x55FE, 0xE0D5, + 0x5600, 0xE0D6, + 0x5601, 0xE0D2, + 0x5608, 0xE0D0, + 0x5609, 0xBCCE, + 0x560C, 0xE0D1, + 0x560E, 0xB8C2, + 0x560F, 0xD8C5, + 0x5618, 0xD0EA, + 0x561B, 0xC2EF, + 0x561E, 0xE0CF, + 0x561F, 0xE0BD, + 0x5623, 0xE0D4, + 0x5624, 0xE0D3, + 0x5627, 0xE0D7, + 0x562C, 0xE0DC, + 0x562D, 0xE0D8, + 0x5631, 0xD6F6, + 0x5632, 0xB3B0, + 0x5634, 0xD7EC, + 0x5636, 0xCBBB, + 0x5639, 0xE0DA, + 0x563B, 0xCEFB, + 0x563F, 0xBAD9, + 0x564C, 0xE0E1, + 0x564D, 0xE0DD, + 0x564E, 0xD2AD, + 0x5654, 0xE0E2, + 0x5657, 0xE0DB, + 0x5658, 0xE0D9, + 0x5659, 0xE0DF, + 0x565C, 0xE0E0, + 0x5662, 0xE0DE, + 0x5664, 0xE0E4, + 0x5668, 0xC6F7, + 0x5669, 0xD8AC, + 0x566A, 0xD4EB, + 0x566B, 0xE0E6, + 0x566C, 0xCAC9, + 0x5671, 0xE0E5, + 0x5676, 0xB8C1, + 0x567B, 0xE0E7, + 0x567C, 0xE0E8, + 0x5685, 0xE0E9, + 0x5686, 0xE0E3, + 0x568E, 0xBABF, + 0x568F, 0xCCE7, + 0x5693, 0xE0EA, + 0x56A3, 0xCFF9, + 0x56AF, 0xE0EB, + 0x56B7, 0xC8C2, + 0x56BC, 0xBDC0, + 0x56CA, 0xC4D2, + 0x56D4, 0xE0EC, + 0x56D7, 0xE0ED, + 0x56DA, 0xC7F4, + 0x56DB, 0xCBC4, + 0x56DD, 0xE0EE, + 0x56DE, 0xBBD8, + 0x56DF, 0xD8B6, + 0x56E0, 0xD2F2, + 0x56E1, 0xE0EF, + 0x56E2, 0xCDC5, + 0x56E4, 0xB6DA, + 0x56EB, 0xE0F1, + 0x56ED, 0xD4B0, + 0x56F0, 0xC0A7, + 0x56F1, 0xB4D1, + 0x56F4, 0xCEA7, + 0x56F5, 0xE0F0, + 0x56F9, 0xE0F2, + 0x56FA, 0xB9CC, + 0x56FD, 0xB9FA, + 0x56FE, 0xCDBC, + 0x56FF, 0xE0F3, + 0x5703, 0xC6D4, + 0x5704, 0xE0F4, + 0x5706, 0xD4B2, + 0x5708, 0xC8A6, + 0x5709, 0xE0F6, + 0x570A, 0xE0F5, + 0x571C, 0xE0F7, + 0x571F, 0xCDC1, + 0x5723, 0xCAA5, + 0x5728, 0xD4DA, + 0x5729, 0xDBD7, + 0x572A, 0xDBD9, + 0x572C, 0xDBD8, + 0x572D, 0xB9E7, + 0x572E, 0xDBDC, + 0x572F, 0xDBDD, + 0x5730, 0xB5D8, + 0x5733, 0xDBDA, + 0x5739, 0xDBDB, + 0x573A, 0xB3A1, + 0x573B, 0xDBDF, + 0x573E, 0xBBF8, + 0x5740, 0xD6B7, + 0x5742, 0xDBE0, + 0x5747, 0xBEF9, + 0x574A, 0xB7BB, + 0x574C, 0xDBD0, + 0x574D, 0xCCAE, + 0x574E, 0xBFB2, + 0x574F, 0xBBB5, + 0x5750, 0xD7F8, + 0x5751, 0xBFD3, + 0x5757, 0xBFE9, + 0x575A, 0xBCE1, + 0x575B, 0xCCB3, + 0x575C, 0xDBDE, + 0x575D, 0xB0D3, + 0x575E, 0xCEEB, + 0x575F, 0xB7D8, + 0x5760, 0xD7B9, + 0x5761, 0xC6C2, + 0x5764, 0xC0A4, + 0x5766, 0xCCB9, + 0x5768, 0xDBE7, + 0x5769, 0xDBE1, + 0x576A, 0xC6BA, + 0x576B, 0xDBE3, + 0x576D, 0xDBE8, + 0x576F, 0xC5F7, + 0x5773, 0xDBEA, + 0x5776, 0xDBE9, + 0x5777, 0xBFC0, + 0x577B, 0xDBE6, + 0x577C, 0xDBE5, + 0x5782, 0xB4B9, + 0x5783, 0xC0AC, + 0x5784, 0xC2A2, + 0x5785, 0xDBE2, + 0x5786, 0xDBE4, + 0x578B, 0xD0CD, + 0x578C, 0xDBED, + 0x5792, 0xC0DD, + 0x5793, 0xDBF2, + 0x579B, 0xB6E2, + 0x57A0, 0xDBF3, + 0x57A1, 0xDBD2, + 0x57A2, 0xB9B8, + 0x57A3, 0xD4AB, + 0x57A4, 0xDBEC, + 0x57A6, 0xBFD1, + 0x57A7, 0xDBF0, + 0x57A9, 0xDBD1, + 0x57AB, 0xB5E6, + 0x57AD, 0xDBEB, + 0x57AE, 0xBFE5, + 0x57B2, 0xDBEE, + 0x57B4, 0xDBF1, + 0x57B8, 0xDBF9, + 0x57C2, 0xB9A1, + 0x57C3, 0xB0A3, + 0x57CB, 0xC2F1, + 0x57CE, 0xB3C7, + 0x57CF, 0xDBEF, + 0x57D2, 0xDBF8, + 0x57D4, 0xC6D2, + 0x57D5, 0xDBF4, + 0x57D8, 0xDBF5, + 0x57D9, 0xDBF7, + 0x57DA, 0xDBF6, + 0x57DD, 0xDBFE, + 0x57DF, 0xD3F2, + 0x57E0, 0xB2BA, + 0x57E4, 0xDBFD, + 0x57ED, 0xDCA4, + 0x57EF, 0xDBFB, + 0x57F4, 0xDBFA, + 0x57F8, 0xDBFC, + 0x57F9, 0xC5E0, + 0x57FA, 0xBBF9, + 0x57FD, 0xDCA3, + 0x5800, 0xDCA5, + 0x5802, 0xCCC3, + 0x5806, 0xB6D1, + 0x5807, 0xDDC0, + 0x580B, 0xDCA1, + 0x580D, 0xDCA2, + 0x5811, 0xC7B5, + 0x5815, 0xB6E9, + 0x5819, 0xDCA7, + 0x581E, 0xDCA6, + 0x5820, 0xDCA9, + 0x5821, 0xB1A4, + 0x5824, 0xB5CC, + 0x582A, 0xBFB0, + 0x5830, 0xD1DF, + 0x5835, 0xB6C2, + 0x5844, 0xDCA8, + 0x584C, 0xCBFA, + 0x584D, 0xEBF3, + 0x5851, 0xCBDC, + 0x5854, 0xCBFE, + 0x5858, 0xCCC1, + 0x585E, 0xC8FB, + 0x5865, 0xDCAA, + 0x586B, 0xCCEE, + 0x586C, 0xDCAB, + 0x587E, 0xDBD3, + 0x5880, 0xDCAF, + 0x5881, 0xDCAC, + 0x5883, 0xBEB3, + 0x5885, 0xCAFB, + 0x5889, 0xDCAD, + 0x5892, 0xC9CA, + 0x5893, 0xC4B9, + 0x5899, 0xC7BD, + 0x589A, 0xDCAE, + 0x589E, 0xD4F6, + 0x589F, 0xD0E6, + 0x58A8, 0xC4AB, + 0x58A9, 0xB6D5, + 0x58BC, 0xDBD4, + 0x58C1, 0xB1DA, + 0x58C5, 0xDBD5, + 0x58D1, 0xDBD6, + 0x58D5, 0xBABE, + 0x58E4, 0xC8C0, + 0x58EB, 0xCABF, + 0x58EC, 0xC8C9, + 0x58EE, 0xD7B3, + 0x58F0, 0xC9F9, + 0x58F3, 0xBFC7, + 0x58F6, 0xBAF8, + 0x58F9, 0xD2BC, + 0x5902, 0xE2BA, + 0x5904, 0xB4A6, + 0x5907, 0xB1B8, + 0x590D, 0xB8B4, + 0x590F, 0xCFC4, + 0x5914, 0xD9E7, + 0x5915, 0xCFA6, + 0x5916, 0xCDE2, + 0x5919, 0xD9ED, + 0x591A, 0xB6E0, + 0x591C, 0xD2B9, + 0x591F, 0xB9BB, + 0x5924, 0xE2B9, + 0x5925, 0xE2B7, + 0x5927, 0xB4F3, + 0x5929, 0xCCEC, + 0x592A, 0xCCAB, + 0x592B, 0xB7F2, + 0x592D, 0xD8B2, + 0x592E, 0xD1EB, + 0x592F, 0xBABB, + 0x5931, 0xCAA7, + 0x5934, 0xCDB7, + 0x5937, 0xD2C4, + 0x5938, 0xBFE4, + 0x5939, 0xBCD0, + 0x593A, 0xB6E1, + 0x593C, 0xDEC5, + 0x5941, 0xDEC6, + 0x5942, 0xDBBC, + 0x5944, 0xD1D9, + 0x5947, 0xC6E6, + 0x5948, 0xC4CE, + 0x5949, 0xB7EE, + 0x594B, 0xB7DC, + 0x594E, 0xBFFC, + 0x594F, 0xD7E0, + 0x5951, 0xC6F5, + 0x5954, 0xB1BC, + 0x5955, 0xDEC8, + 0x5956, 0xBDB1, + 0x5957, 0xCCD7, + 0x5958, 0xDECA, + 0x595A, 0xDEC9, + 0x5960, 0xB5EC, + 0x5962, 0xC9DD, + 0x5965, 0xB0C2, + 0x5973, 0xC5AE, + 0x5974, 0xC5AB, + 0x5976, 0xC4CC, + 0x5978, 0xBCE9, + 0x5979, 0xCBFD, + 0x597D, 0xBAC3, + 0x5981, 0xE5F9, + 0x5982, 0xC8E7, + 0x5983, 0xE5FA, + 0x5984, 0xCDFD, + 0x5986, 0xD7B1, + 0x5987, 0xB8BE, + 0x5988, 0xC2E8, + 0x598A, 0xC8D1, + 0x598D, 0xE5FB, + 0x5992, 0xB6CA, + 0x5993, 0xBCCB, + 0x5996, 0xD1FD, + 0x5997, 0xE6A1, + 0x5999, 0xC3EE, + 0x599E, 0xE6A4, + 0x59A3, 0xE5FE, + 0x59A4, 0xE6A5, + 0x59A5, 0xCDD7, + 0x59A8, 0xB7C1, + 0x59A9, 0xE5FC, + 0x59AA, 0xE5FD, + 0x59AB, 0xE6A3, + 0x59AE, 0xC4DD, + 0x59AF, 0xE6A8, + 0x59B2, 0xE6A7, + 0x59B9, 0xC3C3, + 0x59BB, 0xC6DE, + 0x59BE, 0xE6AA, + 0x59C6, 0xC4B7, + 0x59CA, 0xE6A2, + 0x59CB, 0xCABC, + 0x59D0, 0xBDE3, + 0x59D1, 0xB9C3, + 0x59D2, 0xE6A6, + 0x59D3, 0xD0D5, + 0x59D4, 0xCEAF, + 0x59D7, 0xE6A9, + 0x59D8, 0xE6B0, + 0x59DA, 0xD2A6, + 0x59DC, 0xBDAA, + 0x59DD, 0xE6AD, + 0x59E3, 0xE6AF, + 0x59E5, 0xC0D1, + 0x59E8, 0xD2CC, + 0x59EC, 0xBCA7, + 0x59F9, 0xE6B1, + 0x59FB, 0xD2F6, + 0x59FF, 0xD7CB, + 0x5A01, 0xCDFE, + 0x5A03, 0xCDDE, + 0x5A04, 0xC2A6, + 0x5A05, 0xE6AB, + 0x5A06, 0xE6AC, + 0x5A07, 0xBDBF, + 0x5A08, 0xE6AE, + 0x5A09, 0xE6B3, + 0x5A0C, 0xE6B2, + 0x5A11, 0xE6B6, + 0x5A13, 0xE6B8, + 0x5A18, 0xC4EF, + 0x5A1C, 0xC4C8, + 0x5A1F, 0xBEEA, + 0x5A20, 0xC9EF, + 0x5A23, 0xE6B7, + 0x5A25, 0xB6F0, + 0x5A29, 0xC3E4, + 0x5A31, 0xD3E9, + 0x5A32, 0xE6B4, + 0x5A34, 0xE6B5, + 0x5A36, 0xC8A2, + 0x5A3C, 0xE6BD, + 0x5A40, 0xE6B9, + 0x5A46, 0xC6C5, + 0x5A49, 0xCDF1, + 0x5A4A, 0xE6BB, + 0x5A55, 0xE6BC, + 0x5A5A, 0xBBE9, + 0x5A62, 0xE6BE, + 0x5A67, 0xE6BA, + 0x5A6A, 0xC0B7, + 0x5A74, 0xD3A4, + 0x5A75, 0xE6BF, + 0x5A76, 0xC9F4, + 0x5A77, 0xE6C3, + 0x5A7A, 0xE6C4, + 0x5A7F, 0xD0F6, + 0x5A92, 0xC3BD, + 0x5A9A, 0xC3C4, + 0x5A9B, 0xE6C2, + 0x5AAA, 0xE6C1, + 0x5AB2, 0xE6C7, + 0x5AB3, 0xCFB1, + 0x5AB5, 0xEBF4, + 0x5AB8, 0xE6CA, + 0x5ABE, 0xE6C5, + 0x5AC1, 0xBCDE, + 0x5AC2, 0xC9A9, + 0x5AC9, 0xBCB5, + 0x5ACC, 0xCFD3, + 0x5AD2, 0xE6C8, + 0x5AD4, 0xE6C9, + 0x5AD6, 0xE6CE, + 0x5AD8, 0xE6D0, + 0x5ADC, 0xE6D1, + 0x5AE0, 0xE6CB, + 0x5AE1, 0xB5D5, + 0x5AE3, 0xE6CC, + 0x5AE6, 0xE6CF, + 0x5AE9, 0xC4DB, + 0x5AEB, 0xE6C6, + 0x5AF1, 0xE6CD, + 0x5B09, 0xE6D2, + 0x5B16, 0xE6D4, + 0x5B17, 0xE6D3, + 0x5B32, 0xE6D5, + 0x5B34, 0xD9F8, + 0x5B37, 0xE6D6, + 0x5B40, 0xE6D7, + 0x5B50, 0xD7D3, + 0x5B51, 0xE6DD, + 0x5B53, 0xE6DE, + 0x5B54, 0xBFD7, + 0x5B55, 0xD4D0, + 0x5B57, 0xD7D6, + 0x5B58, 0xB4E6, + 0x5B59, 0xCBEF, + 0x5B5A, 0xE6DA, + 0x5B5B, 0xD8C3, + 0x5B5C, 0xD7CE, + 0x5B5D, 0xD0A2, + 0x5B5F, 0xC3CF, + 0x5B62, 0xE6DF, + 0x5B63, 0xBCBE, + 0x5B64, 0xB9C2, + 0x5B65, 0xE6DB, + 0x5B66, 0xD1A7, + 0x5B69, 0xBAA2, + 0x5B6A, 0xC2CF, + 0x5B6C, 0xD8AB, + 0x5B70, 0xCAEB, + 0x5B71, 0xE5EE, + 0x5B73, 0xE6DC, + 0x5B75, 0xB7F5, + 0x5B7A, 0xC8E6, + 0x5B7D, 0xC4F5, + 0x5B80, 0xE5B2, + 0x5B81, 0xC4FE, + 0x5B83, 0xCBFC, + 0x5B84, 0xE5B3, + 0x5B85, 0xD5AC, + 0x5B87, 0xD3EE, + 0x5B88, 0xCAD8, + 0x5B89, 0xB0B2, + 0x5B8B, 0xCBCE, + 0x5B8C, 0xCDEA, + 0x5B8F, 0xBAEA, + 0x5B93, 0xE5B5, + 0x5B95, 0xE5B4, + 0x5B97, 0xD7DA, + 0x5B98, 0xB9D9, + 0x5B99, 0xD6E6, + 0x5B9A, 0xB6A8, + 0x5B9B, 0xCDF0, + 0x5B9C, 0xD2CB, + 0x5B9D, 0xB1A6, + 0x5B9E, 0xCAB5, + 0x5BA0, 0xB3E8, + 0x5BA1, 0xC9F3, + 0x5BA2, 0xBFCD, + 0x5BA3, 0xD0FB, + 0x5BA4, 0xCAD2, + 0x5BA5, 0xE5B6, + 0x5BA6, 0xBBC2, + 0x5BAA, 0xCFDC, + 0x5BAB, 0xB9AC, + 0x5BB0, 0xD4D7, + 0x5BB3, 0xBAA6, + 0x5BB4, 0xD1E7, + 0x5BB5, 0xCFFC, + 0x5BB6, 0xBCD2, + 0x5BB8, 0xE5B7, + 0x5BB9, 0xC8DD, + 0x5BBD, 0xBFED, + 0x5BBE, 0xB1F6, + 0x5BBF, 0xCBDE, + 0x5BC2, 0xBCC5, + 0x5BC4, 0xBCC4, + 0x5BC5, 0xD2FA, + 0x5BC6, 0xC3DC, + 0x5BC7, 0xBFDC, + 0x5BCC, 0xB8BB, + 0x5BD0, 0xC3C2, + 0x5BD2, 0xBAAE, + 0x5BD3, 0xD4A2, + 0x5BDD, 0xC7DE, + 0x5BDE, 0xC4AF, + 0x5BDF, 0xB2EC, + 0x5BE1, 0xB9D1, + 0x5BE4, 0xE5BB, + 0x5BE5, 0xC1C8, + 0x5BE8, 0xD5AF, + 0x5BEE, 0xE5BC, + 0x5BF0, 0xE5BE, + 0x5BF8, 0xB4E7, + 0x5BF9, 0xB6D4, + 0x5BFA, 0xCBC2, + 0x5BFB, 0xD1B0, + 0x5BFC, 0xB5BC, + 0x5BFF, 0xCAD9, + 0x5C01, 0xB7E2, + 0x5C04, 0xC9E4, + 0x5C06, 0xBDAB, + 0x5C09, 0xCEBE, + 0x5C0A, 0xD7F0, + 0x5C0F, 0xD0A1, + 0x5C11, 0xC9D9, + 0x5C14, 0xB6FB, + 0x5C15, 0xE6D8, + 0x5C16, 0xBCE2, + 0x5C18, 0xB3BE, + 0x5C1A, 0xC9D0, + 0x5C1C, 0xE6D9, + 0x5C1D, 0xB3A2, + 0x5C22, 0xDECC, + 0x5C24, 0xD3C8, + 0x5C25, 0xDECD, + 0x5C27, 0xD2A2, + 0x5C2C, 0xDECE, + 0x5C31, 0xBECD, + 0x5C34, 0xDECF, + 0x5C38, 0xCAAC, + 0x5C39, 0xD2FC, + 0x5C3A, 0xB3DF, + 0x5C3B, 0xE5EA, + 0x5C3C, 0xC4E1, + 0x5C3D, 0xBEA1, + 0x5C3E, 0xCEB2, + 0x5C3F, 0xC4F2, + 0x5C40, 0xBED6, + 0x5C41, 0xC6A8, + 0x5C42, 0xB2E3, + 0x5C45, 0xBED3, + 0x5C48, 0xC7FC, + 0x5C49, 0xCCEB, + 0x5C4A, 0xBDEC, + 0x5C4B, 0xCEDD, + 0x5C4E, 0xCABA, + 0x5C4F, 0xC6C1, + 0x5C50, 0xE5EC, + 0x5C51, 0xD0BC, + 0x5C55, 0xD5B9, + 0x5C59, 0xE5ED, + 0x5C5E, 0xCAF4, + 0x5C60, 0xCDC0, + 0x5C61, 0xC2C5, + 0x5C63, 0xE5EF, + 0x5C65, 0xC2C4, + 0x5C66, 0xE5F0, + 0x5C6E, 0xE5F8, + 0x5C6F, 0xCDCD, + 0x5C71, 0xC9BD, + 0x5C79, 0xD2D9, + 0x5C7A, 0xE1A8, + 0x5C7F, 0xD3EC, + 0x5C81, 0xCBEA, + 0x5C82, 0xC6F1, + 0x5C88, 0xE1AC, + 0x5C8C, 0xE1A7, + 0x5C8D, 0xE1A9, + 0x5C90, 0xE1AA, + 0x5C91, 0xE1AF, + 0x5C94, 0xB2ED, + 0x5C96, 0xE1AB, + 0x5C97, 0xB8DA, + 0x5C98, 0xE1AD, + 0x5C99, 0xE1AE, + 0x5C9A, 0xE1B0, + 0x5C9B, 0xB5BA, + 0x5C9C, 0xE1B1, + 0x5CA2, 0xE1B3, + 0x5CA3, 0xE1B8, + 0x5CA9, 0xD1D2, + 0x5CAB, 0xE1B6, + 0x5CAC, 0xE1B5, + 0x5CAD, 0xC1EB, + 0x5CB1, 0xE1B7, + 0x5CB3, 0xD4C0, + 0x5CB5, 0xE1B2, + 0x5CB7, 0xE1BA, + 0x5CB8, 0xB0B6, + 0x5CBD, 0xE1B4, + 0x5CBF, 0xBFF9, + 0x5CC1, 0xE1B9, + 0x5CC4, 0xE1BB, + 0x5CCB, 0xE1BE, + 0x5CD2, 0xE1BC, + 0x5CD9, 0xD6C5, + 0x5CE1, 0xCFBF, + 0x5CE4, 0xE1BD, + 0x5CE5, 0xE1BF, + 0x5CE6, 0xC2CD, + 0x5CE8, 0xB6EB, + 0x5CEA, 0xD3F8, + 0x5CED, 0xC7CD, + 0x5CF0, 0xB7E5, + 0x5CFB, 0xBEFE, + 0x5D02, 0xE1C0, + 0x5D03, 0xE1C1, + 0x5D06, 0xE1C7, + 0x5D07, 0xB3E7, + 0x5D0E, 0xC6E9, + 0x5D14, 0xB4DE, + 0x5D16, 0xD1C2, + 0x5D1B, 0xE1C8, + 0x5D1E, 0xE1C6, + 0x5D24, 0xE1C5, + 0x5D26, 0xE1C3, + 0x5D27, 0xE1C2, + 0x5D29, 0xB1C0, + 0x5D2D, 0xD5B8, + 0x5D2E, 0xE1C4, + 0x5D34, 0xE1CB, + 0x5D3D, 0xE1CC, + 0x5D3E, 0xE1CA, + 0x5D47, 0xEFFA, + 0x5D4A, 0xE1D3, + 0x5D4B, 0xE1D2, + 0x5D4C, 0xC7B6, + 0x5D58, 0xE1C9, + 0x5D5B, 0xE1CE, + 0x5D5D, 0xE1D0, + 0x5D69, 0xE1D4, + 0x5D6B, 0xE1D1, + 0x5D6C, 0xE1CD, + 0x5D6F, 0xE1CF, + 0x5D74, 0xE1D5, + 0x5D82, 0xE1D6, + 0x5D99, 0xE1D7, + 0x5D9D, 0xE1D8, + 0x5DB7, 0xE1DA, + 0x5DC5, 0xE1DB, + 0x5DCD, 0xCEA1, + 0x5DDB, 0xE7DD, + 0x5DDD, 0xB4A8, + 0x5DDE, 0xD6DD, + 0x5DE1, 0xD1B2, + 0x5DE2, 0xB3B2, + 0x5DE5, 0xB9A4, + 0x5DE6, 0xD7F3, + 0x5DE7, 0xC7C9, + 0x5DE8, 0xBEDE, + 0x5DE9, 0xB9AE, + 0x5DEB, 0xCED7, + 0x5DEE, 0xB2EE, + 0x5DEF, 0xDBCF, + 0x5DF1, 0xBCBA, + 0x5DF2, 0xD2D1, + 0x5DF3, 0xCBC8, + 0x5DF4, 0xB0CD, + 0x5DF7, 0xCFEF, + 0x5DFD, 0xD9E3, + 0x5DFE, 0xBDED, + 0x5E01, 0xB1D2, + 0x5E02, 0xCAD0, + 0x5E03, 0xB2BC, + 0x5E05, 0xCBA7, + 0x5E06, 0xB7AB, + 0x5E08, 0xCAA6, + 0x5E0C, 0xCFA3, + 0x5E0F, 0xE0F8, + 0x5E10, 0xD5CA, + 0x5E11, 0xE0FB, + 0x5E14, 0xE0FA, + 0x5E15, 0xC5C1, + 0x5E16, 0xCCFB, + 0x5E18, 0xC1B1, + 0x5E19, 0xE0F9, + 0x5E1A, 0xD6E3, + 0x5E1B, 0xB2AF, + 0x5E1C, 0xD6C4, + 0x5E1D, 0xB5DB, + 0x5E26, 0xB4F8, + 0x5E27, 0xD6A1, + 0x5E2D, 0xCFAF, + 0x5E2E, 0xB0EF, + 0x5E31, 0xE0FC, + 0x5E37, 0xE1A1, + 0x5E38, 0xB3A3, + 0x5E3B, 0xE0FD, + 0x5E3C, 0xE0FE, + 0x5E3D, 0xC3B1, + 0x5E42, 0xC3DD, + 0x5E44, 0xE1A2, + 0x5E45, 0xB7F9, + 0x5E4C, 0xBBCF, + 0x5E54, 0xE1A3, + 0x5E55, 0xC4BB, + 0x5E5B, 0xE1A4, + 0x5E5E, 0xE1A5, + 0x5E61, 0xE1A6, + 0x5E62, 0xB4B1, + 0x5E72, 0xB8C9, + 0x5E73, 0xC6BD, + 0x5E74, 0xC4EA, + 0x5E76, 0xB2A2, + 0x5E78, 0xD0D2, + 0x5E7A, 0xE7DB, + 0x5E7B, 0xBBC3, + 0x5E7C, 0xD3D7, + 0x5E7D, 0xD3C4, + 0x5E7F, 0xB9E3, + 0x5E80, 0xE2CF, + 0x5E84, 0xD7AF, + 0x5E86, 0xC7EC, + 0x5E87, 0xB1D3, + 0x5E8A, 0xB4B2, + 0x5E8B, 0xE2D1, + 0x5E8F, 0xD0F2, + 0x5E90, 0xC2AE, + 0x5E91, 0xE2D0, + 0x5E93, 0xBFE2, + 0x5E94, 0xD3A6, + 0x5E95, 0xB5D7, + 0x5E96, 0xE2D2, + 0x5E97, 0xB5EA, + 0x5E99, 0xC3ED, + 0x5E9A, 0xB8FD, + 0x5E9C, 0xB8AE, + 0x5E9E, 0xC5D3, + 0x5E9F, 0xB7CF, + 0x5EA0, 0xE2D4, + 0x5EA5, 0xE2D3, + 0x5EA6, 0xB6C8, + 0x5EA7, 0xD7F9, + 0x5EAD, 0xCDA5, + 0x5EB3, 0xE2D8, + 0x5EB5, 0xE2D6, + 0x5EB6, 0xCAFC, + 0x5EB7, 0xBFB5, + 0x5EB8, 0xD3B9, + 0x5EB9, 0xE2D5, + 0x5EBE, 0xE2D7, + 0x5EC9, 0xC1AE, + 0x5ECA, 0xC0C8, + 0x5ED1, 0xE2DB, + 0x5ED2, 0xE2DA, + 0x5ED3, 0xC0AA, + 0x5ED6, 0xC1CE, + 0x5EDB, 0xE2DC, + 0x5EE8, 0xE2DD, + 0x5EEA, 0xE2DE, + 0x5EF4, 0xDBC8, + 0x5EF6, 0xD1D3, + 0x5EF7, 0xCDA2, + 0x5EFA, 0xBDA8, + 0x5EFE, 0xDEC3, + 0x5EFF, 0xD8A5, + 0x5F00, 0xBFAA, + 0x5F01, 0xDBCD, + 0x5F02, 0xD2EC, + 0x5F03, 0xC6FA, + 0x5F04, 0xC5AA, + 0x5F08, 0xDEC4, + 0x5F0A, 0xB1D7, + 0x5F0B, 0xDFAE, + 0x5F0F, 0xCABD, + 0x5F11, 0xDFB1, + 0x5F13, 0xB9AD, + 0x5F15, 0xD2FD, + 0x5F17, 0xB8A5, + 0x5F18, 0xBAEB, + 0x5F1B, 0xB3DA, + 0x5F1F, 0xB5DC, + 0x5F20, 0xD5C5, + 0x5F25, 0xC3D6, + 0x5F26, 0xCFD2, + 0x5F27, 0xBBA1, + 0x5F29, 0xE5F3, + 0x5F2A, 0xE5F2, + 0x5F2D, 0xE5F4, + 0x5F2F, 0xCDE4, + 0x5F31, 0xC8F5, + 0x5F39, 0xB5AF, + 0x5F3A, 0xC7BF, + 0x5F3C, 0xE5F6, + 0x5F40, 0xECB0, + 0x5F50, 0xE5E6, + 0x5F52, 0xB9E9, + 0x5F53, 0xB5B1, + 0x5F55, 0xC2BC, + 0x5F56, 0xE5E8, + 0x5F57, 0xE5E7, + 0x5F58, 0xE5E9, + 0x5F5D, 0xD2CD, + 0x5F61, 0xE1EA, + 0x5F62, 0xD0CE, + 0x5F64, 0xCDAE, + 0x5F66, 0xD1E5, + 0x5F69, 0xB2CA, + 0x5F6A, 0xB1EB, + 0x5F6C, 0xB1F2, + 0x5F6D, 0xC5ED, + 0x5F70, 0xD5C3, + 0x5F71, 0xD3B0, + 0x5F73, 0xE1DC, + 0x5F77, 0xE1DD, + 0x5F79, 0xD2DB, + 0x5F7B, 0xB3B9, + 0x5F7C, 0xB1CB, + 0x5F80, 0xCDF9, + 0x5F81, 0xD5F7, + 0x5F82, 0xE1DE, + 0x5F84, 0xBEB6, + 0x5F85, 0xB4FD, + 0x5F87, 0xE1DF, + 0x5F88, 0xBADC, + 0x5F89, 0xE1E0, + 0x5F8A, 0xBBB2, + 0x5F8B, 0xC2C9, + 0x5F8C, 0xE1E1, + 0x5F90, 0xD0EC, + 0x5F92, 0xCDBD, + 0x5F95, 0xE1E2, + 0x5F97, 0xB5C3, + 0x5F98, 0xC5C7, + 0x5F99, 0xE1E3, + 0x5F9C, 0xE1E4, + 0x5FA1, 0xD3F9, + 0x5FA8, 0xE1E5, + 0x5FAA, 0xD1AD, + 0x5FAD, 0xE1E6, + 0x5FAE, 0xCEA2, + 0x5FB5, 0xE1E7, + 0x5FB7, 0xB5C2, + 0x5FBC, 0xE1E8, + 0x5FBD, 0xBBD5, + 0x5FC3, 0xD0C4, + 0x5FC4, 0xE2E0, + 0x5FC5, 0xB1D8, + 0x5FC6, 0xD2E4, + 0x5FC9, 0xE2E1, + 0x5FCC, 0xBCC9, + 0x5FCD, 0xC8CC, + 0x5FCF, 0xE2E3, + 0x5FD0, 0xECFE, + 0x5FD1, 0xECFD, + 0x5FD2, 0xDFAF, + 0x5FD6, 0xE2E2, + 0x5FD7, 0xD6BE, + 0x5FD8, 0xCDFC, + 0x5FD9, 0xC3A6, + 0x5FDD, 0xE3C3, + 0x5FE0, 0xD6D2, + 0x5FE1, 0xE2E7, + 0x5FE4, 0xE2E8, + 0x5FE7, 0xD3C7, + 0x5FEA, 0xE2EC, + 0x5FEB, 0xBFEC, + 0x5FED, 0xE2ED, + 0x5FEE, 0xE2E5, + 0x5FF1, 0xB3C0, + 0x5FF5, 0xC4EE, + 0x5FF8, 0xE2EE, + 0x5FFB, 0xD0C3, + 0x5FFD, 0xBAF6, + 0x5FFE, 0xE2E9, + 0x5FFF, 0xB7DE, + 0x6000, 0xBBB3, + 0x6001, 0xCCAC, + 0x6002, 0xCBCB, + 0x6003, 0xE2E4, + 0x6004, 0xE2E6, + 0x6005, 0xE2EA, + 0x6006, 0xE2EB, + 0x600A, 0xE2F7, + 0x600D, 0xE2F4, + 0x600E, 0xD4F5, + 0x600F, 0xE2F3, + 0x6012, 0xC5AD, + 0x6014, 0xD5FA, + 0x6015, 0xC5C2, + 0x6016, 0xB2C0, + 0x6019, 0xE2EF, + 0x601B, 0xE2F2, + 0x601C, 0xC1AF, + 0x601D, 0xCBBC, + 0x6020, 0xB5A1, + 0x6021, 0xE2F9, + 0x6025, 0xBCB1, + 0x6026, 0xE2F1, + 0x6027, 0xD0D4, + 0x6028, 0xD4B9, + 0x6029, 0xE2F5, + 0x602A, 0xB9D6, + 0x602B, 0xE2F6, + 0x602F, 0xC7D3, + 0x6035, 0xE2F0, + 0x603B, 0xD7DC, + 0x603C, 0xEDA1, + 0x603F, 0xE2F8, + 0x6041, 0xEDA5, + 0x6042, 0xE2FE, + 0x6043, 0xCAD1, + 0x604B, 0xC1B5, + 0x604D, 0xBBD0, + 0x6050, 0xBFD6, + 0x6052, 0xBAE3, + 0x6055, 0xCBA1, + 0x6059, 0xEDA6, + 0x605A, 0xEDA3, + 0x605D, 0xEDA2, + 0x6062, 0xBBD6, + 0x6063, 0xEDA7, + 0x6064, 0xD0F4, + 0x6067, 0xEDA4, + 0x6068, 0xBADE, + 0x6069, 0xB6F7, + 0x606A, 0xE3A1, + 0x606B, 0xB6B2, + 0x606C, 0xCCF1, + 0x606D, 0xB9A7, + 0x606F, 0xCFA2, + 0x6070, 0xC7A1, + 0x6073, 0xBFD2, + 0x6076, 0xB6F1, + 0x6078, 0xE2FA, + 0x6079, 0xE2FB, + 0x607A, 0xE2FD, + 0x607B, 0xE2FC, + 0x607C, 0xC4D5, + 0x607D, 0xE3A2, + 0x607F, 0xD3C1, + 0x6083, 0xE3A7, + 0x6084, 0xC7C4, + 0x6089, 0xCFA4, + 0x608C, 0xE3A9, + 0x608D, 0xBAB7, + 0x6092, 0xE3A8, + 0x6094, 0xBBDA, + 0x6096, 0xE3A3, + 0x609A, 0xE3A4, + 0x609B, 0xE3AA, + 0x609D, 0xE3A6, + 0x609F, 0xCEF2, + 0x60A0, 0xD3C6, + 0x60A3, 0xBBBC, + 0x60A6, 0xD4C3, + 0x60A8, 0xC4FA, + 0x60AB, 0xEDA8, + 0x60AC, 0xD0FC, + 0x60AD, 0xE3A5, + 0x60AF, 0xC3F5, + 0x60B1, 0xE3AD, + 0x60B2, 0xB1AF, + 0x60B4, 0xE3B2, + 0x60B8, 0xBCC2, + 0x60BB, 0xE3AC, + 0x60BC, 0xB5BF, + 0x60C5, 0xC7E9, + 0x60C6, 0xE3B0, + 0x60CA, 0xBEAA, + 0x60CB, 0xCDEF, + 0x60D1, 0xBBF3, + 0x60D5, 0xCCE8, + 0x60D8, 0xE3AF, + 0x60DA, 0xE3B1, + 0x60DC, 0xCFA7, + 0x60DD, 0xE3AE, + 0x60DF, 0xCEA9, + 0x60E0, 0xBBDD, + 0x60E6, 0xB5EB, + 0x60E7, 0xBEE5, + 0x60E8, 0xB2D2, + 0x60E9, 0xB3CD, + 0x60EB, 0xB1B9, + 0x60EC, 0xE3AB, + 0x60ED, 0xB2D1, + 0x60EE, 0xB5AC, + 0x60EF, 0xB9DF, + 0x60F0, 0xB6E8, + 0x60F3, 0xCFEB, + 0x60F4, 0xE3B7, + 0x60F6, 0xBBCC, + 0x60F9, 0xC8C7, + 0x60FA, 0xD0CA, + 0x6100, 0xE3B8, + 0x6101, 0xB3EE, + 0x6106, 0xEDA9, + 0x6108, 0xD3FA, + 0x6109, 0xD3E4, + 0x610D, 0xEDAA, + 0x610E, 0xE3B9, + 0x610F, 0xD2E2, + 0x6115, 0xE3B5, + 0x611A, 0xD3DE, + 0x611F, 0xB8D0, + 0x6120, 0xE3B3, + 0x6123, 0xE3B6, + 0x6124, 0xB7DF, + 0x6126, 0xE3B4, + 0x6127, 0xC0A2, + 0x612B, 0xE3BA, + 0x613F, 0xD4B8, + 0x6148, 0xB4C8, + 0x614A, 0xE3BB, + 0x614C, 0xBBC5, + 0x614E, 0xC9F7, + 0x6151, 0xC9E5, + 0x6155, 0xC4BD, + 0x615D, 0xEDAB, + 0x6162, 0xC2FD, + 0x6167, 0xBBDB, + 0x6168, 0xBFAE, + 0x6170, 0xCEBF, + 0x6175, 0xE3BC, + 0x6177, 0xBFB6, + 0x618B, 0xB1EF, + 0x618E, 0xD4F7, + 0x6194, 0xE3BE, + 0x619D, 0xEDAD, + 0x61A7, 0xE3BF, + 0x61A8, 0xBAA9, + 0x61A9, 0xEDAC, + 0x61AC, 0xE3BD, + 0x61B7, 0xE3C0, + 0x61BE, 0xBAB6, + 0x61C2, 0xB6AE, + 0x61C8, 0xD0B8, + 0x61CA, 0xB0C3, + 0x61CB, 0xEDAE, + 0x61D1, 0xEDAF, + 0x61D2, 0xC0C1, + 0x61D4, 0xE3C1, + 0x61E6, 0xC5B3, + 0x61F5, 0xE3C2, + 0x61FF, 0xDCB2, + 0x6206, 0xEDB0, + 0x6208, 0xB8EA, + 0x620A, 0xCEEC, + 0x620B, 0xEAA7, + 0x620C, 0xD0E7, + 0x620D, 0xCAF9, + 0x620E, 0xC8D6, + 0x620F, 0xCFB7, + 0x6210, 0xB3C9, + 0x6211, 0xCED2, + 0x6212, 0xBDE4, + 0x6215, 0xE3DE, + 0x6216, 0xBBF2, + 0x6217, 0xEAA8, + 0x6218, 0xD5BD, + 0x621A, 0xC6DD, + 0x621B, 0xEAA9, + 0x621F, 0xEAAA, + 0x6221, 0xEAAC, + 0x6222, 0xEAAB, + 0x6224, 0xEAAE, + 0x6225, 0xEAAD, + 0x622A, 0xBDD8, + 0x622C, 0xEAAF, + 0x622E, 0xC2BE, + 0x6233, 0xB4C1, + 0x6234, 0xB4F7, + 0x6237, 0xBBA7, + 0x623D, 0xECE6, + 0x623E, 0xECE5, + 0x623F, 0xB7BF, + 0x6240, 0xCBF9, + 0x6241, 0xB1E2, + 0x6243, 0xECE7, + 0x6247, 0xC9C8, + 0x6248, 0xECE8, + 0x6249, 0xECE9, + 0x624B, 0xCAD6, + 0x624C, 0xDED0, + 0x624D, 0xB2C5, + 0x624E, 0xD4FA, + 0x6251, 0xC6CB, + 0x6252, 0xB0C7, + 0x6253, 0xB4F2, + 0x6254, 0xC8D3, + 0x6258, 0xCDD0, + 0x625B, 0xBFB8, + 0x6263, 0xBFDB, + 0x6266, 0xC7A4, + 0x6267, 0xD6B4, + 0x6269, 0xC0A9, + 0x626A, 0xDED1, + 0x626B, 0xC9A8, + 0x626C, 0xD1EF, + 0x626D, 0xC5A4, + 0x626E, 0xB0E7, + 0x626F, 0xB3B6, + 0x6270, 0xC8C5, + 0x6273, 0xB0E2, + 0x6276, 0xB7F6, + 0x6279, 0xC5FA, + 0x627C, 0xB6F3, + 0x627E, 0xD5D2, + 0x627F, 0xB3D0, + 0x6280, 0xBCBC, + 0x6284, 0xB3AD, + 0x6289, 0xBEF1, + 0x628A, 0xB0D1, + 0x6291, 0xD2D6, + 0x6292, 0xCAE3, + 0x6293, 0xD7A5, + 0x6295, 0xCDB6, + 0x6296, 0xB6B6, + 0x6297, 0xBFB9, + 0x6298, 0xD5DB, + 0x629A, 0xB8A7, + 0x629B, 0xC5D7, + 0x629F, 0xDED2, + 0x62A0, 0xBFD9, + 0x62A1, 0xC2D5, + 0x62A2, 0xC7C0, + 0x62A4, 0xBBA4, + 0x62A5, 0xB1A8, + 0x62A8, 0xC5EA, + 0x62AB, 0xC5FB, + 0x62AC, 0xCCA7, + 0x62B1, 0xB1A7, + 0x62B5, 0xB5D6, + 0x62B9, 0xC4A8, + 0x62BB, 0xDED3, + 0x62BC, 0xD1BA, + 0x62BD, 0xB3E9, + 0x62BF, 0xC3F2, + 0x62C2, 0xB7F7, + 0x62C4, 0xD6F4, + 0x62C5, 0xB5A3, + 0x62C6, 0xB2F0, + 0x62C7, 0xC4B4, + 0x62C8, 0xC4E9, + 0x62C9, 0xC0AD, + 0x62CA, 0xDED4, + 0x62CC, 0xB0E8, + 0x62CD, 0xC5C4, + 0x62CE, 0xC1E0, + 0x62D0, 0xB9D5, + 0x62D2, 0xBEDC, + 0x62D3, 0xCDD8, + 0x62D4, 0xB0CE, + 0x62D6, 0xCDCF, + 0x62D7, 0xDED6, + 0x62D8, 0xBED0, + 0x62D9, 0xD7BE, + 0x62DA, 0xDED5, + 0x62DB, 0xD5D0, + 0x62DC, 0xB0DD, + 0x62DF, 0xC4E2, + 0x62E2, 0xC2A3, + 0x62E3, 0xBCF0, + 0x62E5, 0xD3B5, + 0x62E6, 0xC0B9, + 0x62E7, 0xC5A1, + 0x62E8, 0xB2A6, + 0x62E9, 0xD4F1, + 0x62EC, 0xC0A8, + 0x62ED, 0xCAC3, + 0x62EE, 0xDED7, + 0x62EF, 0xD5FC, + 0x62F1, 0xB9B0, + 0x62F3, 0xC8AD, + 0x62F4, 0xCBA9, + 0x62F6, 0xDED9, + 0x62F7, 0xBFBD, + 0x62FC, 0xC6B4, + 0x62FD, 0xD7A7, + 0x62FE, 0xCAB0, + 0x62FF, 0xC4C3, + 0x6301, 0xB3D6, + 0x6302, 0xB9D2, + 0x6307, 0xD6B8, + 0x6308, 0xEAFC, + 0x6309, 0xB0B4, + 0x630E, 0xBFE6, + 0x6311, 0xCCF4, + 0x6316, 0xCDDA, + 0x631A, 0xD6BF, + 0x631B, 0xC2CE, + 0x631D, 0xCECE, + 0x631E, 0xCCA2, + 0x631F, 0xD0AE, + 0x6320, 0xC4D3, + 0x6321, 0xB5B2, + 0x6322, 0xDED8, + 0x6323, 0xD5F5, + 0x6324, 0xBCB7, + 0x6325, 0xBBD3, + 0x6328, 0xB0A4, + 0x632A, 0xC5B2, + 0x632B, 0xB4EC, + 0x632F, 0xD5F1, + 0x6332, 0xEAFD, + 0x6339, 0xDEDA, + 0x633A, 0xCDA6, + 0x633D, 0xCDEC, + 0x6342, 0xCEE6, + 0x6343, 0xDEDC, + 0x6345, 0xCDB1, + 0x6346, 0xC0A6, + 0x6349, 0xD7BD, + 0x634B, 0xDEDB, + 0x634C, 0xB0C6, + 0x634D, 0xBAB4, + 0x634E, 0xC9D3, + 0x634F, 0xC4F3, + 0x6350, 0xBEE8, + 0x6355, 0xB2B6, + 0x635E, 0xC0CC, + 0x635F, 0xCBF0, + 0x6361, 0xBCF1, + 0x6362, 0xBBBB, + 0x6363, 0xB5B7, + 0x6367, 0xC5F5, + 0x6369, 0xDEE6, + 0x636D, 0xDEE3, + 0x636E, 0xBEDD, + 0x6371, 0xDEDF, + 0x6376, 0xB4B7, + 0x6377, 0xBDDD, + 0x637A, 0xDEE0, + 0x637B, 0xC4ED, + 0x6380, 0xCFC6, + 0x6382, 0xB5E0, + 0x6387, 0xB6DE, + 0x6388, 0xCADA, + 0x6389, 0xB5F4, + 0x638A, 0xDEE5, + 0x638C, 0xD5C6, + 0x638E, 0xDEE1, + 0x638F, 0xCCCD, + 0x6390, 0xC6FE, + 0x6392, 0xC5C5, + 0x6396, 0xD2B4, + 0x6398, 0xBEF2, + 0x63A0, 0xC2D3, + 0x63A2, 0xCCBD, + 0x63A3, 0xB3B8, + 0x63A5, 0xBDD3, + 0x63A7, 0xBFD8, + 0x63A8, 0xCDC6, + 0x63A9, 0xD1DA, + 0x63AA, 0xB4EB, + 0x63AC, 0xDEE4, + 0x63AD, 0xDEDD, + 0x63AE, 0xDEE7, + 0x63B0, 0xEAFE, + 0x63B3, 0xC2B0, + 0x63B4, 0xDEE2, + 0x63B7, 0xD6C0, + 0x63B8, 0xB5A7, + 0x63BA, 0xB2F4, + 0x63BC, 0xDEE8, + 0x63BE, 0xDEF2, + 0x63C4, 0xDEED, + 0x63C6, 0xDEF1, + 0x63C9, 0xC8E0, + 0x63CD, 0xD7E1, + 0x63CE, 0xDEEF, + 0x63CF, 0xC3E8, + 0x63D0, 0xCCE1, + 0x63D2, 0xB2E5, + 0x63D6, 0xD2BE, + 0x63DE, 0xDEEE, + 0x63E0, 0xDEEB, + 0x63E1, 0xCED5, + 0x63E3, 0xB4A7, + 0x63E9, 0xBFAB, + 0x63EA, 0xBEBE, + 0x63ED, 0xBDD2, + 0x63F2, 0xDEE9, + 0x63F4, 0xD4AE, + 0x63F6, 0xDEDE, + 0x63F8, 0xDEEA, + 0x63FD, 0xC0BF, + 0x63FF, 0xDEEC, + 0x6400, 0xB2F3, + 0x6401, 0xB8E9, + 0x6402, 0xC2A7, + 0x6405, 0xBDC1, + 0x640B, 0xDEF5, + 0x640C, 0xDEF8, + 0x640F, 0xB2AB, + 0x6410, 0xB4A4, + 0x6413, 0xB4EA, + 0x6414, 0xC9A6, + 0x641B, 0xDEF6, + 0x641C, 0xCBD1, + 0x641E, 0xB8E3, + 0x6420, 0xDEF7, + 0x6421, 0xDEFA, + 0x6426, 0xDEF9, + 0x642A, 0xCCC2, + 0x642C, 0xB0E1, + 0x642D, 0xB4EE, + 0x6434, 0xE5BA, + 0x643A, 0xD0AF, + 0x643D, 0xB2EB, + 0x643F, 0xEBA1, + 0x6441, 0xDEF4, + 0x6444, 0xC9E3, + 0x6445, 0xDEF3, + 0x6446, 0xB0DA, + 0x6447, 0xD2A1, + 0x6448, 0xB1F7, + 0x644A, 0xCCAF, + 0x6452, 0xDEF0, + 0x6454, 0xCBA4, + 0x6458, 0xD5AA, + 0x645E, 0xDEFB, + 0x6467, 0xB4DD, + 0x6469, 0xC4A6, + 0x646D, 0xDEFD, + 0x6478, 0xC3FE, + 0x6479, 0xC4A1, + 0x647A, 0xDFA1, + 0x6482, 0xC1CC, + 0x6484, 0xDEFC, + 0x6485, 0xBEEF, + 0x6487, 0xC6B2, + 0x6491, 0xB3C5, + 0x6492, 0xC8F6, + 0x6495, 0xCBBA, + 0x6496, 0xDEFE, + 0x6499, 0xDFA4, + 0x649E, 0xD7B2, + 0x64A4, 0xB3B7, + 0x64A9, 0xC1C3, + 0x64AC, 0xC7CB, + 0x64AD, 0xB2A5, + 0x64AE, 0xB4E9, + 0x64B0, 0xD7AB, + 0x64B5, 0xC4EC, + 0x64B7, 0xDFA2, + 0x64B8, 0xDFA3, + 0x64BA, 0xDFA5, + 0x64BC, 0xBAB3, + 0x64C0, 0xDFA6, + 0x64C2, 0xC0DE, + 0x64C5, 0xC9C3, + 0x64CD, 0xB2D9, + 0x64CE, 0xC7E6, + 0x64D0, 0xDFA7, + 0x64D2, 0xC7DC, + 0x64D7, 0xDFA8, + 0x64D8, 0xEBA2, + 0x64DE, 0xCBD3, + 0x64E2, 0xDFAA, + 0x64E4, 0xDFA9, + 0x64E6, 0xB2C1, + 0x6500, 0xC5CA, + 0x6509, 0xDFAB, + 0x6512, 0xD4DC, + 0x6518, 0xC8C1, + 0x6525, 0xDFAC, + 0x652B, 0xBEF0, + 0x652E, 0xDFAD, + 0x652F, 0xD6A7, + 0x6534, 0xEAB7, + 0x6535, 0xEBB6, + 0x6536, 0xCAD5, + 0x6538, 0xD8FC, + 0x6539, 0xB8C4, + 0x653B, 0xB9A5, + 0x653E, 0xB7C5, + 0x653F, 0xD5FE, + 0x6545, 0xB9CA, + 0x6548, 0xD0A7, + 0x6549, 0xF4CD, + 0x654C, 0xB5D0, + 0x654F, 0xC3F4, + 0x6551, 0xBEC8, + 0x6555, 0xEBB7, + 0x6556, 0xB0BD, + 0x6559, 0xBDCC, + 0x655B, 0xC1B2, + 0x655D, 0xB1D6, + 0x655E, 0xB3A8, + 0x6562, 0xB8D2, + 0x6563, 0xC9A2, + 0x6566, 0xB6D8, + 0x656B, 0xEBB8, + 0x656C, 0xBEB4, + 0x6570, 0xCAFD, + 0x6572, 0xC7C3, + 0x6574, 0xD5FB, + 0x6577, 0xB7F3, + 0x6587, 0xCEC4, + 0x658B, 0xD5AB, + 0x658C, 0xB1F3, + 0x6590, 0xECB3, + 0x6591, 0xB0DF, + 0x6593, 0xECB5, + 0x6597, 0xB6B7, + 0x6599, 0xC1CF, + 0x659B, 0xF5FA, + 0x659C, 0xD0B1, + 0x659F, 0xD5E5, + 0x65A1, 0xCED3, + 0x65A4, 0xBDEF, + 0x65A5, 0xB3E2, + 0x65A7, 0xB8AB, + 0x65A9, 0xD5B6, + 0x65AB, 0xEDBD, + 0x65AD, 0xB6CF, + 0x65AF, 0xCBB9, + 0x65B0, 0xD0C2, + 0x65B9, 0xB7BD, + 0x65BC, 0xECB6, + 0x65BD, 0xCAA9, + 0x65C1, 0xC5D4, + 0x65C3, 0xECB9, + 0x65C4, 0xECB8, + 0x65C5, 0xC2C3, + 0x65C6, 0xECB7, + 0x65CB, 0xD0FD, + 0x65CC, 0xECBA, + 0x65CE, 0xECBB, + 0x65CF, 0xD7E5, + 0x65D2, 0xECBC, + 0x65D6, 0xECBD, + 0x65D7, 0xC6EC, + 0x65E0, 0xCEDE, + 0x65E2, 0xBCC8, + 0x65E5, 0xC8D5, + 0x65E6, 0xB5A9, + 0x65E7, 0xBEC9, + 0x65E8, 0xD6BC, + 0x65E9, 0xD4E7, + 0x65EC, 0xD1AE, + 0x65ED, 0xD0F1, + 0x65EE, 0xEAB8, + 0x65EF, 0xEAB9, + 0x65F0, 0xEABA, + 0x65F1, 0xBAB5, + 0x65F6, 0xCAB1, + 0x65F7, 0xBFF5, + 0x65FA, 0xCDFA, + 0x6600, 0xEAC0, + 0x6602, 0xB0BA, + 0x6603, 0xEABE, + 0x6606, 0xC0A5, + 0x660A, 0xEABB, + 0x660C, 0xB2FD, + 0x660E, 0xC3F7, + 0x660F, 0xBBE8, + 0x6613, 0xD2D7, + 0x6614, 0xCEF4, + 0x6615, 0xEABF, + 0x6619, 0xEABC, + 0x661D, 0xEAC3, + 0x661F, 0xD0C7, + 0x6620, 0xD3B3, + 0x6625, 0xB4BA, + 0x6627, 0xC3C1, + 0x6628, 0xD7F2, + 0x662D, 0xD5D1, + 0x662F, 0xCAC7, + 0x6631, 0xEAC5, + 0x6634, 0xEAC4, + 0x6635, 0xEAC7, + 0x6636, 0xEAC6, + 0x663C, 0xD6E7, + 0x663E, 0xCFD4, + 0x6641, 0xEACB, + 0x6643, 0xBBCE, + 0x664B, 0xBDFA, + 0x664C, 0xC9CE, + 0x664F, 0xEACC, + 0x6652, 0xC9B9, + 0x6653, 0xCFFE, + 0x6654, 0xEACA, + 0x6655, 0xD4CE, + 0x6656, 0xEACD, + 0x6657, 0xEACF, + 0x665A, 0xCDED, + 0x665F, 0xEAC9, + 0x6661, 0xEACE, + 0x6664, 0xCEEE, + 0x6666, 0xBBDE, + 0x6668, 0xB3BF, + 0x666E, 0xC6D5, + 0x666F, 0xBEB0, + 0x6670, 0xCEFA, + 0x6674, 0xC7E7, + 0x6676, 0xBEA7, + 0x6677, 0xEAD0, + 0x667A, 0xD6C7, + 0x667E, 0xC1C0, + 0x6682, 0xD4DD, + 0x6684, 0xEAD1, + 0x6687, 0xCFBE, + 0x668C, 0xEAD2, + 0x6691, 0xCAEE, + 0x6696, 0xC5AF, + 0x6697, 0xB0B5, + 0x669D, 0xEAD4, + 0x66A7, 0xEAD3, + 0x66A8, 0xF4DF, + 0x66AE, 0xC4BA, + 0x66B4, 0xB1A9, + 0x66B9, 0xE5DF, + 0x66BE, 0xEAD5, + 0x66D9, 0xCAEF, + 0x66DB, 0xEAD6, + 0x66DC, 0xEAD7, + 0x66DD, 0xC6D8, + 0x66E6, 0xEAD8, + 0x66E9, 0xEAD9, + 0x66F0, 0xD4BB, + 0x66F2, 0xC7FA, + 0x66F3, 0xD2B7, + 0x66F4, 0xB8FC, + 0x66F7, 0xEAC2, + 0x66F9, 0xB2DC, + 0x66FC, 0xC2FC, + 0x66FE, 0xD4F8, + 0x66FF, 0xCCE6, + 0x6700, 0xD7EE, + 0x6708, 0xD4C2, + 0x6709, 0xD3D0, + 0x670A, 0xEBC3, + 0x670B, 0xC5F3, + 0x670D, 0xB7FE, + 0x6710, 0xEBD4, + 0x6714, 0xCBB7, + 0x6715, 0xEBDE, + 0x6717, 0xC0CA, + 0x671B, 0xCDFB, + 0x671D, 0xB3AF, + 0x671F, 0xC6DA, + 0x6726, 0xEBFC, + 0x6728, 0xC4BE, + 0x672A, 0xCEB4, + 0x672B, 0xC4A9, + 0x672C, 0xB1BE, + 0x672D, 0xD4FD, + 0x672F, 0xCAF5, + 0x6731, 0xD6EC, + 0x6734, 0xC6D3, + 0x6735, 0xB6E4, + 0x673A, 0xBBFA, + 0x673D, 0xD0E0, + 0x6740, 0xC9B1, + 0x6742, 0xD4D3, + 0x6743, 0xC8A8, + 0x6746, 0xB8CB, + 0x6748, 0xE8BE, + 0x6749, 0xC9BC, + 0x674C, 0xE8BB, + 0x674E, 0xC0EE, + 0x674F, 0xD0D3, + 0x6750, 0xB2C4, + 0x6751, 0xB4E5, + 0x6753, 0xE8BC, + 0x6756, 0xD5C8, + 0x675C, 0xB6C5, + 0x675E, 0xE8BD, + 0x675F, 0xCAF8, + 0x6760, 0xB8DC, + 0x6761, 0xCCF5, + 0x6765, 0xC0B4, + 0x6768, 0xD1EE, + 0x6769, 0xE8BF, + 0x676A, 0xE8C2, + 0x676D, 0xBABC, + 0x676F, 0xB1AD, + 0x6770, 0xBDDC, + 0x6772, 0xEABD, + 0x6773, 0xE8C3, + 0x6775, 0xE8C6, + 0x6777, 0xE8CB, + 0x677C, 0xE8CC, + 0x677E, 0xCBC9, + 0x677F, 0xB0E5, + 0x6781, 0xBCAB, + 0x6784, 0xB9B9, + 0x6787, 0xE8C1, + 0x6789, 0xCDF7, + 0x678B, 0xE8CA, + 0x6790, 0xCEF6, + 0x6795, 0xD5ED, + 0x6797, 0xC1D6, + 0x6798, 0xE8C4, + 0x679A, 0xC3B6, + 0x679C, 0xB9FB, + 0x679D, 0xD6A6, + 0x679E, 0xE8C8, + 0x67A2, 0xCAE0, + 0x67A3, 0xD4E6, + 0x67A5, 0xE8C0, + 0x67A7, 0xE8C5, + 0x67A8, 0xE8C7, + 0x67AA, 0xC7B9, + 0x67AB, 0xB7E3, + 0x67AD, 0xE8C9, + 0x67AF, 0xBFDD, + 0x67B0, 0xE8D2, + 0x67B3, 0xE8D7, + 0x67B5, 0xE8D5, + 0x67B6, 0xBCDC, + 0x67B7, 0xBCCF, + 0x67B8, 0xE8DB, + 0x67C1, 0xE8DE, + 0x67C3, 0xE8DA, + 0x67C4, 0xB1FA, + 0x67CF, 0xB0D8, + 0x67D0, 0xC4B3, + 0x67D1, 0xB8CC, + 0x67D2, 0xC6E2, + 0x67D3, 0xC8BE, + 0x67D4, 0xC8E1, + 0x67D8, 0xE8CF, + 0x67D9, 0xE8D4, + 0x67DA, 0xE8D6, + 0x67DC, 0xB9F1, + 0x67DD, 0xE8D8, + 0x67DE, 0xD7F5, + 0x67E0, 0xC4FB, + 0x67E2, 0xE8DC, + 0x67E5, 0xB2E9, + 0x67E9, 0xE8D1, + 0x67EC, 0xBCED, + 0x67EF, 0xBFC2, + 0x67F0, 0xE8CD, + 0x67F1, 0xD6F9, + 0x67F3, 0xC1F8, + 0x67F4, 0xB2F1, + 0x67FD, 0xE8DF, + 0x67FF, 0xCAC1, + 0x6800, 0xE8D9, + 0x6805, 0xD5A4, + 0x6807, 0xB1EA, + 0x6808, 0xD5BB, + 0x6809, 0xE8CE, + 0x680A, 0xE8D0, + 0x680B, 0xB6B0, + 0x680C, 0xE8D3, + 0x680E, 0xE8DD, + 0x680F, 0xC0B8, + 0x6811, 0xCAF7, + 0x6813, 0xCBA8, + 0x6816, 0xC6DC, + 0x6817, 0xC0F5, + 0x681D, 0xE8E9, + 0x6821, 0xD0A3, + 0x6829, 0xE8F2, + 0x682A, 0xD6EA, + 0x6832, 0xE8E0, + 0x6833, 0xE8E1, + 0x6837, 0xD1F9, + 0x6838, 0xBACB, + 0x6839, 0xB8F9, + 0x683C, 0xB8F1, + 0x683D, 0xD4D4, + 0x683E, 0xE8EF, + 0x6840, 0xE8EE, + 0x6841, 0xE8EC, + 0x6842, 0xB9F0, + 0x6843, 0xCCD2, + 0x6844, 0xE8E6, + 0x6845, 0xCEA6, + 0x6846, 0xBFF2, + 0x6848, 0xB0B8, + 0x6849, 0xE8F1, + 0x684A, 0xE8F0, + 0x684C, 0xD7C0, + 0x684E, 0xE8E4, + 0x6850, 0xCDA9, + 0x6851, 0xC9A3, + 0x6853, 0xBBB8, + 0x6854, 0xBDDB, + 0x6855, 0xE8EA, + 0x6860, 0xE8E2, + 0x6861, 0xE8E3, + 0x6862, 0xE8E5, + 0x6863, 0xB5B5, + 0x6864, 0xE8E7, + 0x6865, 0xC7C5, + 0x6866, 0xE8EB, + 0x6867, 0xE8ED, + 0x6868, 0xBDB0, + 0x6869, 0xD7AE, + 0x686B, 0xE8F8, + 0x6874, 0xE8F5, + 0x6876, 0xCDB0, + 0x6877, 0xE8F6, + 0x6881, 0xC1BA, + 0x6883, 0xE8E8, + 0x6885, 0xC3B7, + 0x6886, 0xB0F0, + 0x688F, 0xE8F4, + 0x6893, 0xE8F7, + 0x6897, 0xB9A3, + 0x68A2, 0xC9D2, + 0x68A6, 0xC3CE, + 0x68A7, 0xCEE0, + 0x68A8, 0xC0E6, + 0x68AD, 0xCBF3, + 0x68AF, 0xCCDD, + 0x68B0, 0xD0B5, + 0x68B3, 0xCAE1, + 0x68B5, 0xE8F3, + 0x68C0, 0xBCEC, + 0x68C2, 0xE8F9, + 0x68C9, 0xC3DE, + 0x68CB, 0xC6E5, + 0x68CD, 0xB9F7, + 0x68D2, 0xB0F4, + 0x68D5, 0xD7D8, + 0x68D8, 0xBCAC, + 0x68DA, 0xC5EF, + 0x68E0, 0xCCC4, + 0x68E3, 0xE9A6, + 0x68EE, 0xC9AD, + 0x68F0, 0xE9A2, + 0x68F1, 0xC0E2, + 0x68F5, 0xBFC3, + 0x68F9, 0xE8FE, + 0x68FA, 0xB9D7, + 0x68FC, 0xE8FB, + 0x6901, 0xE9A4, + 0x6905, 0xD2CE, + 0x690B, 0xE9A3, + 0x690D, 0xD6B2, + 0x690E, 0xD7B5, + 0x6910, 0xE9A7, + 0x6912, 0xBDB7, + 0x691F, 0xE8FC, + 0x6920, 0xE8FD, + 0x6924, 0xE9A1, + 0x692D, 0xCDD6, + 0x6930, 0xD2AC, + 0x6934, 0xE9B2, + 0x6939, 0xE9A9, + 0x693D, 0xB4AA, + 0x693F, 0xB4BB, + 0x6942, 0xE9AB, + 0x6954, 0xD0A8, + 0x6957, 0xE9A5, + 0x695A, 0xB3FE, + 0x695D, 0xE9AC, + 0x695E, 0xC0E3, + 0x6960, 0xE9AA, + 0x6963, 0xE9B9, + 0x6966, 0xE9B8, + 0x696B, 0xE9AE, + 0x696E, 0xE8FA, + 0x6971, 0xE9A8, + 0x6977, 0xBFAC, + 0x6978, 0xE9B1, + 0x6979, 0xE9BA, + 0x697C, 0xC2A5, + 0x6980, 0xE9AF, + 0x6982, 0xB8C5, + 0x6984, 0xE9AD, + 0x6986, 0xD3DC, + 0x6987, 0xE9B4, + 0x6988, 0xE9B5, + 0x6989, 0xE9B7, + 0x698D, 0xE9C7, + 0x6994, 0xC0C6, + 0x6995, 0xE9C5, + 0x6998, 0xE9B0, + 0x699B, 0xE9BB, + 0x699C, 0xB0F1, + 0x69A7, 0xE9BC, + 0x69A8, 0xD5A5, + 0x69AB, 0xE9BE, + 0x69AD, 0xE9BF, + 0x69B1, 0xE9C1, + 0x69B4, 0xC1F1, + 0x69B7, 0xC8B6, + 0x69BB, 0xE9BD, + 0x69C1, 0xE9C2, + 0x69CA, 0xE9C3, + 0x69CC, 0xE9B3, + 0x69CE, 0xE9B6, + 0x69D0, 0xBBB1, + 0x69D4, 0xE9C0, + 0x69DB, 0xBCF7, + 0x69DF, 0xE9C4, + 0x69E0, 0xE9C6, + 0x69ED, 0xE9CA, + 0x69F2, 0xE9CE, + 0x69FD, 0xB2DB, + 0x69FF, 0xE9C8, + 0x6A0A, 0xB7AE, + 0x6A17, 0xE9CB, + 0x6A18, 0xE9CC, + 0x6A1F, 0xD5C1, + 0x6A21, 0xC4A3, + 0x6A28, 0xE9D8, + 0x6A2A, 0xBAE1, + 0x6A2F, 0xE9C9, + 0x6A31, 0xD3A3, + 0x6A35, 0xE9D4, + 0x6A3D, 0xE9D7, + 0x6A3E, 0xE9D0, + 0x6A44, 0xE9CF, + 0x6A47, 0xC7C1, + 0x6A50, 0xE9D2, + 0x6A58, 0xE9D9, + 0x6A59, 0xB3C8, + 0x6A5B, 0xE9D3, + 0x6A61, 0xCFF0, + 0x6A65, 0xE9CD, + 0x6A71, 0xB3F7, + 0x6A79, 0xE9D6, + 0x6A7C, 0xE9DA, + 0x6A80, 0xCCB4, + 0x6A84, 0xCFAD, + 0x6A8E, 0xE9D5, + 0x6A90, 0xE9DC, + 0x6A91, 0xE9DB, + 0x6A97, 0xE9DE, + 0x6AA0, 0xE9D1, + 0x6AA9, 0xE9DD, + 0x6AAB, 0xE9DF, + 0x6AAC, 0xC3CA, + 0x6B20, 0xC7B7, + 0x6B21, 0xB4CE, + 0x6B22, 0xBBB6, + 0x6B23, 0xD0C0, + 0x6B24, 0xECA3, + 0x6B27, 0xC5B7, + 0x6B32, 0xD3FB, + 0x6B37, 0xECA4, + 0x6B39, 0xECA5, + 0x6B3A, 0xC6DB, + 0x6B3E, 0xBFEE, + 0x6B43, 0xECA6, + 0x6B46, 0xECA7, + 0x6B47, 0xD0AA, + 0x6B49, 0xC7B8, + 0x6B4C, 0xB8E8, + 0x6B59, 0xECA8, + 0x6B62, 0xD6B9, + 0x6B63, 0xD5FD, + 0x6B64, 0xB4CB, + 0x6B65, 0xB2BD, + 0x6B66, 0xCEE4, + 0x6B67, 0xC6E7, + 0x6B6A, 0xCDE1, + 0x6B79, 0xB4F5, + 0x6B7B, 0xCBC0, + 0x6B7C, 0xBCDF, + 0x6B81, 0xE9E2, + 0x6B82, 0xE9E3, + 0x6B83, 0xD1EA, + 0x6B84, 0xE9E5, + 0x6B86, 0xB4F9, + 0x6B87, 0xE9E4, + 0x6B89, 0xD1B3, + 0x6B8A, 0xCAE2, + 0x6B8B, 0xB2D0, + 0x6B8D, 0xE9E8, + 0x6B92, 0xE9E6, + 0x6B93, 0xE9E7, + 0x6B96, 0xD6B3, + 0x6B9A, 0xE9E9, + 0x6B9B, 0xE9EA, + 0x6BA1, 0xE9EB, + 0x6BAA, 0xE9EC, + 0x6BB3, 0xECAF, + 0x6BB4, 0xC5B9, + 0x6BB5, 0xB6CE, + 0x6BB7, 0xD2F3, + 0x6BBF, 0xB5EE, + 0x6BC1, 0xBBD9, + 0x6BC2, 0xECB1, + 0x6BC5, 0xD2E3, + 0x6BCB, 0xCEE3, + 0x6BCD, 0xC4B8, + 0x6BCF, 0xC3BF, + 0x6BD2, 0xB6BE, + 0x6BD3, 0xD8B9, + 0x6BD4, 0xB1C8, + 0x6BD5, 0xB1CF, + 0x6BD6, 0xB1D1, + 0x6BD7, 0xC5FE, + 0x6BD9, 0xB1D0, + 0x6BDB, 0xC3AB, + 0x6BE1, 0xD5B1, + 0x6BEA, 0xEBA4, + 0x6BEB, 0xBAC1, + 0x6BEF, 0xCCBA, + 0x6BF3, 0xEBA5, + 0x6BF5, 0xEBA7, + 0x6BF9, 0xEBA8, + 0x6BFD, 0xEBA6, + 0x6C05, 0xEBA9, + 0x6C06, 0xEBAB, + 0x6C07, 0xEBAA, + 0x6C0D, 0xEBAC, + 0x6C0F, 0xCACF, + 0x6C10, 0xD8B5, + 0x6C11, 0xC3F1, + 0x6C13, 0xC3A5, + 0x6C14, 0xC6F8, + 0x6C15, 0xEBAD, + 0x6C16, 0xC4CA, + 0x6C18, 0xEBAE, + 0x6C19, 0xEBAF, + 0x6C1A, 0xEBB0, + 0x6C1B, 0xB7D5, + 0x6C1F, 0xB7FA, + 0x6C21, 0xEBB1, + 0x6C22, 0xC7E2, + 0x6C24, 0xEBB3, + 0x6C26, 0xBAA4, + 0x6C27, 0xD1F5, + 0x6C28, 0xB0B1, + 0x6C29, 0xEBB2, + 0x6C2A, 0xEBB4, + 0x6C2E, 0xB5AA, + 0x6C2F, 0xC2C8, + 0x6C30, 0xC7E8, + 0x6C32, 0xEBB5, + 0x6C34, 0xCBAE, + 0x6C35, 0xE3DF, + 0x6C38, 0xD3C0, + 0x6C3D, 0xD9DB, + 0x6C40, 0xCDA1, + 0x6C41, 0xD6AD, + 0x6C42, 0xC7F3, + 0x6C46, 0xD9E0, + 0x6C47, 0xBBE3, + 0x6C49, 0xBABA, + 0x6C4A, 0xE3E2, + 0x6C50, 0xCFAB, + 0x6C54, 0xE3E0, + 0x6C55, 0xC9C7, + 0x6C57, 0xBAB9, + 0x6C5B, 0xD1B4, + 0x6C5C, 0xE3E1, + 0x6C5D, 0xC8EA, + 0x6C5E, 0xB9AF, + 0x6C5F, 0xBDAD, + 0x6C60, 0xB3D8, + 0x6C61, 0xCEDB, + 0x6C64, 0xCCC0, + 0x6C68, 0xE3E8, + 0x6C69, 0xE3E9, + 0x6C6A, 0xCDF4, + 0x6C70, 0xCCAD, + 0x6C72, 0xBCB3, + 0x6C74, 0xE3EA, + 0x6C76, 0xE3EB, + 0x6C79, 0xD0DA, + 0x6C7D, 0xC6FB, + 0x6C7E, 0xB7DA, + 0x6C81, 0xC7DF, + 0x6C82, 0xD2CA, + 0x6C83, 0xCED6, + 0x6C85, 0xE3E4, + 0x6C86, 0xE3EC, + 0x6C88, 0xC9F2, + 0x6C89, 0xB3C1, + 0x6C8C, 0xE3E7, + 0x6C8F, 0xC6E3, + 0x6C90, 0xE3E5, + 0x6C93, 0xEDB3, + 0x6C94, 0xE3E6, + 0x6C99, 0xC9B3, + 0x6C9B, 0xC5E6, + 0x6C9F, 0xB9B5, + 0x6CA1, 0xC3BB, + 0x6CA3, 0xE3E3, + 0x6CA4, 0xC5BD, + 0x6CA5, 0xC1A4, + 0x6CA6, 0xC2D9, + 0x6CA7, 0xB2D7, + 0x6CA9, 0xE3ED, + 0x6CAA, 0xBBA6, + 0x6CAB, 0xC4AD, + 0x6CAD, 0xE3F0, + 0x6CAE, 0xBEDA, + 0x6CB1, 0xE3FB, + 0x6CB2, 0xE3F5, + 0x6CB3, 0xBAD3, + 0x6CB8, 0xB7D0, + 0x6CB9, 0xD3CD, + 0x6CBB, 0xD6CE, + 0x6CBC, 0xD5D3, + 0x6CBD, 0xB9C1, + 0x6CBE, 0xD5B4, + 0x6CBF, 0xD1D8, + 0x6CC4, 0xD0B9, + 0x6CC5, 0xC7F6, + 0x6CC9, 0xC8AA, + 0x6CCA, 0xB2B4, + 0x6CCC, 0xC3DA, + 0x6CD0, 0xE3EE, + 0x6CD3, 0xE3FC, + 0x6CD4, 0xE3EF, + 0x6CD5, 0xB7A8, + 0x6CD6, 0xE3F7, + 0x6CD7, 0xE3F4, + 0x6CDB, 0xB7BA, + 0x6CDE, 0xC5A2, + 0x6CE0, 0xE3F6, + 0x6CE1, 0xC5DD, + 0x6CE2, 0xB2A8, + 0x6CE3, 0xC6FC, + 0x6CE5, 0xC4E0, + 0x6CE8, 0xD7A2, + 0x6CEA, 0xC0E1, + 0x6CEB, 0xE3F9, + 0x6CEE, 0xE3FA, + 0x6CEF, 0xE3FD, + 0x6CF0, 0xCCA9, + 0x6CF1, 0xE3F3, + 0x6CF3, 0xD3BE, + 0x6CF5, 0xB1C3, + 0x6CF6, 0xEDB4, + 0x6CF7, 0xE3F1, + 0x6CF8, 0xE3F2, + 0x6CFA, 0xE3F8, + 0x6CFB, 0xD0BA, + 0x6CFC, 0xC6C3, + 0x6CFD, 0xD4F3, + 0x6CFE, 0xE3FE, + 0x6D01, 0xBDE0, + 0x6D04, 0xE4A7, + 0x6D07, 0xE4A6, + 0x6D0B, 0xD1F3, + 0x6D0C, 0xE4A3, + 0x6D0E, 0xE4A9, + 0x6D12, 0xC8F7, + 0x6D17, 0xCFB4, + 0x6D19, 0xE4A8, + 0x6D1A, 0xE4AE, + 0x6D1B, 0xC2E5, + 0x6D1E, 0xB6B4, + 0x6D25, 0xBDF2, + 0x6D27, 0xE4A2, + 0x6D2A, 0xBAE9, + 0x6D2B, 0xE4AA, + 0x6D2E, 0xE4AC, + 0x6D31, 0xB6FD, + 0x6D32, 0xD6DE, + 0x6D33, 0xE4B2, + 0x6D35, 0xE4AD, + 0x6D39, 0xE4A1, + 0x6D3B, 0xBBEE, + 0x6D3C, 0xCDDD, + 0x6D3D, 0xC7A2, + 0x6D3E, 0xC5C9, + 0x6D41, 0xC1F7, + 0x6D43, 0xE4A4, + 0x6D45, 0xC7B3, + 0x6D46, 0xBDAC, + 0x6D47, 0xBDBD, + 0x6D48, 0xE4A5, + 0x6D4A, 0xD7C7, + 0x6D4B, 0xB2E2, + 0x6D4D, 0xE4AB, + 0x6D4E, 0xBCC3, + 0x6D4F, 0xE4AF, + 0x6D51, 0xBBEB, + 0x6D52, 0xE4B0, + 0x6D53, 0xC5A8, + 0x6D54, 0xE4B1, + 0x6D59, 0xD5E3, + 0x6D5A, 0xBFA3, + 0x6D5C, 0xE4BA, + 0x6D5E, 0xE4B7, + 0x6D60, 0xE4BB, + 0x6D63, 0xE4BD, + 0x6D66, 0xC6D6, + 0x6D69, 0xBAC6, + 0x6D6A, 0xC0CB, + 0x6D6E, 0xB8A1, + 0x6D6F, 0xE4B4, + 0x6D74, 0xD4A1, + 0x6D77, 0xBAA3, + 0x6D78, 0xBDFE, + 0x6D7C, 0xE4BC, + 0x6D82, 0xCDBF, + 0x6D85, 0xC4F9, + 0x6D88, 0xCFFB, + 0x6D89, 0xC9E6, + 0x6D8C, 0xD3BF, + 0x6D8E, 0xCFD1, + 0x6D91, 0xE4B3, + 0x6D93, 0xE4B8, + 0x6D94, 0xE4B9, + 0x6D95, 0xCCE9, + 0x6D9B, 0xCCCE, + 0x6D9D, 0xC0D4, + 0x6D9E, 0xE4B5, + 0x6D9F, 0xC1B0, + 0x6DA0, 0xE4B6, + 0x6DA1, 0xCED0, + 0x6DA3, 0xBBC1, + 0x6DA4, 0xB5D3, + 0x6DA6, 0xC8F3, + 0x6DA7, 0xBDA7, + 0x6DA8, 0xD5C7, + 0x6DA9, 0xC9AC, + 0x6DAA, 0xB8A2, + 0x6DAB, 0xE4CA, + 0x6DAE, 0xE4CC, + 0x6DAF, 0xD1C4, + 0x6DB2, 0xD2BA, + 0x6DB5, 0xBAAD, + 0x6DB8, 0xBAD4, + 0x6DBF, 0xE4C3, + 0x6DC0, 0xB5ED, + 0x6DC4, 0xD7CD, + 0x6DC5, 0xE4C0, + 0x6DC6, 0xCFFD, + 0x6DC7, 0xE4BF, + 0x6DCB, 0xC1DC, + 0x6DCC, 0xCCCA, + 0x6DD1, 0xCAE7, + 0x6DD6, 0xC4D7, + 0x6DD8, 0xCCD4, + 0x6DD9, 0xE4C8, + 0x6DDD, 0xE4C7, + 0x6DDE, 0xE4C1, + 0x6DE0, 0xE4C4, + 0x6DE1, 0xB5AD, + 0x6DE4, 0xD3D9, + 0x6DE6, 0xE4C6, + 0x6DEB, 0xD2F9, + 0x6DEC, 0xB4E3, + 0x6DEE, 0xBBB4, + 0x6DF1, 0xC9EE, + 0x6DF3, 0xB4BE, + 0x6DF7, 0xBBEC, + 0x6DF9, 0xD1CD, + 0x6DFB, 0xCCED, + 0x6DFC, 0xEDB5, + 0x6E05, 0xC7E5, + 0x6E0A, 0xD4A8, + 0x6E0C, 0xE4CB, + 0x6E0D, 0xD7D5, + 0x6E0E, 0xE4C2, + 0x6E10, 0xBDA5, + 0x6E11, 0xE4C5, + 0x6E14, 0xD3E6, + 0x6E16, 0xE4C9, + 0x6E17, 0xC9F8, + 0x6E1A, 0xE4BE, + 0x6E1D, 0xD3E5, + 0x6E20, 0xC7FE, + 0x6E21, 0xB6C9, + 0x6E23, 0xD4FC, + 0x6E24, 0xB2B3, + 0x6E25, 0xE4D7, + 0x6E29, 0xCEC2, + 0x6E2B, 0xE4CD, + 0x6E2D, 0xCEBC, + 0x6E2F, 0xB8DB, + 0x6E32, 0xE4D6, + 0x6E34, 0xBFCA, + 0x6E38, 0xD3CE, + 0x6E3A, 0xC3EC, + 0x6E43, 0xC5C8, + 0x6E44, 0xE4D8, + 0x6E4D, 0xCDC4, + 0x6E4E, 0xE4CF, + 0x6E53, 0xE4D4, + 0x6E54, 0xE4D5, + 0x6E56, 0xBAFE, + 0x6E58, 0xCFE6, + 0x6E5B, 0xD5BF, + 0x6E5F, 0xE4D2, + 0x6E6B, 0xE4D0, + 0x6E6E, 0xE4CE, + 0x6E7E, 0xCDE5, + 0x6E7F, 0xCAAA, + 0x6E83, 0xC0A3, + 0x6E85, 0xBDA6, + 0x6E86, 0xE4D3, + 0x6E89, 0xB8C8, + 0x6E8F, 0xE4E7, + 0x6E90, 0xD4B4, + 0x6E98, 0xE4DB, + 0x6E9C, 0xC1EF, + 0x6E9F, 0xE4E9, + 0x6EA2, 0xD2E7, + 0x6EA5, 0xE4DF, + 0x6EA7, 0xE4E0, + 0x6EAA, 0xCFAA, + 0x6EAF, 0xCBDD, + 0x6EB1, 0xE4DA, + 0x6EB2, 0xE4D1, + 0x6EB4, 0xE4E5, + 0x6EB6, 0xC8DC, + 0x6EB7, 0xE4E3, + 0x6EBA, 0xC4E7, + 0x6EBB, 0xE4E2, + 0x6EBD, 0xE4E1, + 0x6EC1, 0xB3FC, + 0x6EC2, 0xE4E8, + 0x6EC7, 0xB5E1, + 0x6ECB, 0xD7CC, + 0x6ECF, 0xE4E6, + 0x6ED1, 0xBBAC, + 0x6ED3, 0xD7D2, + 0x6ED4, 0xCCCF, + 0x6ED5, 0xEBF8, + 0x6ED7, 0xE4E4, + 0x6EDA, 0xB9F6, + 0x6EDE, 0xD6CD, + 0x6EDF, 0xE4D9, + 0x6EE0, 0xE4DC, + 0x6EE1, 0xC2FA, + 0x6EE2, 0xE4DE, + 0x6EE4, 0xC2CB, + 0x6EE5, 0xC0C4, + 0x6EE6, 0xC2D0, + 0x6EE8, 0xB1F5, + 0x6EE9, 0xCCB2, + 0x6EF4, 0xB5CE, + 0x6EF9, 0xE4EF, + 0x6F02, 0xC6AF, + 0x6F06, 0xC6E1, + 0x6F09, 0xE4F5, + 0x6F0F, 0xC2A9, + 0x6F13, 0xC0EC, + 0x6F14, 0xD1DD, + 0x6F15, 0xE4EE, + 0x6F20, 0xC4AE, + 0x6F24, 0xE4ED, + 0x6F29, 0xE4F6, + 0x6F2A, 0xE4F4, + 0x6F2B, 0xC2FE, + 0x6F2D, 0xE4DD, + 0x6F2F, 0xE4F0, + 0x6F31, 0xCAFE, + 0x6F33, 0xD5C4, + 0x6F36, 0xE4F1, + 0x6F3E, 0xD1FA, + 0x6F46, 0xE4EB, + 0x6F47, 0xE4EC, + 0x6F4B, 0xE4F2, + 0x6F4D, 0xCEAB, + 0x6F58, 0xC5CB, + 0x6F5C, 0xC7B1, + 0x6F5E, 0xC2BA, + 0x6F62, 0xE4EA, + 0x6F66, 0xC1CA, + 0x6F6D, 0xCCB6, + 0x6F6E, 0xB3B1, + 0x6F72, 0xE4FB, + 0x6F74, 0xE4F3, + 0x6F78, 0xE4FA, + 0x6F7A, 0xE4FD, + 0x6F7C, 0xE4FC, + 0x6F84, 0xB3CE, + 0x6F88, 0xB3BA, + 0x6F89, 0xE4F7, + 0x6F8C, 0xE4F9, + 0x6F8D, 0xE4F8, + 0x6F8E, 0xC5EC, + 0x6F9C, 0xC0BD, + 0x6FA1, 0xD4E8, + 0x6FA7, 0xE5A2, + 0x6FB3, 0xB0C4, + 0x6FB6, 0xE5A4, + 0x6FB9, 0xE5A3, + 0x6FC0, 0xBCA4, + 0x6FC2, 0xE5A5, + 0x6FC9, 0xE5A1, + 0x6FD1, 0xE4FE, + 0x6FD2, 0xB1F4, + 0x6FDE, 0xE5A8, + 0x6FE0, 0xE5A9, + 0x6FE1, 0xE5A6, + 0x6FEE, 0xE5A7, + 0x6FEF, 0xE5AA, + 0x7011, 0xC6D9, + 0x701A, 0xE5AB, + 0x701B, 0xE5AD, + 0x7023, 0xE5AC, + 0x7035, 0xE5AF, + 0x7039, 0xE5AE, + 0x704C, 0xB9E0, + 0x704F, 0xE5B0, + 0x705E, 0xE5B1, + 0x706B, 0xBBF0, + 0x706C, 0xECE1, + 0x706D, 0xC3F0, + 0x706F, 0xB5C6, + 0x7070, 0xBBD2, + 0x7075, 0xC1E9, + 0x7076, 0xD4EE, + 0x7078, 0xBEC4, + 0x707C, 0xD7C6, + 0x707E, 0xD4D6, + 0x707F, 0xB2D3, + 0x7080, 0xECBE, + 0x7085, 0xEAC1, + 0x7089, 0xC2AF, + 0x708A, 0xB4B6, + 0x708E, 0xD1D7, + 0x7092, 0xB3B4, + 0x7094, 0xC8B2, + 0x7095, 0xBFBB, + 0x7096, 0xECC0, + 0x7099, 0xD6CB, + 0x709C, 0xECBF, + 0x709D, 0xECC1, + 0x70AB, 0xECC5, + 0x70AC, 0xBEE6, + 0x70AD, 0xCCBF, + 0x70AE, 0xC5DA, + 0x70AF, 0xBEBC, + 0x70B1, 0xECC6, + 0x70B3, 0xB1FE, + 0x70B7, 0xECC4, + 0x70B8, 0xD5A8, + 0x70B9, 0xB5E3, + 0x70BB, 0xECC2, + 0x70BC, 0xC1B6, + 0x70BD, 0xB3E3, + 0x70C0, 0xECC3, + 0x70C1, 0xCBB8, + 0x70C2, 0xC0C3, + 0x70C3, 0xCCFE, + 0x70C8, 0xC1D2, + 0x70CA, 0xECC8, + 0x70D8, 0xBAE6, + 0x70D9, 0xC0D3, + 0x70DB, 0xD6F2, + 0x70DF, 0xD1CC, + 0x70E4, 0xBFBE, + 0x70E6, 0xB7B3, + 0x70E7, 0xC9D5, + 0x70E8, 0xECC7, + 0x70E9, 0xBBE2, + 0x70EB, 0xCCCC, + 0x70EC, 0xBDFD, + 0x70ED, 0xC8C8, + 0x70EF, 0xCFA9, + 0x70F7, 0xCDE9, + 0x70F9, 0xC5EB, + 0x70FD, 0xB7E9, + 0x7109, 0xD1C9, + 0x710A, 0xBAB8, + 0x7110, 0xECC9, + 0x7113, 0xECCA, + 0x7115, 0xBBC0, + 0x7116, 0xECCB, + 0x7118, 0xECE2, + 0x7119, 0xB1BA, + 0x711A, 0xB7D9, + 0x7126, 0xBDB9, + 0x712F, 0xECCC, + 0x7130, 0xD1E6, + 0x7131, 0xECCD, + 0x7136, 0xC8BB, + 0x7145, 0xECD1, + 0x714A, 0xECD3, + 0x714C, 0xBBCD, + 0x714E, 0xBCE5, + 0x715C, 0xECCF, + 0x715E, 0xC9B7, + 0x7164, 0xC3BA, + 0x7166, 0xECE3, + 0x7167, 0xD5D5, + 0x7168, 0xECD0, + 0x716E, 0xD6F3, + 0x7172, 0xECD2, + 0x7173, 0xECCE, + 0x7178, 0xECD4, + 0x717A, 0xECD5, + 0x717D, 0xC9BF, + 0x7184, 0xCFA8, + 0x718A, 0xD0DC, + 0x718F, 0xD1AC, + 0x7194, 0xC8DB, + 0x7198, 0xECD6, + 0x7199, 0xCEF5, + 0x719F, 0xCAEC, + 0x71A0, 0xECDA, + 0x71A8, 0xECD9, + 0x71AC, 0xB0BE, + 0x71B3, 0xECD7, + 0x71B5, 0xECD8, + 0x71B9, 0xECE4, + 0x71C3, 0xC8BC, + 0x71CE, 0xC1C7, + 0x71D4, 0xECDC, + 0x71D5, 0xD1E0, + 0x71E0, 0xECDB, + 0x71E5, 0xD4EF, + 0x71E7, 0xECDD, + 0x71EE, 0xDBC6, + 0x71F9, 0xECDE, + 0x7206, 0xB1AC, + 0x721D, 0xECDF, + 0x7228, 0xECE0, + 0x722A, 0xD7A6, + 0x722C, 0xC5C0, + 0x7230, 0xEBBC, + 0x7231, 0xB0AE, + 0x7235, 0xBEF4, + 0x7236, 0xB8B8, + 0x7237, 0xD2AF, + 0x7238, 0xB0D6, + 0x7239, 0xB5F9, + 0x723B, 0xD8B3, + 0x723D, 0xCBAC, + 0x723F, 0xE3DD, + 0x7247, 0xC6AC, + 0x7248, 0xB0E6, + 0x724C, 0xC5C6, + 0x724D, 0xEBB9, + 0x7252, 0xEBBA, + 0x7256, 0xEBBB, + 0x7259, 0xD1C0, + 0x725B, 0xC5A3, + 0x725D, 0xEAF2, + 0x725F, 0xC4B2, + 0x7261, 0xC4B5, + 0x7262, 0xC0CE, + 0x7266, 0xEAF3, + 0x7267, 0xC4C1, + 0x7269, 0xCEEF, + 0x726E, 0xEAF0, + 0x726F, 0xEAF4, + 0x7272, 0xC9FC, + 0x7275, 0xC7A3, + 0x7279, 0xCCD8, + 0x727A, 0xCEFE, + 0x727E, 0xEAF5, + 0x727F, 0xEAF6, + 0x7280, 0xCFAC, + 0x7281, 0xC0E7, + 0x7284, 0xEAF7, + 0x728A, 0xB6BF, + 0x728B, 0xEAF8, + 0x728D, 0xEAF9, + 0x728F, 0xEAFA, + 0x7292, 0xEAFB, + 0x729F, 0xEAF1, + 0x72AC, 0xC8AE, + 0x72AD, 0xE1EB, + 0x72AF, 0xB7B8, + 0x72B0, 0xE1EC, + 0x72B4, 0xE1ED, + 0x72B6, 0xD7B4, + 0x72B7, 0xE1EE, + 0x72B8, 0xE1EF, + 0x72B9, 0xD3CC, + 0x72C1, 0xE1F1, + 0x72C2, 0xBFF1, + 0x72C3, 0xE1F0, + 0x72C4, 0xB5D2, + 0x72C8, 0xB1B7, + 0x72CD, 0xE1F3, + 0x72CE, 0xE1F2, + 0x72D0, 0xBAFC, + 0x72D2, 0xE1F4, + 0x72D7, 0xB9B7, + 0x72D9, 0xBED1, + 0x72DE, 0xC4FC, + 0x72E0, 0xBADD, + 0x72E1, 0xBDC6, + 0x72E8, 0xE1F5, + 0x72E9, 0xE1F7, + 0x72EC, 0xB6C0, + 0x72ED, 0xCFC1, + 0x72EE, 0xCAA8, + 0x72EF, 0xE1F6, + 0x72F0, 0xD5F8, + 0x72F1, 0xD3FC, + 0x72F2, 0xE1F8, + 0x72F3, 0xE1FC, + 0x72F4, 0xE1F9, + 0x72F7, 0xE1FA, + 0x72F8, 0xC0EA, + 0x72FA, 0xE1FE, + 0x72FB, 0xE2A1, + 0x72FC, 0xC0C7, + 0x7301, 0xE1FB, + 0x7303, 0xE1FD, + 0x730A, 0xE2A5, + 0x730E, 0xC1D4, + 0x7313, 0xE2A3, + 0x7315, 0xE2A8, + 0x7316, 0xB2FE, + 0x7317, 0xE2A2, + 0x731B, 0xC3CD, + 0x731C, 0xB2C2, + 0x731D, 0xE2A7, + 0x731E, 0xE2A6, + 0x7321, 0xE2A4, + 0x7322, 0xE2A9, + 0x7325, 0xE2AB, + 0x7329, 0xD0C9, + 0x732A, 0xD6ED, + 0x732B, 0xC3A8, + 0x732C, 0xE2AC, + 0x732E, 0xCFD7, + 0x7331, 0xE2AE, + 0x7334, 0xBAEF, + 0x7337, 0xE9E0, + 0x7338, 0xE2AD, + 0x7339, 0xE2AA, + 0x733E, 0xBBAB, + 0x733F, 0xD4B3, + 0x734D, 0xE2B0, + 0x7350, 0xE2AF, + 0x7352, 0xE9E1, + 0x7357, 0xE2B1, + 0x7360, 0xE2B2, + 0x736C, 0xE2B3, + 0x736D, 0xCCA1, + 0x736F, 0xE2B4, + 0x737E, 0xE2B5, + 0x7384, 0xD0FE, + 0x7387, 0xC2CA, + 0x7389, 0xD3F1, + 0x738B, 0xCDF5, + 0x738E, 0xE7E0, + 0x7391, 0xE7E1, + 0x7396, 0xBEC1, + 0x739B, 0xC2EA, + 0x739F, 0xE7E4, + 0x73A2, 0xE7E3, + 0x73A9, 0xCDE6, + 0x73AB, 0xC3B5, + 0x73AE, 0xE7E2, + 0x73AF, 0xBBB7, + 0x73B0, 0xCFD6, + 0x73B2, 0xC1E1, + 0x73B3, 0xE7E9, + 0x73B7, 0xE7E8, + 0x73BA, 0xE7F4, + 0x73BB, 0xB2A3, + 0x73C0, 0xE7EA, + 0x73C2, 0xE7E6, + 0x73C8, 0xE7EC, + 0x73C9, 0xE7EB, + 0x73CA, 0xC9BA, + 0x73CD, 0xD5E4, + 0x73CF, 0xE7E5, + 0x73D0, 0xB7A9, + 0x73D1, 0xE7E7, + 0x73D9, 0xE7EE, + 0x73DE, 0xE7F3, + 0x73E0, 0xD6E9, + 0x73E5, 0xE7ED, + 0x73E7, 0xE7F2, + 0x73E9, 0xE7F1, + 0x73ED, 0xB0E0, + 0x73F2, 0xE7F5, + 0x7403, 0xC7F2, + 0x7405, 0xC0C5, + 0x7406, 0xC0ED, + 0x7409, 0xC1F0, + 0x740A, 0xE7F0, + 0x740F, 0xE7F6, + 0x7410, 0xCBF6, + 0x741A, 0xE8A2, + 0x741B, 0xE8A1, + 0x7422, 0xD7C1, + 0x7425, 0xE7FA, + 0x7426, 0xE7F9, + 0x7428, 0xE7FB, + 0x742A, 0xE7F7, + 0x742C, 0xE7FE, + 0x742E, 0xE7FD, + 0x7430, 0xE7FC, + 0x7433, 0xC1D5, + 0x7434, 0xC7D9, + 0x7435, 0xC5FD, + 0x7436, 0xC5C3, + 0x743C, 0xC7ED, + 0x7441, 0xE8A3, + 0x7455, 0xE8A6, + 0x7457, 0xE8A5, + 0x7459, 0xE8A7, + 0x745A, 0xBAF7, + 0x745B, 0xE7F8, + 0x745C, 0xE8A4, + 0x745E, 0xC8F0, + 0x745F, 0xC9AA, + 0x746D, 0xE8A9, + 0x7470, 0xB9E5, + 0x7476, 0xD1FE, + 0x7477, 0xE8A8, + 0x747E, 0xE8AA, + 0x7480, 0xE8AD, + 0x7481, 0xE8AE, + 0x7483, 0xC1A7, + 0x7487, 0xE8AF, + 0x748B, 0xE8B0, + 0x748E, 0xE8AC, + 0x7490, 0xE8B4, + 0x749C, 0xE8AB, + 0x749E, 0xE8B1, + 0x74A7, 0xE8B5, + 0x74A8, 0xE8B2, + 0x74A9, 0xE8B3, + 0x74BA, 0xE8B7, + 0x74D2, 0xE8B6, + 0x74DC, 0xB9CF, + 0x74DE, 0xF0AC, + 0x74E0, 0xF0AD, + 0x74E2, 0xC6B0, + 0x74E3, 0xB0EA, + 0x74E4, 0xC8BF, + 0x74E6, 0xCDDF, + 0x74EE, 0xCECD, + 0x74EF, 0xEAB1, + 0x74F4, 0xEAB2, + 0x74F6, 0xC6BF, + 0x74F7, 0xB4C9, + 0x74FF, 0xEAB3, + 0x7504, 0xD5E7, + 0x750D, 0xDDF9, + 0x750F, 0xEAB4, + 0x7511, 0xEAB5, + 0x7513, 0xEAB6, + 0x7518, 0xB8CA, + 0x7519, 0xDFB0, + 0x751A, 0xC9F5, + 0x751C, 0xCCF0, + 0x751F, 0xC9FA, + 0x7525, 0xC9FB, + 0x7528, 0xD3C3, + 0x7529, 0xCBA6, + 0x752B, 0xB8A6, + 0x752C, 0xF0AE, + 0x752D, 0xB1C2, + 0x752F, 0xE5B8, + 0x7530, 0xCCEF, + 0x7531, 0xD3C9, + 0x7532, 0xBCD7, + 0x7533, 0xC9EA, + 0x7535, 0xB5E7, + 0x7537, 0xC4D0, + 0x7538, 0xB5E9, + 0x753A, 0xEEAE, + 0x753B, 0xBBAD, + 0x753E, 0xE7DE, + 0x7540, 0xEEAF, + 0x7545, 0xB3A9, + 0x7548, 0xEEB2, + 0x754B, 0xEEB1, + 0x754C, 0xBDE7, + 0x754E, 0xEEB0, + 0x754F, 0xCEB7, + 0x7554, 0xC5CF, + 0x7559, 0xC1F4, + 0x755A, 0xDBCE, + 0x755B, 0xEEB3, + 0x755C, 0xD0F3, + 0x7565, 0xC2D4, + 0x7566, 0xC6E8, + 0x756A, 0xB7AC, + 0x7572, 0xEEB4, + 0x7574, 0xB3EB, + 0x7578, 0xBBFB, + 0x7579, 0xEEB5, + 0x757F, 0xE7DC, + 0x7583, 0xEEB6, + 0x7586, 0xBDAE, + 0x758B, 0xF1E2, + 0x758F, 0xCAE8, + 0x7591, 0xD2C9, + 0x7592, 0xF0DA, + 0x7594, 0xF0DB, + 0x7596, 0xF0DC, + 0x7597, 0xC1C6, + 0x7599, 0xB8ED, + 0x759A, 0xBECE, + 0x759D, 0xF0DE, + 0x759F, 0xC5B1, + 0x75A0, 0xF0DD, + 0x75A1, 0xD1F1, + 0x75A3, 0xF0E0, + 0x75A4, 0xB0CC, + 0x75A5, 0xBDEA, + 0x75AB, 0xD2DF, + 0x75AC, 0xF0DF, + 0x75AE, 0xB4AF, + 0x75AF, 0xB7E8, + 0x75B0, 0xF0E6, + 0x75B1, 0xF0E5, + 0x75B2, 0xC6A3, + 0x75B3, 0xF0E1, + 0x75B4, 0xF0E2, + 0x75B5, 0xB4C3, + 0x75B8, 0xF0E3, + 0x75B9, 0xD5EE, + 0x75BC, 0xCCDB, + 0x75BD, 0xBED2, + 0x75BE, 0xBCB2, + 0x75C2, 0xF0E8, + 0x75C3, 0xF0E7, + 0x75C4, 0xF0E4, + 0x75C5, 0xB2A1, + 0x75C7, 0xD6A2, + 0x75C8, 0xD3B8, + 0x75C9, 0xBEB7, + 0x75CA, 0xC8AC, + 0x75CD, 0xF0EA, + 0x75D2, 0xD1F7, + 0x75D4, 0xD6CC, + 0x75D5, 0xBADB, + 0x75D6, 0xF0E9, + 0x75D8, 0xB6BB, + 0x75DB, 0xCDB4, + 0x75DE, 0xC6A6, + 0x75E2, 0xC1A1, + 0x75E3, 0xF0EB, + 0x75E4, 0xF0EE, + 0x75E6, 0xF0ED, + 0x75E7, 0xF0F0, + 0x75E8, 0xF0EC, + 0x75EA, 0xBBBE, + 0x75EB, 0xF0EF, + 0x75F0, 0xCCB5, + 0x75F1, 0xF0F2, + 0x75F4, 0xB3D5, + 0x75F9, 0xB1D4, + 0x75FC, 0xF0F3, + 0x75FF, 0xF0F4, + 0x7600, 0xF0F6, + 0x7601, 0xB4E1, + 0x7603, 0xF0F1, + 0x7605, 0xF0F7, + 0x760A, 0xF0FA, + 0x760C, 0xF0F8, + 0x7610, 0xF0F5, + 0x7615, 0xF0FD, + 0x7617, 0xF0F9, + 0x7618, 0xF0FC, + 0x7619, 0xF0FE, + 0x761B, 0xF1A1, + 0x761F, 0xCEC1, + 0x7620, 0xF1A4, + 0x7622, 0xF1A3, + 0x7624, 0xC1F6, + 0x7625, 0xF0FB, + 0x7626, 0xCADD, + 0x7629, 0xB4F1, + 0x762A, 0xB1F1, + 0x762B, 0xCCB1, + 0x762D, 0xF1A6, + 0x7630, 0xF1A7, + 0x7633, 0xF1AC, + 0x7634, 0xD5CE, + 0x7635, 0xF1A9, + 0x7638, 0xC8B3, + 0x763C, 0xF1A2, + 0x763E, 0xF1AB, + 0x763F, 0xF1A8, + 0x7640, 0xF1A5, + 0x7643, 0xF1AA, + 0x764C, 0xB0A9, + 0x764D, 0xF1AD, + 0x7654, 0xF1AF, + 0x7656, 0xF1B1, + 0x765C, 0xF1B0, + 0x765E, 0xF1AE, + 0x7663, 0xD1A2, + 0x766B, 0xF1B2, + 0x766F, 0xF1B3, + 0x7678, 0xB9EF, + 0x767B, 0xB5C7, + 0x767D, 0xB0D7, + 0x767E, 0xB0D9, + 0x7682, 0xD4ED, + 0x7684, 0xB5C4, + 0x7686, 0xBDD4, + 0x7687, 0xBBCA, + 0x7688, 0xF0A7, + 0x768B, 0xB8DE, + 0x768E, 0xF0A8, + 0x7691, 0xB0A8, + 0x7693, 0xF0A9, + 0x7696, 0xCDEE, + 0x7699, 0xF0AA, + 0x76A4, 0xF0AB, + 0x76AE, 0xC6A4, + 0x76B1, 0xD6E5, + 0x76B2, 0xF1E4, + 0x76B4, 0xF1E5, + 0x76BF, 0xC3F3, + 0x76C2, 0xD3DB, + 0x76C5, 0xD6D1, + 0x76C6, 0xC5E8, + 0x76C8, 0xD3AF, + 0x76CA, 0xD2E6, + 0x76CD, 0xEEC1, + 0x76CE, 0xB0BB, + 0x76CF, 0xD5B5, + 0x76D0, 0xD1CE, + 0x76D1, 0xBCE0, + 0x76D2, 0xBAD0, + 0x76D4, 0xBFF8, + 0x76D6, 0xB8C7, + 0x76D7, 0xB5C1, + 0x76D8, 0xC5CC, + 0x76DB, 0xCAA2, + 0x76DF, 0xC3CB, + 0x76E5, 0xEEC2, + 0x76EE, 0xC4BF, + 0x76EF, 0xB6A2, + 0x76F1, 0xEDEC, + 0x76F2, 0xC3A4, + 0x76F4, 0xD6B1, + 0x76F8, 0xCFE0, + 0x76F9, 0xEDEF, + 0x76FC, 0xC5CE, + 0x76FE, 0xB6DC, + 0x7701, 0xCAA1, + 0x7704, 0xEDED, + 0x7707, 0xEDF0, + 0x7708, 0xEDF1, + 0x7709, 0xC3BC, + 0x770B, 0xBFB4, + 0x770D, 0xEDEE, + 0x7719, 0xEDF4, + 0x771A, 0xEDF2, + 0x771F, 0xD5E6, + 0x7720, 0xC3DF, + 0x7722, 0xEDF3, + 0x7726, 0xEDF6, + 0x7728, 0xD5A3, + 0x7729, 0xD1A3, + 0x772D, 0xEDF5, + 0x772F, 0xC3D0, + 0x7735, 0xEDF7, + 0x7736, 0xBFF4, + 0x7737, 0xBEEC, + 0x7738, 0xEDF8, + 0x773A, 0xCCF7, + 0x773C, 0xD1DB, + 0x7740, 0xD7C5, + 0x7741, 0xD5F6, + 0x7743, 0xEDFC, + 0x7747, 0xEDFB, + 0x7750, 0xEDF9, + 0x7751, 0xEDFA, + 0x775A, 0xEDFD, + 0x775B, 0xBEA6, + 0x7761, 0xCBAF, + 0x7762, 0xEEA1, + 0x7763, 0xB6BD, + 0x7765, 0xEEA2, + 0x7766, 0xC4C0, + 0x7768, 0xEDFE, + 0x776B, 0xBDDE, + 0x776C, 0xB2C7, + 0x7779, 0xB6C3, + 0x777D, 0xEEA5, + 0x777E, 0xD8BA, + 0x777F, 0xEEA3, + 0x7780, 0xEEA6, + 0x7784, 0xC3E9, + 0x7785, 0xB3F2, + 0x778C, 0xEEA7, + 0x778D, 0xEEA4, + 0x778E, 0xCFB9, + 0x7791, 0xEEA8, + 0x7792, 0xC2F7, + 0x779F, 0xEEA9, + 0x77A0, 0xEEAA, + 0x77A2, 0xDEAB, + 0x77A5, 0xC6B3, + 0x77A7, 0xC7C6, + 0x77A9, 0xD6F5, + 0x77AA, 0xB5C9, + 0x77AC, 0xCBB2, + 0x77B0, 0xEEAB, + 0x77B3, 0xCDAB, + 0x77B5, 0xEEAC, + 0x77BB, 0xD5B0, + 0x77BD, 0xEEAD, + 0x77BF, 0xF6C4, + 0x77CD, 0xDBC7, + 0x77D7, 0xB4A3, + 0x77DB, 0xC3AC, + 0x77DC, 0xF1E6, + 0x77E2, 0xCAB8, + 0x77E3, 0xD2D3, + 0x77E5, 0xD6AA, + 0x77E7, 0xEFF2, + 0x77E9, 0xBED8, + 0x77EB, 0xBDC3, + 0x77EC, 0xEFF3, + 0x77ED, 0xB6CC, + 0x77EE, 0xB0AB, + 0x77F3, 0xCAAF, + 0x77F6, 0xEDB6, + 0x77F8, 0xEDB7, + 0x77FD, 0xCEF9, + 0x77FE, 0xB7AF, + 0x77FF, 0xBFF3, + 0x7800, 0xEDB8, + 0x7801, 0xC2EB, + 0x7802, 0xC9B0, + 0x7809, 0xEDB9, + 0x780C, 0xC6F6, + 0x780D, 0xBFB3, + 0x7811, 0xEDBC, + 0x7812, 0xC5F8, + 0x7814, 0xD1D0, + 0x7816, 0xD7A9, + 0x7817, 0xEDBA, + 0x7818, 0xEDBB, + 0x781A, 0xD1E2, + 0x781C, 0xEDBF, + 0x781D, 0xEDC0, + 0x781F, 0xEDC4, + 0x7823, 0xEDC8, + 0x7825, 0xEDC6, + 0x7826, 0xEDCE, + 0x7827, 0xD5E8, + 0x7829, 0xEDC9, + 0x782C, 0xEDC7, + 0x782D, 0xEDBE, + 0x7830, 0xC5E9, + 0x7834, 0xC6C6, + 0x7837, 0xC9E9, + 0x7838, 0xD4D2, + 0x7839, 0xEDC1, + 0x783A, 0xEDC2, + 0x783B, 0xEDC3, + 0x783C, 0xEDC5, + 0x783E, 0xC0F9, + 0x7840, 0xB4A1, + 0x7845, 0xB9E8, + 0x7847, 0xEDD0, + 0x784C, 0xEDD1, + 0x784E, 0xEDCA, + 0x7850, 0xEDCF, + 0x7852, 0xCEF8, + 0x7855, 0xCBB6, + 0x7856, 0xEDCC, + 0x7857, 0xEDCD, + 0x785D, 0xCFF5, + 0x786A, 0xEDD2, + 0x786B, 0xC1F2, + 0x786C, 0xD3B2, + 0x786D, 0xEDCB, + 0x786E, 0xC8B7, + 0x7877, 0xBCEF, + 0x787C, 0xC5F0, + 0x7887, 0xEDD6, + 0x7889, 0xB5EF, + 0x788C, 0xC2B5, + 0x788D, 0xB0AD, + 0x788E, 0xCBE9, + 0x7891, 0xB1AE, + 0x7893, 0xEDD4, + 0x7897, 0xCDEB, + 0x7898, 0xB5E2, + 0x789A, 0xEDD5, + 0x789B, 0xEDD3, + 0x789C, 0xEDD7, + 0x789F, 0xB5FA, + 0x78A1, 0xEDD8, + 0x78A3, 0xEDD9, + 0x78A5, 0xEDDC, + 0x78A7, 0xB1CC, + 0x78B0, 0xC5F6, + 0x78B1, 0xBCEE, + 0x78B2, 0xEDDA, + 0x78B3, 0xCCBC, + 0x78B4, 0xB2EA, + 0x78B9, 0xEDDB, + 0x78BE, 0xC4EB, + 0x78C1, 0xB4C5, + 0x78C5, 0xB0F5, + 0x78C9, 0xEDDF, + 0x78CA, 0xC0DA, + 0x78CB, 0xB4E8, + 0x78D0, 0xC5CD, + 0x78D4, 0xEDDD, + 0x78D5, 0xBFC4, + 0x78D9, 0xEDDE, + 0x78E8, 0xC4A5, + 0x78EC, 0xEDE0, + 0x78F2, 0xEDE1, + 0x78F4, 0xEDE3, + 0x78F7, 0xC1D7, + 0x78FA, 0xBBC7, + 0x7901, 0xBDB8, + 0x7905, 0xEDE2, + 0x7913, 0xEDE4, + 0x791E, 0xEDE6, + 0x7924, 0xEDE5, + 0x7934, 0xEDE7, + 0x793A, 0xCABE, + 0x793B, 0xECEA, + 0x793C, 0xC0F1, + 0x793E, 0xC9E7, + 0x7940, 0xECEB, + 0x7941, 0xC6EE, + 0x7946, 0xECEC, + 0x7948, 0xC6ED, + 0x7949, 0xECED, + 0x7953, 0xECF0, + 0x7956, 0xD7E6, + 0x7957, 0xECF3, + 0x795A, 0xECF1, + 0x795B, 0xECEE, + 0x795C, 0xECEF, + 0x795D, 0xD7A3, + 0x795E, 0xC9F1, + 0x795F, 0xCBEE, + 0x7960, 0xECF4, + 0x7962, 0xECF2, + 0x7965, 0xCFE9, + 0x7967, 0xECF6, + 0x7968, 0xC6B1, + 0x796D, 0xBCC0, + 0x796F, 0xECF5, + 0x7977, 0xB5BB, + 0x7978, 0xBBF6, + 0x797A, 0xECF7, + 0x7980, 0xD9F7, + 0x7981, 0xBDFB, + 0x7984, 0xC2BB, + 0x7985, 0xECF8, + 0x798A, 0xECF9, + 0x798F, 0xB8A3, + 0x799A, 0xECFA, + 0x79A7, 0xECFB, + 0x79B3, 0xECFC, + 0x79B9, 0xD3ED, + 0x79BA, 0xD8AE, + 0x79BB, 0xC0EB, + 0x79BD, 0xC7DD, + 0x79BE, 0xBACC, + 0x79C0, 0xD0E3, + 0x79C1, 0xCBBD, + 0x79C3, 0xCDBA, + 0x79C6, 0xB8D1, + 0x79C9, 0xB1FC, + 0x79CB, 0xC7EF, + 0x79CD, 0xD6D6, + 0x79D1, 0xBFC6, + 0x79D2, 0xC3EB, + 0x79D5, 0xEFF5, + 0x79D8, 0xC3D8, + 0x79DF, 0xD7E2, + 0x79E3, 0xEFF7, + 0x79E4, 0xB3D3, + 0x79E6, 0xC7D8, + 0x79E7, 0xD1ED, + 0x79E9, 0xD6C8, + 0x79EB, 0xEFF8, + 0x79ED, 0xEFF6, + 0x79EF, 0xBBFD, + 0x79F0, 0xB3C6, + 0x79F8, 0xBDD5, + 0x79FB, 0xD2C6, + 0x79FD, 0xBBE0, + 0x7A00, 0xCFA1, + 0x7A02, 0xEFFC, + 0x7A03, 0xEFFB, + 0x7A06, 0xEFF9, + 0x7A0B, 0xB3CC, + 0x7A0D, 0xC9D4, + 0x7A0E, 0xCBB0, + 0x7A14, 0xEFFE, + 0x7A17, 0xB0DE, + 0x7A1A, 0xD6C9, + 0x7A1E, 0xEFFD, + 0x7A20, 0xB3ED, + 0x7A23, 0xF6D5, + 0x7A33, 0xCEC8, + 0x7A37, 0xF0A2, + 0x7A39, 0xF0A1, + 0x7A3B, 0xB5BE, + 0x7A3C, 0xBCDA, + 0x7A3D, 0xBBFC, + 0x7A3F, 0xB8E5, + 0x7A46, 0xC4C2, + 0x7A51, 0xF0A3, + 0x7A57, 0xCBEB, + 0x7A70, 0xF0A6, + 0x7A74, 0xD1A8, + 0x7A76, 0xBEBF, + 0x7A77, 0xC7EE, + 0x7A78, 0xF1B6, + 0x7A79, 0xF1B7, + 0x7A7A, 0xBFD5, + 0x7A7F, 0xB4A9, + 0x7A80, 0xF1B8, + 0x7A81, 0xCDBB, + 0x7A83, 0xC7D4, + 0x7A84, 0xD5AD, + 0x7A86, 0xF1B9, + 0x7A88, 0xF1BA, + 0x7A8D, 0xC7CF, + 0x7A91, 0xD2A4, + 0x7A92, 0xD6CF, + 0x7A95, 0xF1BB, + 0x7A96, 0xBDD1, + 0x7A97, 0xB4B0, + 0x7A98, 0xBEBD, + 0x7A9C, 0xB4DC, + 0x7A9D, 0xCED1, + 0x7A9F, 0xBFDF, + 0x7AA0, 0xF1BD, + 0x7AA5, 0xBFFA, + 0x7AA6, 0xF1BC, + 0x7AA8, 0xF1BF, + 0x7AAC, 0xF1BE, + 0x7AAD, 0xF1C0, + 0x7AB3, 0xF1C1, + 0x7ABF, 0xC1FE, + 0x7ACB, 0xC1A2, + 0x7AD6, 0xCAFA, + 0x7AD9, 0xD5BE, + 0x7ADE, 0xBEBA, + 0x7ADF, 0xBEB9, + 0x7AE0, 0xD5C2, + 0x7AE3, 0xBFA2, + 0x7AE5, 0xCDAF, + 0x7AE6, 0xF1B5, + 0x7AED, 0xBDDF, + 0x7AEF, 0xB6CB, + 0x7AF9, 0xD6F1, + 0x7AFA, 0xF3C3, + 0x7AFD, 0xF3C4, + 0x7AFF, 0xB8CD, + 0x7B03, 0xF3C6, + 0x7B04, 0xF3C7, + 0x7B06, 0xB0CA, + 0x7B08, 0xF3C5, + 0x7B0A, 0xF3C9, + 0x7B0B, 0xCBF1, + 0x7B0F, 0xF3CB, + 0x7B11, 0xD0A6, + 0x7B14, 0xB1CA, + 0x7B15, 0xF3C8, + 0x7B19, 0xF3CF, + 0x7B1B, 0xB5D1, + 0x7B1E, 0xF3D7, + 0x7B20, 0xF3D2, + 0x7B24, 0xF3D4, + 0x7B25, 0xF3D3, + 0x7B26, 0xB7FB, + 0x7B28, 0xB1BF, + 0x7B2A, 0xF3CE, + 0x7B2B, 0xF3CA, + 0x7B2C, 0xB5DA, + 0x7B2E, 0xF3D0, + 0x7B31, 0xF3D1, + 0x7B33, 0xF3D5, + 0x7B38, 0xF3CD, + 0x7B3A, 0xBCE3, + 0x7B3C, 0xC1FD, + 0x7B3E, 0xF3D6, + 0x7B45, 0xF3DA, + 0x7B47, 0xF3CC, + 0x7B49, 0xB5C8, + 0x7B4B, 0xBDEE, + 0x7B4C, 0xF3DC, + 0x7B4F, 0xB7A4, + 0x7B50, 0xBFF0, + 0x7B51, 0xD6FE, + 0x7B52, 0xCDB2, + 0x7B54, 0xB4F0, + 0x7B56, 0xB2DF, + 0x7B58, 0xF3D8, + 0x7B5A, 0xF3D9, + 0x7B5B, 0xC9B8, + 0x7B5D, 0xF3DD, + 0x7B60, 0xF3DE, + 0x7B62, 0xF3E1, + 0x7B6E, 0xF3DF, + 0x7B71, 0xF3E3, + 0x7B72, 0xF3E2, + 0x7B75, 0xF3DB, + 0x7B77, 0xBFEA, + 0x7B79, 0xB3EF, + 0x7B7B, 0xF3E0, + 0x7B7E, 0xC7A9, + 0x7B80, 0xBCF2, + 0x7B85, 0xF3EB, + 0x7B8D, 0xB9BF, + 0x7B90, 0xF3E4, + 0x7B94, 0xB2AD, + 0x7B95, 0xBBFE, + 0x7B97, 0xCBE3, + 0x7B9C, 0xF3ED, + 0x7B9D, 0xF3E9, + 0x7BA1, 0xB9DC, + 0x7BA2, 0xF3EE, + 0x7BA6, 0xF3E5, + 0x7BA7, 0xF3E6, + 0x7BA8, 0xF3EA, + 0x7BA9, 0xC2E1, + 0x7BAA, 0xF3EC, + 0x7BAB, 0xF3EF, + 0x7BAC, 0xF3E8, + 0x7BAD, 0xBCFD, + 0x7BB1, 0xCFE4, + 0x7BB4, 0xF3F0, + 0x7BB8, 0xF3E7, + 0x7BC1, 0xF3F2, + 0x7BC6, 0xD7AD, + 0x7BC7, 0xC6AA, + 0x7BCC, 0xF3F3, + 0x7BD1, 0xF3F1, + 0x7BD3, 0xC2A8, + 0x7BD9, 0xB8DD, + 0x7BDA, 0xF3F5, + 0x7BDD, 0xF3F4, + 0x7BE1, 0xB4DB, + 0x7BE5, 0xF3F6, + 0x7BE6, 0xF3F7, + 0x7BEA, 0xF3F8, + 0x7BEE, 0xC0BA, + 0x7BF1, 0xC0E9, + 0x7BF7, 0xC5F1, + 0x7BFC, 0xF3FB, + 0x7BFE, 0xF3FA, + 0x7C07, 0xB4D8, + 0x7C0B, 0xF3FE, + 0x7C0C, 0xF3F9, + 0x7C0F, 0xF3FC, + 0x7C16, 0xF3FD, + 0x7C1F, 0xF4A1, + 0x7C26, 0xF4A3, + 0x7C27, 0xBBC9, + 0x7C2A, 0xF4A2, + 0x7C38, 0xF4A4, + 0x7C3F, 0xB2BE, + 0x7C40, 0xF4A6, + 0x7C41, 0xF4A5, + 0x7C4D, 0xBCAE, + 0x7C73, 0xC3D7, + 0x7C74, 0xD9E1, + 0x7C7B, 0xC0E0, + 0x7C7C, 0xF4CC, + 0x7C7D, 0xD7D1, + 0x7C89, 0xB7DB, + 0x7C91, 0xF4CE, + 0x7C92, 0xC1A3, + 0x7C95, 0xC6C9, + 0x7C97, 0xB4D6, + 0x7C98, 0xD5B3, + 0x7C9C, 0xF4D0, + 0x7C9D, 0xF4CF, + 0x7C9E, 0xF4D1, + 0x7C9F, 0xCBDA, + 0x7CA2, 0xF4D2, + 0x7CA4, 0xD4C1, + 0x7CA5, 0xD6E0, + 0x7CAA, 0xB7E0, + 0x7CAE, 0xC1B8, + 0x7CB1, 0xC1BB, + 0x7CB2, 0xF4D3, + 0x7CB3, 0xBEAC, + 0x7CB9, 0xB4E2, + 0x7CBC, 0xF4D4, + 0x7CBD, 0xF4D5, + 0x7CBE, 0xBEAB, + 0x7CC1, 0xF4D6, + 0x7CC5, 0xF4DB, + 0x7CC7, 0xF4D7, + 0x7CC8, 0xF4DA, + 0x7CCA, 0xBAFD, + 0x7CCC, 0xF4D8, + 0x7CCD, 0xF4D9, + 0x7CD5, 0xB8E2, + 0x7CD6, 0xCCC7, + 0x7CD7, 0xF4DC, + 0x7CD9, 0xB2DA, + 0x7CDC, 0xC3D3, + 0x7CDF, 0xD4E3, + 0x7CE0, 0xBFB7, + 0x7CE8, 0xF4DD, + 0x7CEF, 0xC5B4, + 0x7CF8, 0xF4E9, + 0x7CFB, 0xCFB5, + 0x7D0A, 0xCEC9, + 0x7D20, 0xCBD8, + 0x7D22, 0xCBF7, + 0x7D27, 0xBDF4, + 0x7D2B, 0xD7CF, + 0x7D2F, 0xC0DB, + 0x7D6E, 0xD0F5, + 0x7D77, 0xF4EA, + 0x7DA6, 0xF4EB, + 0x7DAE, 0xF4EC, + 0x7E3B, 0xF7E3, + 0x7E41, 0xB7B1, + 0x7E47, 0xF4ED, + 0x7E82, 0xD7EB, + 0x7E9B, 0xF4EE, + 0x7E9F, 0xE6F9, + 0x7EA0, 0xBEC0, + 0x7EA1, 0xE6FA, + 0x7EA2, 0xBAEC, + 0x7EA3, 0xE6FB, + 0x7EA4, 0xCFCB, + 0x7EA5, 0xE6FC, + 0x7EA6, 0xD4BC, + 0x7EA7, 0xBCB6, + 0x7EA8, 0xE6FD, + 0x7EA9, 0xE6FE, + 0x7EAA, 0xBCCD, + 0x7EAB, 0xC8D2, + 0x7EAC, 0xCEB3, + 0x7EAD, 0xE7A1, + 0x7EAF, 0xB4BF, + 0x7EB0, 0xE7A2, + 0x7EB1, 0xC9B4, + 0x7EB2, 0xB8D9, + 0x7EB3, 0xC4C9, + 0x7EB5, 0xD7DD, + 0x7EB6, 0xC2DA, + 0x7EB7, 0xB7D7, + 0x7EB8, 0xD6BD, + 0x7EB9, 0xCEC6, + 0x7EBA, 0xB7C4, + 0x7EBD, 0xC5A6, + 0x7EBE, 0xE7A3, + 0x7EBF, 0xCFDF, + 0x7EC0, 0xE7A4, + 0x7EC1, 0xE7A5, + 0x7EC2, 0xE7A6, + 0x7EC3, 0xC1B7, + 0x7EC4, 0xD7E9, + 0x7EC5, 0xC9F0, + 0x7EC6, 0xCFB8, + 0x7EC7, 0xD6AF, + 0x7EC8, 0xD6D5, + 0x7EC9, 0xE7A7, + 0x7ECA, 0xB0ED, + 0x7ECB, 0xE7A8, + 0x7ECC, 0xE7A9, + 0x7ECD, 0xC9DC, + 0x7ECE, 0xD2EF, + 0x7ECF, 0xBEAD, + 0x7ED0, 0xE7AA, + 0x7ED1, 0xB0F3, + 0x7ED2, 0xC8DE, + 0x7ED3, 0xBDE1, + 0x7ED4, 0xE7AB, + 0x7ED5, 0xC8C6, + 0x7ED7, 0xE7AC, + 0x7ED8, 0xBBE6, + 0x7ED9, 0xB8F8, + 0x7EDA, 0xD1A4, + 0x7EDB, 0xE7AD, + 0x7EDC, 0xC2E7, + 0x7EDD, 0xBEF8, + 0x7EDE, 0xBDCA, + 0x7EDF, 0xCDB3, + 0x7EE0, 0xE7AE, + 0x7EE1, 0xE7AF, + 0x7EE2, 0xBEEE, + 0x7EE3, 0xD0E5, + 0x7EE5, 0xCBE7, + 0x7EE6, 0xCCD0, + 0x7EE7, 0xBCCC, + 0x7EE8, 0xE7B0, + 0x7EE9, 0xBCA8, + 0x7EEA, 0xD0F7, + 0x7EEB, 0xE7B1, + 0x7EED, 0xD0F8, + 0x7EEE, 0xE7B2, + 0x7EEF, 0xE7B3, + 0x7EF0, 0xB4C2, + 0x7EF1, 0xE7B4, + 0x7EF2, 0xE7B5, + 0x7EF3, 0xC9FE, + 0x7EF4, 0xCEAC, + 0x7EF5, 0xC3E0, + 0x7EF6, 0xE7B7, + 0x7EF7, 0xB1C1, + 0x7EF8, 0xB3F1, + 0x7EFA, 0xE7B8, + 0x7EFB, 0xE7B9, + 0x7EFC, 0xD7DB, + 0x7EFD, 0xD5C0, + 0x7EFE, 0xE7BA, + 0x7EFF, 0xC2CC, + 0x7F00, 0xD7BA, + 0x7F01, 0xE7BB, + 0x7F02, 0xE7BC, + 0x7F03, 0xE7BD, + 0x7F04, 0xBCEA, + 0x7F05, 0xC3E5, + 0x7F06, 0xC0C2, + 0x7F07, 0xE7BE, + 0x7F08, 0xE7BF, + 0x7F09, 0xBCA9, + 0x7F0B, 0xE7C0, + 0x7F0C, 0xE7C1, + 0x7F0D, 0xE7B6, + 0x7F0E, 0xB6D0, + 0x7F0F, 0xE7C2, + 0x7F11, 0xE7C3, + 0x7F12, 0xE7C4, + 0x7F13, 0xBBBA, + 0x7F14, 0xB5DE, + 0x7F15, 0xC2C6, + 0x7F16, 0xB1E0, + 0x7F17, 0xE7C5, + 0x7F18, 0xD4B5, + 0x7F19, 0xE7C6, + 0x7F1A, 0xB8BF, + 0x7F1B, 0xE7C8, + 0x7F1C, 0xE7C7, + 0x7F1D, 0xB7EC, + 0x7F1F, 0xE7C9, + 0x7F20, 0xB2F8, + 0x7F21, 0xE7CA, + 0x7F22, 0xE7CB, + 0x7F23, 0xE7CC, + 0x7F24, 0xE7CD, + 0x7F25, 0xE7CE, + 0x7F26, 0xE7CF, + 0x7F27, 0xE7D0, + 0x7F28, 0xD3A7, + 0x7F29, 0xCBF5, + 0x7F2A, 0xE7D1, + 0x7F2B, 0xE7D2, + 0x7F2C, 0xE7D3, + 0x7F2D, 0xE7D4, + 0x7F2E, 0xC9C9, + 0x7F2F, 0xE7D5, + 0x7F30, 0xE7D6, + 0x7F31, 0xE7D7, + 0x7F32, 0xE7D8, + 0x7F33, 0xE7D9, + 0x7F34, 0xBDC9, + 0x7F35, 0xE7DA, + 0x7F36, 0xF3BE, + 0x7F38, 0xB8D7, + 0x7F3A, 0xC8B1, + 0x7F42, 0xF3BF, + 0x7F44, 0xF3C0, + 0x7F45, 0xF3C1, + 0x7F50, 0xB9DE, + 0x7F51, 0xCDF8, + 0x7F54, 0xD8E8, + 0x7F55, 0xBAB1, + 0x7F57, 0xC2DE, + 0x7F58, 0xEEB7, + 0x7F5A, 0xB7A3, + 0x7F5F, 0xEEB9, + 0x7F61, 0xEEB8, + 0x7F62, 0xB0D5, + 0x7F68, 0xEEBB, + 0x7F69, 0xD5D6, + 0x7F6A, 0xD7EF, + 0x7F6E, 0xD6C3, + 0x7F71, 0xEEBD, + 0x7F72, 0xCAF0, + 0x7F74, 0xEEBC, + 0x7F79, 0xEEBE, + 0x7F7E, 0xEEC0, + 0x7F81, 0xEEBF, + 0x7F8A, 0xD1F2, + 0x7F8C, 0xC7BC, + 0x7F8E, 0xC3C0, + 0x7F94, 0xB8E1, + 0x7F9A, 0xC1E7, + 0x7F9D, 0xF4C6, + 0x7F9E, 0xD0DF, + 0x7F9F, 0xF4C7, + 0x7FA1, 0xCFDB, + 0x7FA4, 0xC8BA, + 0x7FA7, 0xF4C8, + 0x7FAF, 0xF4C9, + 0x7FB0, 0xF4CA, + 0x7FB2, 0xF4CB, + 0x7FB8, 0xD9FA, + 0x7FB9, 0xB8FE, + 0x7FBC, 0xE5F1, + 0x7FBD, 0xD3F0, + 0x7FBF, 0xF4E0, + 0x7FC1, 0xCECC, + 0x7FC5, 0xB3E1, + 0x7FCA, 0xF1B4, + 0x7FCC, 0xD2EE, + 0x7FCE, 0xF4E1, + 0x7FD4, 0xCFE8, + 0x7FD5, 0xF4E2, + 0x7FD8, 0xC7CC, + 0x7FDF, 0xB5D4, + 0x7FE0, 0xB4E4, + 0x7FE1, 0xF4E4, + 0x7FE5, 0xF4E3, + 0x7FE6, 0xF4E5, + 0x7FE9, 0xF4E6, + 0x7FEE, 0xF4E7, + 0x7FF0, 0xBAB2, + 0x7FF1, 0xB0BF, + 0x7FF3, 0xF4E8, + 0x7FFB, 0xB7AD, + 0x7FFC, 0xD2ED, + 0x8000, 0xD2AB, + 0x8001, 0xC0CF, + 0x8003, 0xBFBC, + 0x8004, 0xEBA3, + 0x8005, 0xD5DF, + 0x8006, 0xEAC8, + 0x800B, 0xF1F3, + 0x800C, 0xB6F8, + 0x800D, 0xCBA3, + 0x8010, 0xC4CD, + 0x8012, 0xF1E7, + 0x8014, 0xF1E8, + 0x8015, 0xB8FB, + 0x8016, 0xF1E9, + 0x8017, 0xBAC4, + 0x8018, 0xD4C5, + 0x8019, 0xB0D2, + 0x801C, 0xF1EA, + 0x8020, 0xF1EB, + 0x8022, 0xF1EC, + 0x8025, 0xF1ED, + 0x8026, 0xF1EE, + 0x8027, 0xF1EF, + 0x8028, 0xF1F1, + 0x8029, 0xF1F0, + 0x802A, 0xC5D5, + 0x8031, 0xF1F2, + 0x8033, 0xB6FA, + 0x8035, 0xF1F4, + 0x8036, 0xD2AE, + 0x8037, 0xDEC7, + 0x8038, 0xCBCA, + 0x803B, 0xB3DC, + 0x803D, 0xB5A2, + 0x803F, 0xB9A2, + 0x8042, 0xC4F4, + 0x8043, 0xF1F5, + 0x8046, 0xF1F6, + 0x804A, 0xC1C4, + 0x804B, 0xC1FB, + 0x804C, 0xD6B0, + 0x804D, 0xF1F7, + 0x8052, 0xF1F8, + 0x8054, 0xC1AA, + 0x8058, 0xC6B8, + 0x805A, 0xBEDB, + 0x8069, 0xF1F9, + 0x806A, 0xB4CF, + 0x8071, 0xF1FA, + 0x807F, 0xEDB2, + 0x8080, 0xEDB1, + 0x8083, 0xCBE0, + 0x8084, 0xD2DE, + 0x8086, 0xCBC1, + 0x8087, 0xD5D8, + 0x8089, 0xC8E2, + 0x808B, 0xC0DF, + 0x808C, 0xBCA1, + 0x8093, 0xEBC1, + 0x8096, 0xD0A4, + 0x8098, 0xD6E2, + 0x809A, 0xB6C7, + 0x809B, 0xB8D8, + 0x809C, 0xEBC0, + 0x809D, 0xB8CE, + 0x809F, 0xEBBF, + 0x80A0, 0xB3A6, + 0x80A1, 0xB9C9, + 0x80A2, 0xD6AB, + 0x80A4, 0xB7F4, + 0x80A5, 0xB7CA, + 0x80A9, 0xBCE7, + 0x80AA, 0xB7BE, + 0x80AB, 0xEBC6, + 0x80AD, 0xEBC7, + 0x80AE, 0xB0B9, + 0x80AF, 0xBFCF, + 0x80B1, 0xEBC5, + 0x80B2, 0xD3FD, + 0x80B4, 0xEBC8, + 0x80B7, 0xEBC9, + 0x80BA, 0xB7CE, + 0x80BC, 0xEBC2, + 0x80BD, 0xEBC4, + 0x80BE, 0xC9F6, + 0x80BF, 0xD6D7, + 0x80C0, 0xD5CD, + 0x80C1, 0xD0B2, + 0x80C2, 0xEBCF, + 0x80C3, 0xCEB8, + 0x80C4, 0xEBD0, + 0x80C6, 0xB5A8, + 0x80CC, 0xB1B3, + 0x80CD, 0xEBD2, + 0x80CE, 0xCCA5, + 0x80D6, 0xC5D6, + 0x80D7, 0xEBD3, + 0x80D9, 0xEBD1, + 0x80DA, 0xC5DF, + 0x80DB, 0xEBCE, + 0x80DC, 0xCAA4, + 0x80DD, 0xEBD5, + 0x80DE, 0xB0FB, + 0x80E1, 0xBAFA, + 0x80E4, 0xD8B7, + 0x80E5, 0xF1E3, + 0x80E7, 0xEBCA, + 0x80E8, 0xEBCB, + 0x80E9, 0xEBCC, + 0x80EA, 0xEBCD, + 0x80EB, 0xEBD6, + 0x80EC, 0xE6C0, + 0x80ED, 0xEBD9, + 0x80EF, 0xBFE8, + 0x80F0, 0xD2C8, + 0x80F1, 0xEBD7, + 0x80F2, 0xEBDC, + 0x80F3, 0xB8EC, + 0x80F4, 0xEBD8, + 0x80F6, 0xBDBA, + 0x80F8, 0xD0D8, + 0x80FA, 0xB0B7, + 0x80FC, 0xEBDD, + 0x80FD, 0xC4DC, + 0x8102, 0xD6AC, + 0x8106, 0xB4E0, + 0x8109, 0xC2F6, + 0x810A, 0xBCB9, + 0x810D, 0xEBDA, + 0x810E, 0xEBDB, + 0x810F, 0xD4E0, + 0x8110, 0xC6EA, + 0x8111, 0xC4D4, + 0x8112, 0xEBDF, + 0x8113, 0xC5A7, + 0x8114, 0xD9F5, + 0x8116, 0xB2B1, + 0x8118, 0xEBE4, + 0x811A, 0xBDC5, + 0x811E, 0xEBE2, + 0x812C, 0xEBE3, + 0x812F, 0xB8AC, + 0x8131, 0xCDD1, + 0x8132, 0xEBE5, + 0x8136, 0xEBE1, + 0x8138, 0xC1B3, + 0x813E, 0xC6A2, + 0x8146, 0xCCF3, + 0x8148, 0xEBE6, + 0x814A, 0xC0B0, + 0x814B, 0xD2B8, + 0x814C, 0xEBE7, + 0x8150, 0xB8AF, + 0x8151, 0xB8AD, + 0x8153, 0xEBE8, + 0x8154, 0xC7BB, + 0x8155, 0xCDF3, + 0x8159, 0xEBEA, + 0x815A, 0xEBEB, + 0x8160, 0xEBED, + 0x8165, 0xD0C8, + 0x8167, 0xEBF2, + 0x8169, 0xEBEE, + 0x816D, 0xEBF1, + 0x816E, 0xC8F9, + 0x8170, 0xD1FC, + 0x8171, 0xEBEC, + 0x8174, 0xEBE9, + 0x8179, 0xB8B9, + 0x817A, 0xCFD9, + 0x817B, 0xC4E5, + 0x817C, 0xEBEF, + 0x817D, 0xEBF0, + 0x817E, 0xCCDA, + 0x817F, 0xCDC8, + 0x8180, 0xB0F2, + 0x8182, 0xEBF6, + 0x8188, 0xEBF5, + 0x818A, 0xB2B2, + 0x818F, 0xB8E0, + 0x8191, 0xEBF7, + 0x8198, 0xB1EC, + 0x819B, 0xCCC5, + 0x819C, 0xC4A4, + 0x819D, 0xCFA5, + 0x81A3, 0xEBF9, + 0x81A6, 0xECA2, + 0x81A8, 0xC5F2, + 0x81AA, 0xEBFA, + 0x81B3, 0xC9C5, + 0x81BA, 0xE2DF, + 0x81BB, 0xEBFE, + 0x81C0, 0xCDCE, + 0x81C1, 0xECA1, + 0x81C2, 0xB1DB, + 0x81C3, 0xD3B7, + 0x81C6, 0xD2DC, + 0x81CA, 0xEBFD, + 0x81CC, 0xEBFB, + 0x81E3, 0xB3BC, + 0x81E7, 0xEAB0, + 0x81EA, 0xD7D4, + 0x81EC, 0xF4AB, + 0x81ED, 0xB3F4, + 0x81F3, 0xD6C1, + 0x81F4, 0xD6C2, + 0x81FB, 0xD5E9, + 0x81FC, 0xBECA, + 0x81FE, 0xF4A7, + 0x8200, 0xD2A8, + 0x8201, 0xF4A8, + 0x8202, 0xF4A9, + 0x8204, 0xF4AA, + 0x8205, 0xBECB, + 0x8206, 0xD3DF, + 0x820C, 0xC9E0, + 0x820D, 0xC9E1, + 0x8210, 0xF3C2, + 0x8212, 0xCAE6, + 0x8214, 0xCCF2, + 0x821B, 0xE2B6, + 0x821C, 0xCBB4, + 0x821E, 0xCEE8, + 0x821F, 0xD6DB, + 0x8221, 0xF4AD, + 0x8222, 0xF4AE, + 0x8223, 0xF4AF, + 0x8228, 0xF4B2, + 0x822A, 0xBABD, + 0x822B, 0xF4B3, + 0x822C, 0xB0E3, + 0x822D, 0xF4B0, + 0x822F, 0xF4B1, + 0x8230, 0xBDA2, + 0x8231, 0xB2D5, + 0x8233, 0xF4B6, + 0x8234, 0xF4B7, + 0x8235, 0xB6E6, + 0x8236, 0xB2B0, + 0x8237, 0xCFCF, + 0x8238, 0xF4B4, + 0x8239, 0xB4AC, + 0x823B, 0xF4B5, + 0x823E, 0xF4B8, + 0x8244, 0xF4B9, + 0x8247, 0xCDA7, + 0x8249, 0xF4BA, + 0x824B, 0xF4BB, + 0x824F, 0xF4BC, + 0x8258, 0xCBD2, + 0x825A, 0xF4BD, + 0x825F, 0xF4BE, + 0x8268, 0xF4BF, + 0x826E, 0xF4DE, + 0x826F, 0xC1BC, + 0x8270, 0xBCE8, + 0x8272, 0xC9AB, + 0x8273, 0xD1DE, + 0x8274, 0xE5F5, + 0x8279, 0xDCB3, + 0x827A, 0xD2D5, + 0x827D, 0xDCB4, + 0x827E, 0xB0AC, + 0x827F, 0xDCB5, + 0x8282, 0xBDDA, + 0x8284, 0xDCB9, + 0x8288, 0xD8C2, + 0x828A, 0xDCB7, + 0x828B, 0xD3F3, + 0x828D, 0xC9D6, + 0x828E, 0xDCBA, + 0x828F, 0xDCB6, + 0x8291, 0xDCBB, + 0x8292, 0xC3A2, + 0x8297, 0xDCBC, + 0x8298, 0xDCC5, + 0x8299, 0xDCBD, + 0x829C, 0xCEDF, + 0x829D, 0xD6A5, + 0x829F, 0xDCCF, + 0x82A1, 0xDCCD, + 0x82A4, 0xDCD2, + 0x82A5, 0xBDE6, + 0x82A6, 0xC2AB, + 0x82A8, 0xDCB8, + 0x82A9, 0xDCCB, + 0x82AA, 0xDCCE, + 0x82AB, 0xDCBE, + 0x82AC, 0xB7D2, + 0x82AD, 0xB0C5, + 0x82AE, 0xDCC7, + 0x82AF, 0xD0BE, + 0x82B0, 0xDCC1, + 0x82B1, 0xBBA8, + 0x82B3, 0xB7BC, + 0x82B4, 0xDCCC, + 0x82B7, 0xDCC6, + 0x82B8, 0xDCBF, + 0x82B9, 0xC7DB, + 0x82BD, 0xD1BF, + 0x82BE, 0xDCC0, + 0x82C1, 0xDCCA, + 0x82C4, 0xDCD0, + 0x82C7, 0xCEAD, + 0x82C8, 0xDCC2, + 0x82CA, 0xDCC3, + 0x82CB, 0xDCC8, + 0x82CC, 0xDCC9, + 0x82CD, 0xB2D4, + 0x82CE, 0xDCD1, + 0x82CF, 0xCBD5, + 0x82D1, 0xD4B7, + 0x82D2, 0xDCDB, + 0x82D3, 0xDCDF, + 0x82D4, 0xCCA6, + 0x82D5, 0xDCE6, + 0x82D7, 0xC3E7, + 0x82D8, 0xDCDC, + 0x82DB, 0xBFC1, + 0x82DC, 0xDCD9, + 0x82DE, 0xB0FA, + 0x82DF, 0xB9B6, + 0x82E0, 0xDCE5, + 0x82E1, 0xDCD3, + 0x82E3, 0xDCC4, + 0x82E4, 0xDCD6, + 0x82E5, 0xC8F4, + 0x82E6, 0xBFE0, + 0x82EB, 0xC9BB, + 0x82EF, 0xB1BD, + 0x82F1, 0xD3A2, + 0x82F4, 0xDCDA, + 0x82F7, 0xDCD5, + 0x82F9, 0xC6BB, + 0x82FB, 0xDCDE, + 0x8301, 0xD7C2, + 0x8302, 0xC3AF, + 0x8303, 0xB7B6, + 0x8304, 0xC7D1, + 0x8305, 0xC3A9, + 0x8306, 0xDCE2, + 0x8307, 0xDCD8, + 0x8308, 0xDCEB, + 0x8309, 0xDCD4, + 0x830C, 0xDCDD, + 0x830E, 0xBEA5, + 0x830F, 0xDCD7, + 0x8311, 0xDCE0, + 0x8314, 0xDCE3, + 0x8315, 0xDCE4, + 0x8317, 0xDCF8, + 0x831A, 0xDCE1, + 0x831B, 0xDDA2, + 0x831C, 0xDCE7, + 0x8327, 0xBCEB, + 0x8328, 0xB4C4, + 0x832B, 0xC3A3, + 0x832C, 0xB2E7, + 0x832D, 0xDCFA, + 0x832F, 0xDCF2, + 0x8331, 0xDCEF, + 0x8333, 0xDCFC, + 0x8334, 0xDCEE, + 0x8335, 0xD2F0, + 0x8336, 0xB2E8, + 0x8338, 0xC8D7, + 0x8339, 0xC8E3, + 0x833A, 0xDCFB, + 0x833C, 0xDCED, + 0x8340, 0xDCF7, + 0x8343, 0xDCF5, + 0x8346, 0xBEA3, + 0x8347, 0xDCF4, + 0x8349, 0xB2DD, + 0x834F, 0xDCF3, + 0x8350, 0xBCF6, + 0x8351, 0xDCE8, + 0x8352, 0xBBC4, + 0x8354, 0xC0F3, + 0x835A, 0xBCD4, + 0x835B, 0xDCE9, + 0x835C, 0xDCEA, + 0x835E, 0xDCF1, + 0x835F, 0xDCF6, + 0x8360, 0xDCF9, + 0x8361, 0xB5B4, + 0x8363, 0xC8D9, + 0x8364, 0xBBE7, + 0x8365, 0xDCFE, + 0x8366, 0xDCFD, + 0x8367, 0xD3AB, + 0x8368, 0xDDA1, + 0x8369, 0xDDA3, + 0x836A, 0xDDA5, + 0x836B, 0xD2F1, + 0x836C, 0xDDA4, + 0x836D, 0xDDA6, + 0x836E, 0xDDA7, + 0x836F, 0xD2A9, + 0x8377, 0xBAC9, + 0x8378, 0xDDA9, + 0x837B, 0xDDB6, + 0x837C, 0xDDB1, + 0x837D, 0xDDB4, + 0x8385, 0xDDB0, + 0x8386, 0xC6CE, + 0x8389, 0xC0F2, + 0x838E, 0xC9AF, + 0x8392, 0xDCEC, + 0x8393, 0xDDAE, + 0x8398, 0xDDB7, + 0x839B, 0xDCF0, + 0x839C, 0xDDAF, + 0x839E, 0xDDB8, + 0x83A0, 0xDDAC, + 0x83A8, 0xDDB9, + 0x83A9, 0xDDB3, + 0x83AA, 0xDDAD, + 0x83AB, 0xC4AA, + 0x83B0, 0xDDA8, + 0x83B1, 0xC0B3, + 0x83B2, 0xC1AB, + 0x83B3, 0xDDAA, + 0x83B4, 0xDDAB, + 0x83B6, 0xDDB2, + 0x83B7, 0xBBF1, + 0x83B8, 0xDDB5, + 0x83B9, 0xD3A8, + 0x83BA, 0xDDBA, + 0x83BC, 0xDDBB, + 0x83BD, 0xC3A7, + 0x83C0, 0xDDD2, + 0x83C1, 0xDDBC, + 0x83C5, 0xDDD1, + 0x83C7, 0xB9BD, + 0x83CA, 0xBED5, + 0x83CC, 0xBEFA, + 0x83CF, 0xBACA, + 0x83D4, 0xDDCA, + 0x83D6, 0xDDC5, + 0x83D8, 0xDDBF, + 0x83DC, 0xB2CB, + 0x83DD, 0xDDC3, + 0x83DF, 0xDDCB, + 0x83E0, 0xB2A4, + 0x83E1, 0xDDD5, + 0x83E5, 0xDDBE, + 0x83E9, 0xC6D0, + 0x83EA, 0xDDD0, + 0x83F0, 0xDDD4, + 0x83F1, 0xC1E2, + 0x83F2, 0xB7C6, + 0x83F8, 0xDDCE, + 0x83F9, 0xDDCF, + 0x83FD, 0xDDC4, + 0x8401, 0xDDBD, + 0x8403, 0xDDCD, + 0x8404, 0xCCD1, + 0x8406, 0xDDC9, + 0x840B, 0xDDC2, + 0x840C, 0xC3C8, + 0x840D, 0xC6BC, + 0x840E, 0xCEAE, + 0x840F, 0xDDCC, + 0x8411, 0xDDC8, + 0x8418, 0xDDC1, + 0x841C, 0xDDC6, + 0x841D, 0xC2DC, + 0x8424, 0xD3A9, + 0x8425, 0xD3AA, + 0x8426, 0xDDD3, + 0x8427, 0xCFF4, + 0x8428, 0xC8F8, + 0x8431, 0xDDE6, + 0x8438, 0xDDC7, + 0x843C, 0xDDE0, + 0x843D, 0xC2E4, + 0x8446, 0xDDE1, + 0x8451, 0xDDD7, + 0x8457, 0xD6F8, + 0x8459, 0xDDD9, + 0x845A, 0xDDD8, + 0x845B, 0xB8F0, + 0x845C, 0xDDD6, + 0x8461, 0xC6CF, + 0x8463, 0xB6AD, + 0x8469, 0xDDE2, + 0x846B, 0xBAF9, + 0x846C, 0xD4E1, + 0x846D, 0xDDE7, + 0x8471, 0xB4D0, + 0x8473, 0xDDDA, + 0x8475, 0xBFFB, + 0x8476, 0xDDE3, + 0x8478, 0xDDDF, + 0x847A, 0xDDDD, + 0x8482, 0xB5D9, + 0x8487, 0xDDDB, + 0x8488, 0xDDDC, + 0x8489, 0xDDDE, + 0x848B, 0xBDAF, + 0x848C, 0xDDE4, + 0x848E, 0xDDE5, + 0x8497, 0xDDF5, + 0x8499, 0xC3C9, + 0x849C, 0xCBE2, + 0x84A1, 0xDDF2, + 0x84AF, 0xD8E1, + 0x84B2, 0xC6D1, + 0x84B4, 0xDDF4, + 0x84B8, 0xD5F4, + 0x84B9, 0xDDF3, + 0x84BA, 0xDDF0, + 0x84BD, 0xDDEC, + 0x84BF, 0xDDEF, + 0x84C1, 0xDDE8, + 0x84C4, 0xD0EE, + 0x84C9, 0xC8D8, + 0x84CA, 0xDDEE, + 0x84CD, 0xDDE9, + 0x84D0, 0xDDEA, + 0x84D1, 0xCBF2, + 0x84D3, 0xDDED, + 0x84D6, 0xB1CD, + 0x84DD, 0xC0B6, + 0x84DF, 0xBCBB, + 0x84E0, 0xDDF1, + 0x84E3, 0xDDF7, + 0x84E5, 0xDDF6, + 0x84E6, 0xDDEB, + 0x84EC, 0xC5EE, + 0x84F0, 0xDDFB, + 0x84FC, 0xDEA4, + 0x84FF, 0xDEA3, + 0x850C, 0xDDF8, + 0x8511, 0xC3EF, + 0x8513, 0xC2FB, + 0x8517, 0xD5E1, + 0x851A, 0xCEB5, + 0x851F, 0xDDFD, + 0x8521, 0xB2CC, + 0x852B, 0xC4E8, + 0x852C, 0xCADF, + 0x8537, 0xC7BE, + 0x8538, 0xDDFA, + 0x8539, 0xDDFC, + 0x853A, 0xDDFE, + 0x853B, 0xDEA2, + 0x853C, 0xB0AA, + 0x853D, 0xB1CE, + 0x8543, 0xDEAC, + 0x8548, 0xDEA6, + 0x8549, 0xBDB6, + 0x854A, 0xC8EF, + 0x8556, 0xDEA1, + 0x8559, 0xDEA5, + 0x855E, 0xDEA9, + 0x8564, 0xDEA8, + 0x8568, 0xDEA7, + 0x8572, 0xDEAD, + 0x8574, 0xD4CC, + 0x8579, 0xDEB3, + 0x857A, 0xDEAA, + 0x857B, 0xDEAE, + 0x857E, 0xC0D9, + 0x8584, 0xB1A1, + 0x8585, 0xDEB6, + 0x8587, 0xDEB1, + 0x858F, 0xDEB2, + 0x859B, 0xD1A6, + 0x859C, 0xDEB5, + 0x85A4, 0xDEAF, + 0x85A8, 0xDEB0, + 0x85AA, 0xD0BD, + 0x85AE, 0xDEB4, + 0x85AF, 0xCAED, + 0x85B0, 0xDEB9, + 0x85B7, 0xDEB8, + 0x85B9, 0xDEB7, + 0x85C1, 0xDEBB, + 0x85C9, 0xBDE5, + 0x85CF, 0xB2D8, + 0x85D0, 0xC3EA, + 0x85D3, 0xDEBA, + 0x85D5, 0xC5BA, + 0x85DC, 0xDEBC, + 0x85E4, 0xCCD9, + 0x85E9, 0xB7AA, + 0x85FB, 0xD4E5, + 0x85FF, 0xDEBD, + 0x8605, 0xDEBF, + 0x8611, 0xC4A2, + 0x8616, 0xDEC1, + 0x8627, 0xDEBE, + 0x8629, 0xDEC0, + 0x8638, 0xD5BA, + 0x863C, 0xDEC2, + 0x864D, 0xF2AE, + 0x864E, 0xBBA2, + 0x864F, 0xC2B2, + 0x8650, 0xC5B0, + 0x8651, 0xC2C7, + 0x8654, 0xF2AF, + 0x865A, 0xD0E9, + 0x865E, 0xD3DD, + 0x8662, 0xEBBD, + 0x866B, 0xB3E6, + 0x866C, 0xF2B0, + 0x866E, 0xF2B1, + 0x8671, 0xCAAD, + 0x8679, 0xBAE7, + 0x867A, 0xF2B3, + 0x867B, 0xF2B5, + 0x867C, 0xF2B4, + 0x867D, 0xCBE4, + 0x867E, 0xCFBA, + 0x867F, 0xF2B2, + 0x8680, 0xCAB4, + 0x8681, 0xD2CF, + 0x8682, 0xC2EC, + 0x868A, 0xCEC3, + 0x868B, 0xF2B8, + 0x868C, 0xB0F6, + 0x868D, 0xF2B7, + 0x8693, 0xF2BE, + 0x8695, 0xB2CF, + 0x869C, 0xD1C1, + 0x869D, 0xF2BA, + 0x86A3, 0xF2BC, + 0x86A4, 0xD4E9, + 0x86A7, 0xF2BB, + 0x86A8, 0xF2B6, + 0x86A9, 0xF2BF, + 0x86AA, 0xF2BD, + 0x86AC, 0xF2B9, + 0x86AF, 0xF2C7, + 0x86B0, 0xF2C4, + 0x86B1, 0xF2C6, + 0x86B4, 0xF2CA, + 0x86B5, 0xF2C2, + 0x86B6, 0xF2C0, + 0x86BA, 0xF2C5, + 0x86C0, 0xD6FB, + 0x86C4, 0xF2C1, + 0x86C6, 0xC7F9, + 0x86C7, 0xC9DF, + 0x86C9, 0xF2C8, + 0x86CA, 0xB9C6, + 0x86CB, 0xB5B0, + 0x86CE, 0xF2C3, + 0x86CF, 0xF2C9, + 0x86D0, 0xF2D0, + 0x86D1, 0xF2D6, + 0x86D4, 0xBBD7, + 0x86D8, 0xF2D5, + 0x86D9, 0xCDDC, + 0x86DB, 0xD6EB, + 0x86DE, 0xF2D2, + 0x86DF, 0xF2D4, + 0x86E4, 0xB8F2, + 0x86E9, 0xF2CB, + 0x86ED, 0xF2CE, + 0x86EE, 0xC2F9, + 0x86F0, 0xD5DD, + 0x86F1, 0xF2CC, + 0x86F2, 0xF2CD, + 0x86F3, 0xF2CF, + 0x86F4, 0xF2D3, + 0x86F8, 0xF2D9, + 0x86F9, 0xD3BC, + 0x86FE, 0xB6EA, + 0x8700, 0xCAF1, + 0x8702, 0xB7E4, + 0x8703, 0xF2D7, + 0x8707, 0xF2D8, + 0x8708, 0xF2DA, + 0x8709, 0xF2DD, + 0x870A, 0xF2DB, + 0x870D, 0xF2DC, + 0x8712, 0xD1D1, + 0x8713, 0xF2D1, + 0x8715, 0xCDC9, + 0x8717, 0xCECF, + 0x8718, 0xD6A9, + 0x871A, 0xF2E3, + 0x871C, 0xC3DB, + 0x871E, 0xF2E0, + 0x8721, 0xC0AF, + 0x8722, 0xF2EC, + 0x8723, 0xF2DE, + 0x8725, 0xF2E1, + 0x8729, 0xF2E8, + 0x872E, 0xF2E2, + 0x8731, 0xF2E7, + 0x8734, 0xF2E6, + 0x8737, 0xF2E9, + 0x873B, 0xF2DF, + 0x873E, 0xF2E4, + 0x873F, 0xF2EA, + 0x8747, 0xD3AC, + 0x8748, 0xF2E5, + 0x8749, 0xB2F5, + 0x874C, 0xF2F2, + 0x874E, 0xD0AB, + 0x8753, 0xF2F5, + 0x8757, 0xBBC8, + 0x8759, 0xF2F9, + 0x8760, 0xF2F0, + 0x8763, 0xF2F6, + 0x8764, 0xF2F8, + 0x8765, 0xF2FA, + 0x876E, 0xF2F3, + 0x8770, 0xF2F1, + 0x8774, 0xBAFB, + 0x8776, 0xB5FB, + 0x877B, 0xF2EF, + 0x877C, 0xF2F7, + 0x877D, 0xF2ED, + 0x877E, 0xF2EE, + 0x8782, 0xF2EB, + 0x8783, 0xF3A6, + 0x8785, 0xF3A3, + 0x8788, 0xF3A2, + 0x878B, 0xF2F4, + 0x878D, 0xC8DA, + 0x8793, 0xF2FB, + 0x8797, 0xF3A5, + 0x879F, 0xC3F8, + 0x87A8, 0xF2FD, + 0x87AB, 0xF3A7, + 0x87AC, 0xF3A9, + 0x87AD, 0xF3A4, + 0x87AF, 0xF2FC, + 0x87B3, 0xF3AB, + 0x87B5, 0xF3AA, + 0x87BA, 0xC2DD, + 0x87BD, 0xF3AE, + 0x87C0, 0xF3B0, + 0x87C6, 0xF3A1, + 0x87CA, 0xF3B1, + 0x87CB, 0xF3AC, + 0x87D1, 0xF3AF, + 0x87D2, 0xF2FE, + 0x87D3, 0xF3AD, + 0x87DB, 0xF3B2, + 0x87E0, 0xF3B4, + 0x87E5, 0xF3A8, + 0x87EA, 0xF3B3, + 0x87EE, 0xF3B5, + 0x87F9, 0xD0B7, + 0x87FE, 0xF3B8, + 0x8803, 0xD9F9, + 0x880A, 0xF3B9, + 0x8813, 0xF3B7, + 0x8815, 0xC8E4, + 0x8816, 0xF3B6, + 0x881B, 0xF3BA, + 0x8821, 0xF3BB, + 0x8822, 0xB4C0, + 0x8832, 0xEEC3, + 0x8839, 0xF3BC, + 0x883C, 0xF3BD, + 0x8840, 0xD1AA, + 0x8844, 0xF4AC, + 0x8845, 0xD0C6, + 0x884C, 0xD0D0, + 0x884D, 0xD1DC, + 0x8854, 0xCFCE, + 0x8857, 0xBDD6, + 0x8859, 0xD1C3, + 0x8861, 0xBAE2, + 0x8862, 0xE1E9, + 0x8863, 0xD2C2, + 0x8864, 0xF1C2, + 0x8865, 0xB2B9, + 0x8868, 0xB1ED, + 0x8869, 0xF1C3, + 0x886B, 0xC9C0, + 0x886C, 0xB3C4, + 0x886E, 0xD9F2, + 0x8870, 0xCBA5, + 0x8872, 0xF1C4, + 0x8877, 0xD6D4, + 0x887D, 0xF1C5, + 0x887E, 0xF4C0, + 0x887F, 0xF1C6, + 0x8881, 0xD4AC, + 0x8882, 0xF1C7, + 0x8884, 0xB0C0, + 0x8885, 0xF4C1, + 0x8888, 0xF4C2, + 0x888B, 0xB4FC, + 0x888D, 0xC5DB, + 0x8892, 0xCCBB, + 0x8896, 0xD0E4, + 0x889C, 0xCDE0, + 0x88A2, 0xF1C8, + 0x88A4, 0xD9F3, + 0x88AB, 0xB1BB, + 0x88AD, 0xCFAE, + 0x88B1, 0xB8A4, + 0x88B7, 0xF1CA, + 0x88BC, 0xF1CB, + 0x88C1, 0xB2C3, + 0x88C2, 0xC1D1, + 0x88C5, 0xD7B0, + 0x88C6, 0xF1C9, + 0x88C9, 0xF1CC, + 0x88CE, 0xF1CE, + 0x88D2, 0xD9F6, + 0x88D4, 0xD2E1, + 0x88D5, 0xD4A3, + 0x88D8, 0xF4C3, + 0x88D9, 0xC8B9, + 0x88DF, 0xF4C4, + 0x88E2, 0xF1CD, + 0x88E3, 0xF1CF, + 0x88E4, 0xBFE3, + 0x88E5, 0xF1D0, + 0x88E8, 0xF1D4, + 0x88F0, 0xF1D6, + 0x88F1, 0xF1D1, + 0x88F3, 0xC9D1, + 0x88F4, 0xC5E1, + 0x88F8, 0xC2E3, + 0x88F9, 0xB9FC, + 0x88FC, 0xF1D3, + 0x88FE, 0xF1D5, + 0x8902, 0xB9D3, + 0x890A, 0xF1DB, + 0x8910, 0xBAD6, + 0x8912, 0xB0FD, + 0x8913, 0xF1D9, + 0x8919, 0xF1D8, + 0x891A, 0xF1D2, + 0x891B, 0xF1DA, + 0x8921, 0xF1D7, + 0x8925, 0xC8EC, + 0x892A, 0xCDCA, + 0x892B, 0xF1DD, + 0x8930, 0xE5BD, + 0x8934, 0xF1DC, + 0x8936, 0xF1DE, + 0x8941, 0xF1DF, + 0x8944, 0xCFE5, + 0x895E, 0xF4C5, + 0x895F, 0xBDF3, + 0x8966, 0xF1E0, + 0x897B, 0xF1E1, + 0x897F, 0xCEF7, + 0x8981, 0xD2AA, + 0x8983, 0xF1FB, + 0x8986, 0xB8B2, + 0x89C1, 0xBCFB, + 0x89C2, 0xB9DB, + 0x89C4, 0xB9E6, + 0x89C5, 0xC3D9, + 0x89C6, 0xCAD3, + 0x89C7, 0xEAE8, + 0x89C8, 0xC0C0, + 0x89C9, 0xBEF5, + 0x89CA, 0xEAE9, + 0x89CB, 0xEAEA, + 0x89CC, 0xEAEB, + 0x89CE, 0xEAEC, + 0x89CF, 0xEAED, + 0x89D0, 0xEAEE, + 0x89D1, 0xEAEF, + 0x89D2, 0xBDC7, + 0x89D6, 0xF5FB, + 0x89DA, 0xF5FD, + 0x89DC, 0xF5FE, + 0x89DE, 0xF5FC, + 0x89E3, 0xBDE2, + 0x89E5, 0xF6A1, + 0x89E6, 0xB4A5, + 0x89EB, 0xF6A2, + 0x89EF, 0xF6A3, + 0x89F3, 0xECB2, + 0x8A00, 0xD1D4, + 0x8A07, 0xD9EA, + 0x8A3E, 0xF6A4, + 0x8A48, 0xEEBA, + 0x8A79, 0xD5B2, + 0x8A89, 0xD3FE, + 0x8A8A, 0xCCDC, + 0x8A93, 0xCAC4, + 0x8B07, 0xE5C0, + 0x8B26, 0xF6A5, + 0x8B66, 0xBEAF, + 0x8B6C, 0xC6A9, + 0x8BA0, 0xDAA5, + 0x8BA1, 0xBCC6, + 0x8BA2, 0xB6A9, + 0x8BA3, 0xB8BC, + 0x8BA4, 0xC8CF, + 0x8BA5, 0xBCA5, + 0x8BA6, 0xDAA6, + 0x8BA7, 0xDAA7, + 0x8BA8, 0xCCD6, + 0x8BA9, 0xC8C3, + 0x8BAA, 0xDAA8, + 0x8BAB, 0xC6FD, + 0x8BAD, 0xD1B5, + 0x8BAE, 0xD2E9, + 0x8BAF, 0xD1B6, + 0x8BB0, 0xBCC7, + 0x8BB2, 0xBDB2, + 0x8BB3, 0xBBE4, + 0x8BB4, 0xDAA9, + 0x8BB5, 0xDAAA, + 0x8BB6, 0xD1C8, + 0x8BB7, 0xDAAB, + 0x8BB8, 0xD0ED, + 0x8BB9, 0xB6EF, + 0x8BBA, 0xC2DB, + 0x8BBC, 0xCBCF, + 0x8BBD, 0xB7ED, + 0x8BBE, 0xC9E8, + 0x8BBF, 0xB7C3, + 0x8BC0, 0xBEF7, + 0x8BC1, 0xD6A4, + 0x8BC2, 0xDAAC, + 0x8BC3, 0xDAAD, + 0x8BC4, 0xC6C0, + 0x8BC5, 0xD7E7, + 0x8BC6, 0xCAB6, + 0x8BC8, 0xD5A9, + 0x8BC9, 0xCBDF, + 0x8BCA, 0xD5EF, + 0x8BCB, 0xDAAE, + 0x8BCC, 0xD6DF, + 0x8BCD, 0xB4CA, + 0x8BCE, 0xDAB0, + 0x8BCF, 0xDAAF, + 0x8BD1, 0xD2EB, + 0x8BD2, 0xDAB1, + 0x8BD3, 0xDAB2, + 0x8BD4, 0xDAB3, + 0x8BD5, 0xCAD4, + 0x8BD6, 0xDAB4, + 0x8BD7, 0xCAAB, + 0x8BD8, 0xDAB5, + 0x8BD9, 0xDAB6, + 0x8BDA, 0xB3CF, + 0x8BDB, 0xD6EF, + 0x8BDC, 0xDAB7, + 0x8BDD, 0xBBB0, + 0x8BDE, 0xB5AE, + 0x8BDF, 0xDAB8, + 0x8BE0, 0xDAB9, + 0x8BE1, 0xB9EE, + 0x8BE2, 0xD1AF, + 0x8BE3, 0xD2E8, + 0x8BE4, 0xDABA, + 0x8BE5, 0xB8C3, + 0x8BE6, 0xCFEA, + 0x8BE7, 0xB2EF, + 0x8BE8, 0xDABB, + 0x8BE9, 0xDABC, + 0x8BEB, 0xBDEB, + 0x8BEC, 0xCEDC, + 0x8BED, 0xD3EF, + 0x8BEE, 0xDABD, + 0x8BEF, 0xCEF3, + 0x8BF0, 0xDABE, + 0x8BF1, 0xD3D5, + 0x8BF2, 0xBBE5, + 0x8BF3, 0xDABF, + 0x8BF4, 0xCBB5, + 0x8BF5, 0xCBD0, + 0x8BF6, 0xDAC0, + 0x8BF7, 0xC7EB, + 0x8BF8, 0xD6EE, + 0x8BF9, 0xDAC1, + 0x8BFA, 0xC5B5, + 0x8BFB, 0xB6C1, + 0x8BFC, 0xDAC2, + 0x8BFD, 0xB7CC, + 0x8BFE, 0xBFCE, + 0x8BFF, 0xDAC3, + 0x8C00, 0xDAC4, + 0x8C01, 0xCBAD, + 0x8C02, 0xDAC5, + 0x8C03, 0xB5F7, + 0x8C04, 0xDAC6, + 0x8C05, 0xC1C2, + 0x8C06, 0xD7BB, + 0x8C07, 0xDAC7, + 0x8C08, 0xCCB8, + 0x8C0A, 0xD2EA, + 0x8C0B, 0xC4B1, + 0x8C0C, 0xDAC8, + 0x8C0D, 0xB5FD, + 0x8C0E, 0xBBD1, + 0x8C0F, 0xDAC9, + 0x8C10, 0xD0B3, + 0x8C11, 0xDACA, + 0x8C12, 0xDACB, + 0x8C13, 0xCEBD, + 0x8C14, 0xDACC, + 0x8C15, 0xDACD, + 0x8C16, 0xDACE, + 0x8C17, 0xB2F7, + 0x8C18, 0xDAD1, + 0x8C19, 0xDACF, + 0x8C1A, 0xD1E8, + 0x8C1B, 0xDAD0, + 0x8C1C, 0xC3D5, + 0x8C1D, 0xDAD2, + 0x8C1F, 0xDAD3, + 0x8C20, 0xDAD4, + 0x8C21, 0xDAD5, + 0x8C22, 0xD0BB, + 0x8C23, 0xD2A5, + 0x8C24, 0xB0F9, + 0x8C25, 0xDAD6, + 0x8C26, 0xC7AB, + 0x8C27, 0xDAD7, + 0x8C28, 0xBDF7, + 0x8C29, 0xC3A1, + 0x8C2A, 0xDAD8, + 0x8C2B, 0xDAD9, + 0x8C2C, 0xC3FD, + 0x8C2D, 0xCCB7, + 0x8C2E, 0xDADA, + 0x8C2F, 0xDADB, + 0x8C30, 0xC0BE, + 0x8C31, 0xC6D7, + 0x8C32, 0xDADC, + 0x8C33, 0xDADD, + 0x8C34, 0xC7B4, + 0x8C35, 0xDADE, + 0x8C36, 0xDADF, + 0x8C37, 0xB9C8, + 0x8C41, 0xBBED, + 0x8C46, 0xB6B9, + 0x8C47, 0xF4F8, + 0x8C49, 0xF4F9, + 0x8C4C, 0xCDE3, + 0x8C55, 0xF5B9, + 0x8C5A, 0xEBE0, + 0x8C61, 0xCFF3, + 0x8C62, 0xBBBF, + 0x8C6A, 0xBAC0, + 0x8C6B, 0xD4A5, + 0x8C73, 0xE1D9, + 0x8C78, 0xF5F4, + 0x8C79, 0xB1AA, + 0x8C7A, 0xB2F2, + 0x8C82, 0xF5F5, + 0x8C85, 0xF5F7, + 0x8C89, 0xBAD1, + 0x8C8A, 0xF5F6, + 0x8C8C, 0xC3B2, + 0x8C94, 0xF5F9, + 0x8C98, 0xF5F8, + 0x8D1D, 0xB1B4, + 0x8D1E, 0xD5EA, + 0x8D1F, 0xB8BA, + 0x8D21, 0xB9B1, + 0x8D22, 0xB2C6, + 0x8D23, 0xD4F0, + 0x8D24, 0xCFCD, + 0x8D25, 0xB0DC, + 0x8D26, 0xD5CB, + 0x8D27, 0xBBF5, + 0x8D28, 0xD6CA, + 0x8D29, 0xB7B7, + 0x8D2A, 0xCCB0, + 0x8D2B, 0xC6B6, + 0x8D2C, 0xB1E1, + 0x8D2D, 0xB9BA, + 0x8D2E, 0xD6FC, + 0x8D2F, 0xB9E1, + 0x8D30, 0xB7A1, + 0x8D31, 0xBCFA, + 0x8D32, 0xEADA, + 0x8D33, 0xEADB, + 0x8D34, 0xCCF9, + 0x8D35, 0xB9F3, + 0x8D36, 0xEADC, + 0x8D37, 0xB4FB, + 0x8D38, 0xC3B3, + 0x8D39, 0xB7D1, + 0x8D3A, 0xBAD8, + 0x8D3B, 0xEADD, + 0x8D3C, 0xD4F4, + 0x8D3D, 0xEADE, + 0x8D3E, 0xBCD6, + 0x8D3F, 0xBBDF, + 0x8D40, 0xEADF, + 0x8D41, 0xC1DE, + 0x8D42, 0xC2B8, + 0x8D43, 0xD4DF, + 0x8D44, 0xD7CA, + 0x8D45, 0xEAE0, + 0x8D46, 0xEAE1, + 0x8D47, 0xEAE4, + 0x8D48, 0xEAE2, + 0x8D49, 0xEAE3, + 0x8D4A, 0xC9DE, + 0x8D4B, 0xB8B3, + 0x8D4C, 0xB6C4, + 0x8D4D, 0xEAE5, + 0x8D4E, 0xCAEA, + 0x8D4F, 0xC9CD, + 0x8D50, 0xB4CD, + 0x8D53, 0xE2D9, + 0x8D54, 0xC5E2, + 0x8D55, 0xEAE6, + 0x8D56, 0xC0B5, + 0x8D58, 0xD7B8, + 0x8D59, 0xEAE7, + 0x8D5A, 0xD7AC, + 0x8D5B, 0xC8FC, + 0x8D5C, 0xD8D3, + 0x8D5D, 0xD8CD, + 0x8D5E, 0xD4DE, + 0x8D60, 0xD4F9, + 0x8D61, 0xC9C4, + 0x8D62, 0xD3AE, + 0x8D63, 0xB8D3, + 0x8D64, 0xB3E0, + 0x8D66, 0xC9E2, + 0x8D67, 0xF4F6, + 0x8D6B, 0xBAD5, + 0x8D6D, 0xF4F7, + 0x8D70, 0xD7DF, + 0x8D73, 0xF4F1, + 0x8D74, 0xB8B0, + 0x8D75, 0xD5D4, + 0x8D76, 0xB8CF, + 0x8D77, 0xC6F0, + 0x8D81, 0xB3C3, + 0x8D84, 0xF4F2, + 0x8D85, 0xB3AC, + 0x8D8A, 0xD4BD, + 0x8D8B, 0xC7F7, + 0x8D91, 0xF4F4, + 0x8D94, 0xF4F3, + 0x8D9F, 0xCCCB, + 0x8DA3, 0xC8A4, + 0x8DB1, 0xF4F5, + 0x8DB3, 0xD7E3, + 0x8DB4, 0xC5BF, + 0x8DB5, 0xF5C0, + 0x8DB8, 0xF5BB, + 0x8DBA, 0xF5C3, + 0x8DBC, 0xF5C2, + 0x8DBE, 0xD6BA, + 0x8DBF, 0xF5C1, + 0x8DC3, 0xD4BE, + 0x8DC4, 0xF5C4, + 0x8DC6, 0xF5CC, + 0x8DCB, 0xB0CF, + 0x8DCC, 0xB5F8, + 0x8DCE, 0xF5C9, + 0x8DCF, 0xF5CA, + 0x8DD1, 0xC5DC, + 0x8DD6, 0xF5C5, + 0x8DD7, 0xF5C6, + 0x8DDA, 0xF5C7, + 0x8DDB, 0xF5CB, + 0x8DDD, 0xBEE0, + 0x8DDE, 0xF5C8, + 0x8DDF, 0xB8FA, + 0x8DE3, 0xF5D0, + 0x8DE4, 0xF5D3, + 0x8DE8, 0xBFE7, + 0x8DEA, 0xB9F2, + 0x8DEB, 0xF5BC, + 0x8DEC, 0xF5CD, + 0x8DEF, 0xC2B7, + 0x8DF3, 0xCCF8, + 0x8DF5, 0xBCF9, + 0x8DF7, 0xF5CE, + 0x8DF8, 0xF5CF, + 0x8DF9, 0xF5D1, + 0x8DFA, 0xB6E5, + 0x8DFB, 0xF5D2, + 0x8DFD, 0xF5D5, + 0x8E05, 0xF5BD, + 0x8E09, 0xF5D4, + 0x8E0A, 0xD3BB, + 0x8E0C, 0xB3EC, + 0x8E0F, 0xCCA4, + 0x8E14, 0xF5D6, + 0x8E1D, 0xF5D7, + 0x8E1E, 0xBEE1, + 0x8E1F, 0xF5D8, + 0x8E22, 0xCCDF, + 0x8E23, 0xF5DB, + 0x8E29, 0xB2C8, + 0x8E2A, 0xD7D9, + 0x8E2C, 0xF5D9, + 0x8E2E, 0xF5DA, + 0x8E2F, 0xF5DC, + 0x8E31, 0xF5E2, + 0x8E35, 0xF5E0, + 0x8E39, 0xF5DF, + 0x8E3A, 0xF5DD, + 0x8E3D, 0xF5E1, + 0x8E40, 0xF5DE, + 0x8E41, 0xF5E4, + 0x8E42, 0xF5E5, + 0x8E44, 0xCCE3, + 0x8E47, 0xE5BF, + 0x8E48, 0xB5B8, + 0x8E49, 0xF5E3, + 0x8E4A, 0xF5E8, + 0x8E4B, 0xCCA3, + 0x8E51, 0xF5E6, + 0x8E52, 0xF5E7, + 0x8E59, 0xF5BE, + 0x8E66, 0xB1C4, + 0x8E69, 0xF5BF, + 0x8E6C, 0xB5C5, + 0x8E6D, 0xB2E4, + 0x8E6F, 0xF5EC, + 0x8E70, 0xF5E9, + 0x8E72, 0xB6D7, + 0x8E74, 0xF5ED, + 0x8E76, 0xF5EA, + 0x8E7C, 0xF5EB, + 0x8E7F, 0xB4DA, + 0x8E81, 0xD4EA, + 0x8E85, 0xF5EE, + 0x8E87, 0xB3F9, + 0x8E8F, 0xF5EF, + 0x8E90, 0xF5F1, + 0x8E94, 0xF5F0, + 0x8E9C, 0xF5F2, + 0x8E9E, 0xF5F3, + 0x8EAB, 0xC9ED, + 0x8EAC, 0xB9AA, + 0x8EAF, 0xC7FB, + 0x8EB2, 0xB6E3, + 0x8EBA, 0xCCC9, + 0x8ECE, 0xEAA6, + 0x8F66, 0xB3B5, + 0x8F67, 0xD4FE, + 0x8F68, 0xB9EC, + 0x8F69, 0xD0F9, + 0x8F6B, 0xE9ED, + 0x8F6C, 0xD7AA, + 0x8F6D, 0xE9EE, + 0x8F6E, 0xC2D6, + 0x8F6F, 0xC8ED, + 0x8F70, 0xBAE4, + 0x8F71, 0xE9EF, + 0x8F72, 0xE9F0, + 0x8F73, 0xE9F1, + 0x8F74, 0xD6E1, + 0x8F75, 0xE9F2, + 0x8F76, 0xE9F3, + 0x8F77, 0xE9F5, + 0x8F78, 0xE9F4, + 0x8F79, 0xE9F6, + 0x8F7A, 0xE9F7, + 0x8F7B, 0xC7E1, + 0x8F7C, 0xE9F8, + 0x8F7D, 0xD4D8, + 0x8F7E, 0xE9F9, + 0x8F7F, 0xBDCE, + 0x8F81, 0xE9FA, + 0x8F82, 0xE9FB, + 0x8F83, 0xBDCF, + 0x8F84, 0xE9FC, + 0x8F85, 0xB8A8, + 0x8F86, 0xC1BE, + 0x8F87, 0xE9FD, + 0x8F88, 0xB1B2, + 0x8F89, 0xBBD4, + 0x8F8A, 0xB9F5, + 0x8F8B, 0xE9FE, + 0x8F8D, 0xEAA1, + 0x8F8E, 0xEAA2, + 0x8F8F, 0xEAA3, + 0x8F90, 0xB7F8, + 0x8F91, 0xBCAD, + 0x8F93, 0xCAE4, + 0x8F94, 0xE0CE, + 0x8F95, 0xD4AF, + 0x8F96, 0xCFBD, + 0x8F97, 0xD5B7, + 0x8F98, 0xEAA4, + 0x8F99, 0xD5DE, + 0x8F9A, 0xEAA5, + 0x8F9B, 0xD0C1, + 0x8F9C, 0xB9BC, + 0x8F9E, 0xB4C7, + 0x8F9F, 0xB1D9, + 0x8FA3, 0xC0B1, + 0x8FA8, 0xB1E6, + 0x8FA9, 0xB1E7, + 0x8FAB, 0xB1E8, + 0x8FB0, 0xB3BD, + 0x8FB1, 0xC8E8, + 0x8FB6, 0xE5C1, + 0x8FB9, 0xB1DF, + 0x8FBD, 0xC1C9, + 0x8FBE, 0xB4EF, + 0x8FC1, 0xC7A8, + 0x8FC2, 0xD3D8, + 0x8FC4, 0xC6F9, + 0x8FC5, 0xD1B8, + 0x8FC7, 0xB9FD, + 0x8FC8, 0xC2F5, + 0x8FCE, 0xD3AD, + 0x8FD0, 0xD4CB, + 0x8FD1, 0xBDFC, + 0x8FD3, 0xE5C2, + 0x8FD4, 0xB7B5, + 0x8FD5, 0xE5C3, + 0x8FD8, 0xBBB9, + 0x8FD9, 0xD5E2, + 0x8FDB, 0xBDF8, + 0x8FDC, 0xD4B6, + 0x8FDD, 0xCEA5, + 0x8FDE, 0xC1AC, + 0x8FDF, 0xB3D9, + 0x8FE2, 0xCCF6, + 0x8FE4, 0xE5C6, + 0x8FE5, 0xE5C4, + 0x8FE6, 0xE5C8, + 0x8FE8, 0xE5CA, + 0x8FE9, 0xE5C7, + 0x8FEA, 0xB5CF, + 0x8FEB, 0xC6C8, + 0x8FED, 0xB5FC, + 0x8FEE, 0xE5C5, + 0x8FF0, 0xCAF6, + 0x8FF3, 0xE5C9, + 0x8FF7, 0xC3D4, + 0x8FF8, 0xB1C5, + 0x8FF9, 0xBCA3, + 0x8FFD, 0xD7B7, + 0x9000, 0xCDCB, + 0x9001, 0xCBCD, + 0x9002, 0xCACA, + 0x9003, 0xCCD3, + 0x9004, 0xE5CC, + 0x9005, 0xE5CB, + 0x9006, 0xC4E6, + 0x9009, 0xD1A1, + 0x900A, 0xD1B7, + 0x900B, 0xE5CD, + 0x900D, 0xE5D0, + 0x900F, 0xCDB8, + 0x9010, 0xD6F0, + 0x9011, 0xE5CF, + 0x9012, 0xB5DD, + 0x9014, 0xCDBE, + 0x9016, 0xE5D1, + 0x9017, 0xB6BA, + 0x901A, 0xCDA8, + 0x901B, 0xB9E4, + 0x901D, 0xCAC5, + 0x901E, 0xB3D1, + 0x901F, 0xCBD9, + 0x9020, 0xD4EC, + 0x9021, 0xE5D2, + 0x9022, 0xB7EA, + 0x9026, 0xE5CE, + 0x902D, 0xE5D5, + 0x902E, 0xB4FE, + 0x902F, 0xE5D6, + 0x9035, 0xE5D3, + 0x9036, 0xE5D4, + 0x9038, 0xD2DD, + 0x903B, 0xC2DF, + 0x903C, 0xB1C6, + 0x903E, 0xD3E2, + 0x9041, 0xB6DD, + 0x9042, 0xCBEC, + 0x9044, 0xE5D7, + 0x9047, 0xD3F6, + 0x904D, 0xB1E9, + 0x904F, 0xB6F4, + 0x9050, 0xE5DA, + 0x9051, 0xE5D8, + 0x9052, 0xE5D9, + 0x9053, 0xB5C0, + 0x9057, 0xD2C5, + 0x9058, 0xE5DC, + 0x905B, 0xE5DE, + 0x9062, 0xE5DD, + 0x9063, 0xC7B2, + 0x9065, 0xD2A3, + 0x9068, 0xE5DB, + 0x906D, 0xD4E2, + 0x906E, 0xD5DA, + 0x9074, 0xE5E0, + 0x9075, 0xD7F1, + 0x907D, 0xE5E1, + 0x907F, 0xB1DC, + 0x9080, 0xD1FB, + 0x9082, 0xE5E2, + 0x9083, 0xE5E4, + 0x9088, 0xE5E3, + 0x908B, 0xE5E5, + 0x9091, 0xD2D8, + 0x9093, 0xB5CB, + 0x9095, 0xE7DF, + 0x9097, 0xDAF5, + 0x9099, 0xDAF8, + 0x909B, 0xDAF6, + 0x909D, 0xDAF7, + 0x90A1, 0xDAFA, + 0x90A2, 0xD0CF, + 0x90A3, 0xC4C7, + 0x90A6, 0xB0EE, + 0x90AA, 0xD0B0, + 0x90AC, 0xDAF9, + 0x90AE, 0xD3CA, + 0x90AF, 0xBAAA, + 0x90B0, 0xDBA2, + 0x90B1, 0xC7F1, + 0x90B3, 0xDAFC, + 0x90B4, 0xDAFB, + 0x90B5, 0xC9DB, + 0x90B6, 0xDAFD, + 0x90B8, 0xDBA1, + 0x90B9, 0xD7DE, + 0x90BA, 0xDAFE, + 0x90BB, 0xC1DA, + 0x90BE, 0xDBA5, + 0x90C1, 0xD3F4, + 0x90C4, 0xDBA7, + 0x90C5, 0xDBA4, + 0x90C7, 0xDBA8, + 0x90CA, 0xBDBC, + 0x90CE, 0xC0C9, + 0x90CF, 0xDBA3, + 0x90D0, 0xDBA6, + 0x90D1, 0xD6A3, + 0x90D3, 0xDBA9, + 0x90D7, 0xDBAD, + 0x90DB, 0xDBAE, + 0x90DC, 0xDBAC, + 0x90DD, 0xBAC2, + 0x90E1, 0xBFA4, + 0x90E2, 0xDBAB, + 0x90E6, 0xDBAA, + 0x90E7, 0xD4C7, + 0x90E8, 0xB2BF, + 0x90EB, 0xDBAF, + 0x90ED, 0xB9F9, + 0x90EF, 0xDBB0, + 0x90F4, 0xB3BB, + 0x90F8, 0xB5A6, + 0x90FD, 0xB6BC, + 0x90FE, 0xDBB1, + 0x9102, 0xB6F5, + 0x9104, 0xDBB2, + 0x9119, 0xB1C9, + 0x911E, 0xDBB4, + 0x9122, 0xDBB3, + 0x9123, 0xDBB5, + 0x912F, 0xDBB7, + 0x9131, 0xDBB6, + 0x9139, 0xDBB8, + 0x9143, 0xDBB9, + 0x9146, 0xDBBA, + 0x9149, 0xD3CF, + 0x914A, 0xF4FA, + 0x914B, 0xC7F5, + 0x914C, 0xD7C3, + 0x914D, 0xC5E4, + 0x914E, 0xF4FC, + 0x914F, 0xF4FD, + 0x9150, 0xF4FB, + 0x9152, 0xBEC6, + 0x9157, 0xD0EF, + 0x915A, 0xB7D3, + 0x915D, 0xD4CD, + 0x915E, 0xCCAA, + 0x9161, 0xF5A2, + 0x9162, 0xF5A1, + 0x9163, 0xBAA8, + 0x9164, 0xF4FE, + 0x9165, 0xCBD6, + 0x9169, 0xF5A4, + 0x916A, 0xC0D2, + 0x916C, 0xB3EA, + 0x916E, 0xCDAA, + 0x916F, 0xF5A5, + 0x9170, 0xF5A3, + 0x9171, 0xBDB4, + 0x9172, 0xF5A8, + 0x9174, 0xF5A9, + 0x9175, 0xBDCD, + 0x9176, 0xC3B8, + 0x9177, 0xBFE1, + 0x9178, 0xCBE1, + 0x9179, 0xF5AA, + 0x917D, 0xF5A6, + 0x917E, 0xF5A7, + 0x917F, 0xC4F0, + 0x9185, 0xF5AC, + 0x9187, 0xB4BC, + 0x9189, 0xD7ED, + 0x918B, 0xB4D7, + 0x918C, 0xF5AB, + 0x918D, 0xF5AE, + 0x9190, 0xF5AD, + 0x9191, 0xF5AF, + 0x9192, 0xD0D1, + 0x919A, 0xC3D1, + 0x919B, 0xC8A9, + 0x91A2, 0xF5B0, + 0x91A3, 0xF5B1, + 0x91AA, 0xF5B2, + 0x91AD, 0xF5B3, + 0x91AE, 0xF5B4, + 0x91AF, 0xF5B5, + 0x91B4, 0xF5B7, + 0x91B5, 0xF5B6, + 0x91BA, 0xF5B8, + 0x91C7, 0xB2C9, + 0x91C9, 0xD3D4, + 0x91CA, 0xCACD, + 0x91CC, 0xC0EF, + 0x91CD, 0xD6D8, + 0x91CE, 0xD2B0, + 0x91CF, 0xC1BF, + 0x91D1, 0xBDF0, + 0x91DC, 0xB8AA, + 0x9274, 0xBCF8, + 0x928E, 0xF6C6, + 0x92AE, 0xF6C7, + 0x92C8, 0xF6C8, + 0x933E, 0xF6C9, + 0x936A, 0xF6CA, + 0x938F, 0xF6CC, + 0x93CA, 0xF6CB, + 0x93D6, 0xF7E9, + 0x943E, 0xF6CD, + 0x946B, 0xF6CE, + 0x9485, 0xEEC4, + 0x9486, 0xEEC5, + 0x9487, 0xEEC6, + 0x9488, 0xD5EB, + 0x9489, 0xB6A4, + 0x948A, 0xEEC8, + 0x948B, 0xEEC7, + 0x948C, 0xEEC9, + 0x948D, 0xEECA, + 0x948E, 0xC7A5, + 0x948F, 0xEECB, + 0x9490, 0xEECC, + 0x9492, 0xB7B0, + 0x9493, 0xB5F6, + 0x9494, 0xEECD, + 0x9495, 0xEECF, + 0x9497, 0xEECE, + 0x9499, 0xB8C6, + 0x949A, 0xEED0, + 0x949B, 0xEED1, + 0x949C, 0xEED2, + 0x949D, 0xB6DB, + 0x949E, 0xB3AE, + 0x949F, 0xD6D3, + 0x94A0, 0xC4C6, + 0x94A1, 0xB1B5, + 0x94A2, 0xB8D6, + 0x94A3, 0xEED3, + 0x94A4, 0xEED4, + 0x94A5, 0xD4BF, + 0x94A6, 0xC7D5, + 0x94A7, 0xBEFB, + 0x94A8, 0xCED9, + 0x94A9, 0xB9B3, + 0x94AA, 0xEED6, + 0x94AB, 0xEED5, + 0x94AC, 0xEED8, + 0x94AD, 0xEED7, + 0x94AE, 0xC5A5, + 0x94AF, 0xEED9, + 0x94B0, 0xEEDA, + 0x94B1, 0xC7AE, + 0x94B2, 0xEEDB, + 0x94B3, 0xC7AF, + 0x94B4, 0xEEDC, + 0x94B5, 0xB2A7, + 0x94B6, 0xEEDD, + 0x94B7, 0xEEDE, + 0x94B8, 0xEEDF, + 0x94B9, 0xEEE0, + 0x94BA, 0xEEE1, + 0x94BB, 0xD7EA, + 0x94BC, 0xEEE2, + 0x94BD, 0xEEE3, + 0x94BE, 0xBCD8, + 0x94BF, 0xEEE4, + 0x94C0, 0xD3CB, + 0x94C1, 0xCCFA, + 0x94C2, 0xB2AC, + 0x94C3, 0xC1E5, + 0x94C4, 0xEEE5, + 0x94C5, 0xC7A6, + 0x94C6, 0xC3AD, + 0x94C8, 0xEEE6, + 0x94C9, 0xEEE7, + 0x94CA, 0xEEE8, + 0x94CB, 0xEEE9, + 0x94CC, 0xEEEA, + 0x94CD, 0xEEEB, + 0x94CE, 0xEEEC, + 0x94D0, 0xEEED, + 0x94D1, 0xEEEE, + 0x94D2, 0xEEEF, + 0x94D5, 0xEEF0, + 0x94D6, 0xEEF1, + 0x94D7, 0xEEF2, + 0x94D8, 0xEEF4, + 0x94D9, 0xEEF3, + 0x94DB, 0xEEF5, + 0x94DC, 0xCDAD, + 0x94DD, 0xC2C1, + 0x94DE, 0xEEF6, + 0x94DF, 0xEEF7, + 0x94E0, 0xEEF8, + 0x94E1, 0xD5A1, + 0x94E2, 0xEEF9, + 0x94E3, 0xCFB3, + 0x94E4, 0xEEFA, + 0x94E5, 0xEEFB, + 0x94E7, 0xEEFC, + 0x94E8, 0xEEFD, + 0x94E9, 0xEFA1, + 0x94EA, 0xEEFE, + 0x94EB, 0xEFA2, + 0x94EC, 0xB8F5, + 0x94ED, 0xC3FA, + 0x94EE, 0xEFA3, + 0x94EF, 0xEFA4, + 0x94F0, 0xBDC2, + 0x94F1, 0xD2BF, + 0x94F2, 0xB2F9, + 0x94F3, 0xEFA5, + 0x94F4, 0xEFA6, + 0x94F5, 0xEFA7, + 0x94F6, 0xD2F8, + 0x94F7, 0xEFA8, + 0x94F8, 0xD6FD, + 0x94F9, 0xEFA9, + 0x94FA, 0xC6CC, + 0x94FC, 0xEFAA, + 0x94FD, 0xEFAB, + 0x94FE, 0xC1B4, + 0x94FF, 0xEFAC, + 0x9500, 0xCFFA, + 0x9501, 0xCBF8, + 0x9502, 0xEFAE, + 0x9503, 0xEFAD, + 0x9504, 0xB3FA, + 0x9505, 0xB9F8, + 0x9506, 0xEFAF, + 0x9507, 0xEFB0, + 0x9508, 0xD0E2, + 0x9509, 0xEFB1, + 0x950A, 0xEFB2, + 0x950B, 0xB7E6, + 0x950C, 0xD0BF, + 0x950D, 0xEFB3, + 0x950E, 0xEFB4, + 0x950F, 0xEFB5, + 0x9510, 0xC8F1, + 0x9511, 0xCCE0, + 0x9512, 0xEFB6, + 0x9513, 0xEFB7, + 0x9514, 0xEFB8, + 0x9515, 0xEFB9, + 0x9516, 0xEFBA, + 0x9517, 0xD5E0, + 0x9518, 0xEFBB, + 0x9519, 0xB4ED, + 0x951A, 0xC3AA, + 0x951B, 0xEFBC, + 0x951D, 0xEFBD, + 0x951E, 0xEFBE, + 0x951F, 0xEFBF, + 0x9521, 0xCEFD, + 0x9522, 0xEFC0, + 0x9523, 0xC2E0, + 0x9524, 0xB4B8, + 0x9525, 0xD7B6, + 0x9526, 0xBDF5, + 0x9528, 0xCFC7, + 0x9529, 0xEFC3, + 0x952A, 0xEFC1, + 0x952B, 0xEFC2, + 0x952C, 0xEFC4, + 0x952D, 0xB6A7, + 0x952E, 0xBCFC, + 0x952F, 0xBEE2, + 0x9530, 0xC3CC, + 0x9531, 0xEFC5, + 0x9532, 0xEFC6, + 0x9534, 0xEFC7, + 0x9535, 0xEFCF, + 0x9536, 0xEFC8, + 0x9537, 0xEFC9, + 0x9538, 0xEFCA, + 0x9539, 0xC7C2, + 0x953A, 0xEFF1, + 0x953B, 0xB6CD, + 0x953C, 0xEFCB, + 0x953E, 0xEFCC, + 0x953F, 0xEFCD, + 0x9540, 0xB6C6, + 0x9541, 0xC3BE, + 0x9542, 0xEFCE, + 0x9544, 0xEFD0, + 0x9545, 0xEFD1, + 0x9546, 0xEFD2, + 0x9547, 0xD5F2, + 0x9549, 0xEFD3, + 0x954A, 0xC4F7, + 0x954C, 0xEFD4, + 0x954D, 0xC4F8, + 0x954E, 0xEFD5, + 0x954F, 0xEFD6, + 0x9550, 0xB8E4, + 0x9551, 0xB0F7, + 0x9552, 0xEFD7, + 0x9553, 0xEFD8, + 0x9554, 0xEFD9, + 0x9556, 0xEFDA, + 0x9557, 0xEFDB, + 0x9558, 0xEFDC, + 0x9559, 0xEFDD, + 0x955B, 0xEFDE, + 0x955C, 0xBEB5, + 0x955D, 0xEFE1, + 0x955E, 0xEFDF, + 0x955F, 0xEFE0, + 0x9561, 0xEFE2, + 0x9562, 0xEFE3, + 0x9563, 0xC1CD, + 0x9564, 0xEFE4, + 0x9565, 0xEFE5, + 0x9566, 0xEFE6, + 0x9567, 0xEFE7, + 0x9568, 0xEFE8, + 0x9569, 0xEFE9, + 0x956A, 0xEFEA, + 0x956B, 0xEFEB, + 0x956C, 0xEFEC, + 0x956D, 0xC0D8, + 0x956F, 0xEFED, + 0x9570, 0xC1AD, + 0x9571, 0xEFEE, + 0x9572, 0xEFEF, + 0x9573, 0xEFF0, + 0x9576, 0xCFE2, + 0x957F, 0xB3A4, + 0x95E8, 0xC3C5, + 0x95E9, 0xE3C5, + 0x95EA, 0xC9C1, + 0x95EB, 0xE3C6, + 0x95ED, 0xB1D5, + 0x95EE, 0xCECA, + 0x95EF, 0xB4B3, + 0x95F0, 0xC8F2, + 0x95F1, 0xE3C7, + 0x95F2, 0xCFD0, + 0x95F3, 0xE3C8, + 0x95F4, 0xBCE4, + 0x95F5, 0xE3C9, + 0x95F6, 0xE3CA, + 0x95F7, 0xC3C6, + 0x95F8, 0xD5A2, + 0x95F9, 0xC4D6, + 0x95FA, 0xB9EB, + 0x95FB, 0xCEC5, + 0x95FC, 0xE3CB, + 0x95FD, 0xC3F6, + 0x95FE, 0xE3CC, + 0x9600, 0xB7A7, + 0x9601, 0xB8F3, + 0x9602, 0xBAD2, + 0x9603, 0xE3CD, + 0x9604, 0xE3CE, + 0x9605, 0xD4C4, + 0x9606, 0xE3CF, + 0x9608, 0xE3D0, + 0x9609, 0xD1CB, + 0x960A, 0xE3D1, + 0x960B, 0xE3D2, + 0x960C, 0xE3D3, + 0x960D, 0xE3D4, + 0x960E, 0xD1D6, + 0x960F, 0xE3D5, + 0x9610, 0xB2FB, + 0x9611, 0xC0BB, + 0x9612, 0xE3D6, + 0x9614, 0xC0AB, + 0x9615, 0xE3D7, + 0x9616, 0xE3D8, + 0x9617, 0xE3D9, + 0x9619, 0xE3DA, + 0x961A, 0xE3DB, + 0x961C, 0xB8B7, + 0x961D, 0xDAE2, + 0x961F, 0xB6D3, + 0x9621, 0xDAE4, + 0x9622, 0xDAE3, + 0x962A, 0xDAE6, + 0x962E, 0xC8EE, + 0x9631, 0xDAE5, + 0x9632, 0xB7C0, + 0x9633, 0xD1F4, + 0x9634, 0xD2F5, + 0x9635, 0xD5F3, + 0x9636, 0xBDD7, + 0x963B, 0xD7E8, + 0x963C, 0xDAE8, + 0x963D, 0xDAE7, + 0x963F, 0xB0A2, + 0x9640, 0xCDD3, + 0x9642, 0xDAE9, + 0x9644, 0xB8BD, + 0x9645, 0xBCCA, + 0x9646, 0xC2BD, + 0x9647, 0xC2A4, + 0x9648, 0xB3C2, + 0x9649, 0xDAEA, + 0x964B, 0xC2AA, + 0x964C, 0xC4B0, + 0x964D, 0xBDB5, + 0x9650, 0xCFDE, + 0x9654, 0xDAEB, + 0x9655, 0xC9C2, + 0x965B, 0xB1DD, + 0x965F, 0xDAEC, + 0x9661, 0xB6B8, + 0x9662, 0xD4BA, + 0x9664, 0xB3FD, + 0x9667, 0xDAED, + 0x9668, 0xD4C9, + 0x9669, 0xCFD5, + 0x966A, 0xC5E3, + 0x966C, 0xDAEE, + 0x9672, 0xDAEF, + 0x9674, 0xDAF0, + 0x9675, 0xC1EA, + 0x9676, 0xCCD5, + 0x9677, 0xCFDD, + 0x9685, 0xD3E7, + 0x9686, 0xC2A1, + 0x9688, 0xDAF1, + 0x968B, 0xCBE5, + 0x968D, 0xDAF2, + 0x968F, 0xCBE6, + 0x9690, 0xD2FE, + 0x9694, 0xB8F4, + 0x9697, 0xDAF3, + 0x9698, 0xB0AF, + 0x9699, 0xCFB6, + 0x969C, 0xD5CF, + 0x96A7, 0xCBED, + 0x96B0, 0xDAF4, + 0x96B3, 0xE3C4, + 0x96B6, 0xC1A5, + 0x96B9, 0xF6BF, + 0x96BC, 0xF6C0, + 0x96BD, 0xF6C1, + 0x96BE, 0xC4D1, + 0x96C0, 0xC8B8, + 0x96C1, 0xD1E3, + 0x96C4, 0xD0DB, + 0x96C5, 0xD1C5, + 0x96C6, 0xBCAF, + 0x96C7, 0xB9CD, + 0x96C9, 0xEFF4, + 0x96CC, 0xB4C6, + 0x96CD, 0xD3BA, + 0x96CE, 0xF6C2, + 0x96CF, 0xB3FB, + 0x96D2, 0xF6C3, + 0x96D5, 0xB5F1, + 0x96E0, 0xF6C5, + 0x96E8, 0xD3EA, + 0x96E9, 0xF6A7, + 0x96EA, 0xD1A9, + 0x96EF, 0xF6A9, + 0x96F3, 0xF6A8, + 0x96F6, 0xC1E3, + 0x96F7, 0xC0D7, + 0x96F9, 0xB1A2, + 0x96FE, 0xCEED, + 0x9700, 0xD0E8, + 0x9701, 0xF6AB, + 0x9704, 0xCFF6, + 0x9706, 0xF6AA, + 0x9707, 0xD5F0, + 0x9708, 0xF6AC, + 0x9709, 0xC3B9, + 0x970D, 0xBBF4, + 0x970E, 0xF6AE, + 0x970F, 0xF6AD, + 0x9713, 0xC4DE, + 0x9716, 0xC1D8, + 0x971C, 0xCBAA, + 0x971E, 0xCFBC, + 0x972A, 0xF6AF, + 0x972D, 0xF6B0, + 0x9730, 0xF6B1, + 0x9732, 0xC2B6, + 0x9738, 0xB0D4, + 0x9739, 0xC5F9, + 0x973E, 0xF6B2, + 0x9752, 0xC7E0, + 0x9753, 0xF6A6, + 0x9756, 0xBEB8, + 0x9759, 0xBEB2, + 0x975B, 0xB5E5, + 0x975E, 0xB7C7, + 0x9760, 0xBFBF, + 0x9761, 0xC3D2, + 0x9762, 0xC3E6, + 0x9765, 0xD8CC, + 0x9769, 0xB8EF, + 0x9773, 0xBDF9, + 0x9774, 0xD1A5, + 0x9776, 0xB0D0, + 0x977C, 0xF7B0, + 0x9785, 0xF7B1, + 0x978B, 0xD0AC, + 0x978D, 0xB0B0, + 0x9791, 0xF7B2, + 0x9792, 0xF7B3, + 0x9794, 0xF7B4, + 0x9798, 0xC7CA, + 0x97A0, 0xBECF, + 0x97A3, 0xF7B7, + 0x97AB, 0xF7B6, + 0x97AD, 0xB1DE, + 0x97AF, 0xF7B5, + 0x97B2, 0xF7B8, + 0x97B4, 0xF7B9, + 0x97E6, 0xCEA4, + 0x97E7, 0xC8CD, + 0x97E9, 0xBAAB, + 0x97EA, 0xE8B8, + 0x97EB, 0xE8B9, + 0x97EC, 0xE8BA, + 0x97ED, 0xBEC2, + 0x97F3, 0xD2F4, + 0x97F5, 0xD4CF, + 0x97F6, 0xC9D8, + 0x9875, 0xD2B3, + 0x9876, 0xB6A5, + 0x9877, 0xC7EA, + 0x9878, 0xF1FC, + 0x9879, 0xCFEE, + 0x987A, 0xCBB3, + 0x987B, 0xD0EB, + 0x987C, 0xE7EF, + 0x987D, 0xCDE7, + 0x987E, 0xB9CB, + 0x987F, 0xB6D9, + 0x9880, 0xF1FD, + 0x9881, 0xB0E4, + 0x9882, 0xCBCC, + 0x9883, 0xF1FE, + 0x9884, 0xD4A4, + 0x9885, 0xC2AD, + 0x9886, 0xC1EC, + 0x9887, 0xC6C4, + 0x9888, 0xBEB1, + 0x9889, 0xF2A1, + 0x988A, 0xBCD5, + 0x988C, 0xF2A2, + 0x988D, 0xF2A3, + 0x988F, 0xF2A4, + 0x9890, 0xD2C3, + 0x9891, 0xC6B5, + 0x9893, 0xCDC7, + 0x9894, 0xF2A5, + 0x9896, 0xD3B1, + 0x9897, 0xBFC5, + 0x9898, 0xCCE2, + 0x989A, 0xF2A6, + 0x989B, 0xF2A7, + 0x989C, 0xD1D5, + 0x989D, 0xB6EE, + 0x989E, 0xF2A8, + 0x989F, 0xF2A9, + 0x98A0, 0xB5DF, + 0x98A1, 0xF2AA, + 0x98A2, 0xF2AB, + 0x98A4, 0xB2FC, + 0x98A5, 0xF2AC, + 0x98A6, 0xF2AD, + 0x98A7, 0xC8A7, + 0x98CE, 0xB7E7, + 0x98D1, 0xECA9, + 0x98D2, 0xECAA, + 0x98D3, 0xECAB, + 0x98D5, 0xECAC, + 0x98D8, 0xC6AE, + 0x98D9, 0xECAD, + 0x98DA, 0xECAE, + 0x98DE, 0xB7C9, + 0x98DF, 0xCAB3, + 0x98E7, 0xE2B8, + 0x98E8, 0xF7CF, + 0x990D, 0xF7D0, + 0x9910, 0xB2CD, + 0x992E, 0xF7D1, + 0x9954, 0xF7D3, + 0x9955, 0xF7D2, + 0x9963, 0xE2BB, + 0x9965, 0xBCA2, + 0x9967, 0xE2BC, + 0x9968, 0xE2BD, + 0x9969, 0xE2BE, + 0x996A, 0xE2BF, + 0x996B, 0xE2C0, + 0x996C, 0xE2C1, + 0x996D, 0xB7B9, + 0x996E, 0xD2FB, + 0x996F, 0xBDA4, + 0x9970, 0xCACE, + 0x9971, 0xB1A5, + 0x9972, 0xCBC7, + 0x9974, 0xE2C2, + 0x9975, 0xB6FC, + 0x9976, 0xC8C4, + 0x9977, 0xE2C3, + 0x997A, 0xBDC8, + 0x997C, 0xB1FD, + 0x997D, 0xE2C4, + 0x997F, 0xB6F6, + 0x9980, 0xE2C5, + 0x9981, 0xC4D9, + 0x9984, 0xE2C6, + 0x9985, 0xCFDA, + 0x9986, 0xB9DD, + 0x9987, 0xE2C7, + 0x9988, 0xC0A1, + 0x998A, 0xE2C8, + 0x998B, 0xB2F6, + 0x998D, 0xE2C9, + 0x998F, 0xC1F3, + 0x9990, 0xE2CA, + 0x9991, 0xE2CB, + 0x9992, 0xC2F8, + 0x9993, 0xE2CC, + 0x9994, 0xE2CD, + 0x9995, 0xE2CE, + 0x9996, 0xCAD7, + 0x9997, 0xD8B8, + 0x9998, 0xD9E5, + 0x9999, 0xCFE3, + 0x99A5, 0xF0A5, + 0x99A8, 0xDCB0, + 0x9A6C, 0xC2ED, + 0x9A6D, 0xD4A6, + 0x9A6E, 0xCDD4, + 0x9A6F, 0xD1B1, + 0x9A70, 0xB3DB, + 0x9A71, 0xC7FD, + 0x9A73, 0xB2B5, + 0x9A74, 0xC2BF, + 0x9A75, 0xE6E0, + 0x9A76, 0xCABB, + 0x9A77, 0xE6E1, + 0x9A78, 0xE6E2, + 0x9A79, 0xBED4, + 0x9A7A, 0xE6E3, + 0x9A7B, 0xD7A4, + 0x9A7C, 0xCDD5, + 0x9A7D, 0xE6E5, + 0x9A7E, 0xBCDD, + 0x9A7F, 0xE6E4, + 0x9A80, 0xE6E6, + 0x9A81, 0xE6E7, + 0x9A82, 0xC2EE, + 0x9A84, 0xBDBE, + 0x9A85, 0xE6E8, + 0x9A86, 0xC2E6, + 0x9A87, 0xBAA7, + 0x9A88, 0xE6E9, + 0x9A8A, 0xE6EA, + 0x9A8B, 0xB3D2, + 0x9A8C, 0xD1E9, + 0x9A8F, 0xBFA5, + 0x9A90, 0xE6EB, + 0x9A91, 0xC6EF, + 0x9A92, 0xE6EC, + 0x9A93, 0xE6ED, + 0x9A96, 0xE6EE, + 0x9A97, 0xC6AD, + 0x9A98, 0xE6EF, + 0x9A9A, 0xC9A7, + 0x9A9B, 0xE6F0, + 0x9A9C, 0xE6F1, + 0x9A9D, 0xE6F2, + 0x9A9E, 0xE5B9, + 0x9A9F, 0xE6F3, + 0x9AA0, 0xE6F4, + 0x9AA1, 0xC2E2, + 0x9AA2, 0xE6F5, + 0x9AA3, 0xE6F6, + 0x9AA4, 0xD6E8, + 0x9AA5, 0xE6F7, + 0x9AA7, 0xE6F8, + 0x9AA8, 0xB9C7, + 0x9AB0, 0xF7BB, + 0x9AB1, 0xF7BA, + 0x9AB6, 0xF7BE, + 0x9AB7, 0xF7BC, + 0x9AB8, 0xBAA1, + 0x9ABA, 0xF7BF, + 0x9ABC, 0xF7C0, + 0x9AC0, 0xF7C2, + 0x9AC1, 0xF7C1, + 0x9AC2, 0xF7C4, + 0x9AC5, 0xF7C3, + 0x9ACB, 0xF7C5, + 0x9ACC, 0xF7C6, + 0x9AD1, 0xF7C7, + 0x9AD3, 0xCBE8, + 0x9AD8, 0xB8DF, + 0x9ADF, 0xF7D4, + 0x9AE1, 0xF7D5, + 0x9AE6, 0xF7D6, + 0x9AEB, 0xF7D8, + 0x9AED, 0xF7DA, + 0x9AEF, 0xF7D7, + 0x9AF9, 0xF7DB, + 0x9AFB, 0xF7D9, + 0x9B03, 0xD7D7, + 0x9B08, 0xF7DC, + 0x9B0F, 0xF7DD, + 0x9B13, 0xF7DE, + 0x9B1F, 0xF7DF, + 0x9B23, 0xF7E0, + 0x9B2F, 0xDBCB, + 0x9B32, 0xD8AA, + 0x9B3B, 0xE5F7, + 0x9B3C, 0xB9ED, + 0x9B41, 0xBFFD, + 0x9B42, 0xBBEA, + 0x9B43, 0xF7C9, + 0x9B44, 0xC6C7, + 0x9B45, 0xF7C8, + 0x9B47, 0xF7CA, + 0x9B48, 0xF7CC, + 0x9B49, 0xF7CB, + 0x9B4D, 0xF7CD, + 0x9B4F, 0xCEBA, + 0x9B51, 0xF7CE, + 0x9B54, 0xC4A7, + 0x9C7C, 0xD3E3, + 0x9C7F, 0xF6CF, + 0x9C81, 0xC2B3, + 0x9C82, 0xF6D0, + 0x9C85, 0xF6D1, + 0x9C86, 0xF6D2, + 0x9C87, 0xF6D3, + 0x9C88, 0xF6D4, + 0x9C8B, 0xF6D6, + 0x9C8D, 0xB1AB, + 0x9C8E, 0xF6D7, + 0x9C90, 0xF6D8, + 0x9C91, 0xF6D9, + 0x9C92, 0xF6DA, + 0x9C94, 0xF6DB, + 0x9C95, 0xF6DC, + 0x9C9A, 0xF6DD, + 0x9C9B, 0xF6DE, + 0x9C9C, 0xCFCA, + 0x9C9E, 0xF6DF, + 0x9C9F, 0xF6E0, + 0x9CA0, 0xF6E1, + 0x9CA1, 0xF6E2, + 0x9CA2, 0xF6E3, + 0x9CA3, 0xF6E4, + 0x9CA4, 0xC0F0, + 0x9CA5, 0xF6E5, + 0x9CA6, 0xF6E6, + 0x9CA7, 0xF6E7, + 0x9CA8, 0xF6E8, + 0x9CA9, 0xF6E9, + 0x9CAB, 0xF6EA, + 0x9CAD, 0xF6EB, + 0x9CAE, 0xF6EC, + 0x9CB0, 0xF6ED, + 0x9CB1, 0xF6EE, + 0x9CB2, 0xF6EF, + 0x9CB3, 0xF6F0, + 0x9CB4, 0xF6F1, + 0x9CB5, 0xF6F2, + 0x9CB6, 0xF6F3, + 0x9CB7, 0xF6F4, + 0x9CB8, 0xBEA8, + 0x9CBA, 0xF6F5, + 0x9CBB, 0xF6F6, + 0x9CBC, 0xF6F7, + 0x9CBD, 0xF6F8, + 0x9CC3, 0xC8FA, + 0x9CC4, 0xF6F9, + 0x9CC5, 0xF6FA, + 0x9CC6, 0xF6FB, + 0x9CC7, 0xF6FC, + 0x9CCA, 0xF6FD, + 0x9CCB, 0xF6FE, + 0x9CCC, 0xF7A1, + 0x9CCD, 0xF7A2, + 0x9CCE, 0xF7A3, + 0x9CCF, 0xF7A4, + 0x9CD0, 0xF7A5, + 0x9CD3, 0xF7A6, + 0x9CD4, 0xF7A7, + 0x9CD5, 0xF7A8, + 0x9CD6, 0xB1EE, + 0x9CD7, 0xF7A9, + 0x9CD8, 0xF7AA, + 0x9CD9, 0xF7AB, + 0x9CDC, 0xF7AC, + 0x9CDD, 0xF7AD, + 0x9CDE, 0xC1DB, + 0x9CDF, 0xF7AE, + 0x9CE2, 0xF7AF, + 0x9E1F, 0xC4F1, + 0x9E20, 0xF0AF, + 0x9E21, 0xBCA6, + 0x9E22, 0xF0B0, + 0x9E23, 0xC3F9, + 0x9E25, 0xC5B8, + 0x9E26, 0xD1BB, + 0x9E28, 0xF0B1, + 0x9E29, 0xF0B2, + 0x9E2A, 0xF0B3, + 0x9E2B, 0xF0B4, + 0x9E2C, 0xF0B5, + 0x9E2D, 0xD1BC, + 0x9E2F, 0xD1EC, + 0x9E31, 0xF0B7, + 0x9E32, 0xF0B6, + 0x9E33, 0xD4A7, + 0x9E35, 0xCDD2, + 0x9E36, 0xF0B8, + 0x9E37, 0xF0BA, + 0x9E38, 0xF0B9, + 0x9E39, 0xF0BB, + 0x9E3A, 0xF0BC, + 0x9E3D, 0xB8EB, + 0x9E3E, 0xF0BD, + 0x9E3F, 0xBAE8, + 0x9E41, 0xF0BE, + 0x9E42, 0xF0BF, + 0x9E43, 0xBEE9, + 0x9E44, 0xF0C0, + 0x9E45, 0xB6EC, + 0x9E46, 0xF0C1, + 0x9E47, 0xF0C2, + 0x9E48, 0xF0C3, + 0x9E49, 0xF0C4, + 0x9E4A, 0xC8B5, + 0x9E4B, 0xF0C5, + 0x9E4C, 0xF0C6, + 0x9E4E, 0xF0C7, + 0x9E4F, 0xC5F4, + 0x9E51, 0xF0C8, + 0x9E55, 0xF0C9, + 0x9E57, 0xF0CA, + 0x9E58, 0xF7BD, + 0x9E5A, 0xF0CB, + 0x9E5B, 0xF0CC, + 0x9E5C, 0xF0CD, + 0x9E5E, 0xF0CE, + 0x9E63, 0xF0CF, + 0x9E64, 0xBAD7, + 0x9E66, 0xF0D0, + 0x9E67, 0xF0D1, + 0x9E68, 0xF0D2, + 0x9E69, 0xF0D3, + 0x9E6A, 0xF0D4, + 0x9E6B, 0xF0D5, + 0x9E6C, 0xF0D6, + 0x9E6D, 0xF0D8, + 0x9E70, 0xD3A5, + 0x9E71, 0xF0D7, + 0x9E73, 0xF0D9, + 0x9E7E, 0xF5BA, + 0x9E7F, 0xC2B9, + 0x9E82, 0xF7E4, + 0x9E87, 0xF7E5, + 0x9E88, 0xF7E6, + 0x9E8B, 0xF7E7, + 0x9E92, 0xF7E8, + 0x9E93, 0xC2B4, + 0x9E9D, 0xF7EA, + 0x9E9F, 0xF7EB, + 0x9EA6, 0xC2F3, + 0x9EB4, 0xF4F0, + 0x9EB8, 0xF4EF, + 0x9EBB, 0xC2E9, + 0x9EBD, 0xF7E1, + 0x9EBE, 0xF7E2, + 0x9EC4, 0xBBC6, + 0x9EC9, 0xD9E4, + 0x9ECD, 0xCAF2, + 0x9ECE, 0xC0E8, + 0x9ECF, 0xF0A4, + 0x9ED1, 0xBADA, + 0x9ED4, 0xC7AD, + 0x9ED8, 0xC4AC, + 0x9EDB, 0xF7EC, + 0x9EDC, 0xF7ED, + 0x9EDD, 0xF7EE, + 0x9EDF, 0xF7F0, + 0x9EE0, 0xF7EF, + 0x9EE2, 0xF7F1, + 0x9EE5, 0xF7F4, + 0x9EE7, 0xF7F3, + 0x9EE9, 0xF7F2, + 0x9EEA, 0xF7F5, + 0x9EEF, 0xF7F6, + 0x9EF9, 0xEDE9, + 0x9EFB, 0xEDEA, + 0x9EFC, 0xEDEB, + 0x9EFE, 0xF6BC, + 0x9F0B, 0xF6BD, + 0x9F0D, 0xF6BE, + 0x9F0E, 0xB6A6, + 0x9F10, 0xD8BE, + 0x9F13, 0xB9C4, + 0x9F17, 0xD8BB, + 0x9F19, 0xDCB1, + 0x9F20, 0xCAF3, + 0x9F22, 0xF7F7, + 0x9F2C, 0xF7F8, + 0x9F2F, 0xF7F9, + 0x9F37, 0xF7FB, + 0x9F39, 0xF7FA, + 0x9F3B, 0xB1C7, + 0x9F3D, 0xF7FC, + 0x9F3E, 0xF7FD, + 0x9F44, 0xF7FE, + 0x9F50, 0xC6EB, + 0x9F51, 0xECB4, + 0x9F7F, 0xB3DD, + 0x9F80, 0xF6B3, + 0x9F83, 0xF6B4, + 0x9F84, 0xC1E4, + 0x9F85, 0xF6B5, + 0x9F86, 0xF6B6, + 0x9F87, 0xF6B7, + 0x9F88, 0xF6B8, + 0x9F89, 0xF6B9, + 0x9F8A, 0xF6BA, + 0x9F8B, 0xC8A3, + 0x9F8C, 0xF6BB, + 0x9F99, 0xC1FA, + 0x9F9A, 0xB9A8, + 0x9F9B, 0xEDE8, + 0x9F9F, 0xB9EA, + 0x9FA0, 0xD9DF, + 0xFF01, 0xA3A1, + 0xFF02, 0xA3A2, + 0xFF03, 0xA3A3, + 0xFF04, 0xA1E7, + 0xFF05, 0xA3A5, + 0xFF06, 0xA3A6, + 0xFF07, 0xA3A7, + 0xFF08, 0xA3A8, + 0xFF09, 0xA3A9, + 0xFF0A, 0xA3AA, + 0xFF0B, 0xA3AB, + 0xFF0C, 0xA3AC, + 0xFF0D, 0xA3AD, + 0xFF0E, 0xA3AE, + 0xFF0F, 0xA3AF, + 0xFF10, 0xA3B0, + 0xFF11, 0xA3B1, + 0xFF12, 0xA3B2, + 0xFF13, 0xA3B3, + 0xFF14, 0xA3B4, + 0xFF15, 0xA3B5, + 0xFF16, 0xA3B6, + 0xFF17, 0xA3B7, + 0xFF18, 0xA3B8, + 0xFF19, 0xA3B9, + 0xFF1A, 0xA3BA, + 0xFF1B, 0xA3BB, + 0xFF1C, 0xA3BC, + 0xFF1D, 0xA3BD, + 0xFF1E, 0xA3BE, + 0xFF1F, 0xA3BF, + 0xFF20, 0xA3C0, + 0xFF21, 0xA3C1, + 0xFF22, 0xA3C2, + 0xFF23, 0xA3C3, + 0xFF24, 0xA3C4, + 0xFF25, 0xA3C5, + 0xFF26, 0xA3C6, + 0xFF27, 0xA3C7, + 0xFF28, 0xA3C8, + 0xFF29, 0xA3C9, + 0xFF2A, 0xA3CA, + 0xFF2B, 0xA3CB, + 0xFF2C, 0xA3CC, + 0xFF2D, 0xA3CD, + 0xFF2E, 0xA3CE, + 0xFF2F, 0xA3CF, + 0xFF30, 0xA3D0, + 0xFF31, 0xA3D1, + 0xFF32, 0xA3D2, + 0xFF33, 0xA3D3, + 0xFF34, 0xA3D4, + 0xFF35, 0xA3D5, + 0xFF36, 0xA3D6, + 0xFF37, 0xA3D7, + 0xFF38, 0xA3D8, + 0xFF39, 0xA3D9, + 0xFF3A, 0xA3DA, + 0xFF3B, 0xA3DB, + 0xFF3C, 0xA3DC, + 0xFF3D, 0xA3DD, + 0xFF3E, 0xA3DE, + 0xFF3F, 0xA3DF, + 0xFF40, 0xA3E0, + 0xFF41, 0xA3E1, + 0xFF42, 0xA3E2, + 0xFF43, 0xA3E3, + 0xFF44, 0xA3E4, + 0xFF45, 0xA3E5, + 0xFF46, 0xA3E6, + 0xFF47, 0xA3E7, + 0xFF48, 0xA3E8, + 0xFF49, 0xA3E9, + 0xFF4A, 0xA3EA, + 0xFF4B, 0xA3EB, + 0xFF4C, 0xA3EC, + 0xFF4D, 0xA3ED, + 0xFF4E, 0xA3EE, + 0xFF4F, 0xA3EF, + 0xFF50, 0xA3F0, + 0xFF51, 0xA3F1, + 0xFF52, 0xA3F2, + 0xFF53, 0xA3F3, + 0xFF54, 0xA3F4, + 0xFF55, 0xA3F5, + 0xFF56, 0xA3F6, + 0xFF57, 0xA3F7, + 0xFF58, 0xA3F8, + 0xFF59, 0xA3F9, + 0xFF5A, 0xA3FA, + 0xFF5B, 0xA3FB, + 0xFF5C, 0xA3FC, + 0xFF5D, 0xA3FD, + 0xFF5E, 0xA1AB, + 0xFFE0, 0xA1E9, + 0xFFE1, 0xA1EA, + 0xFFE3, 0xA3FE, + 0xFFE5, 0xA3A4 }; diff --git a/backend/gridmtx.c b/backend/gridmtx.c index bc5e4963..d872df81 100644 --- a/backend/gridmtx.c +++ b/backend/gridmtx.c @@ -1,20 +1,20 @@ /* gridmtx.c - Grid Matrix libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart + Copyright (C) 2009-2016 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. + documentation and/or other materials provided with the distribution. 3. Neither the name of the project nor the names of its contributors may be used to endorse or promote products derived from this software - without specific prior written permission. + without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -25,9 +25,9 @@ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + */ /* This file impliments Grid Matrix as specified in AIM Global Document Number AIMD014 Rev. 1.63 Revised 9 Dec 2008 */ @@ -36,1064 +36,1201 @@ #include #include #ifdef _MSC_VER -#include +#include #endif #include "common.h" #include "reedsol.h" #include "gridmtx.h" #include "gb2312.h" -int number_lat(int gbdata[], int length, int position) -{ - /* Attempt to calculate the 'cost' of using numeric mode from a given position in number of bits */ - /* Also ensures that numeric mode is not selected when it cannot be used: for example in - a string which has "2.2.0" (cannot have more than one non-numeric character for each - block of three numeric characters) */ - int sp; - int numb = 0, nonum = 0, done; - int tally = 0; +int number_lat(int gbdata[], int length, int position) { + /* Attempt to calculate the 'cost' of using numeric mode from a given position in number of bits */ + /* Also ensures that numeric mode is not selected when it cannot be used: for example in + a string which has "2.2.0" (cannot have more than one non-numeric character for each + block of three numeric characters) */ + int sp; + int numb = 0, nonum = 0, done; + int tally = 0; - sp = position; + sp = position; - do { - done = 0; + do { + done = 0; - if((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) { numb++; done = 1; } - switch(gbdata[sp]) { - case ' ': - case '+': - case '-': - case '.': - case ',': - nonum++; - done = 1; - } - if((sp + 1) < length) { - if((gbdata[sp] == 0x13) && (gbdata[sp + 1] == 0x10)) { - nonum++; - done = 1; - sp++; - } - } + if ((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) { + numb++; + done = 1; + } + switch (gbdata[sp]) { + case ' ': + case '+': + case '-': + case '.': + case ',': + nonum++; + done = 1; + } + if ((sp + 1) < length) { + if ((gbdata[sp] == 0x13) && (gbdata[sp + 1] == 0x10)) { + nonum++; + done = 1; + sp++; + } + } - if(done == 0) { - tally += 80; - } else { - if(numb == 3) { - if(nonum == 0) { - tally += 10; - } - if(nonum == 1) { - tally += 20; - } - if(nonum > 1) { - tally += 80; - } - numb = 0; - nonum = 0; - } - } + if (done == 0) { + tally += 80; + } else { + if (numb == 3) { + if (nonum == 0) { + tally += 10; + } + if (nonum == 1) { + tally += 20; + } + if (nonum > 1) { + tally += 80; + } + numb = 0; + nonum = 0; + } + } - sp++; - } while ((sp < length) && (sp <= (position + 8))); + sp++; + } while ((sp < length) && (sp <= (position + 8))); - if(numb == 0) { - tally += 80; - } + if (numb == 0) { + tally += 80; + } - if(numb > 1) { - if(nonum == 0) { - tally += 10; - } - if(nonum == 1) { - tally += 20; - } - if(nonum > 1) { - tally += 80; - } - } + if (numb > 1) { + if (nonum == 0) { + tally += 10; + } + if (nonum == 1) { + tally += 20; + } + if (nonum > 1) { + tally += 80; + } + } - return tally; + return tally; } -int seek_forward(int gbdata[], int length, int position, int current_mode) -{ - /* In complete contrast to the method recommended in Annex D of the ANSI standard this - code uses a look-ahead test in the same manner as Data Matrix. This decision was made - because the "official" algorithm does not provide clear methods for dealing with all - possible combinations of input data */ +int seek_forward(int gbdata[], int length, int position, int current_mode) { + /* In complete contrast to the method recommended in Annex D of the ANSI standard this + code uses a look-ahead test in the same manner as Data Matrix. This decision was made + because the "official" algorithm does not provide clear methods for dealing with all + possible combinations of input data */ - int number_count, byte_count, mixed_count, upper_count, lower_count, chinese_count; - int sp, best_mode, done; - int best_count, last = -1; - int debug = 0; + int number_count, byte_count, mixed_count, upper_count, lower_count, chinese_count; + int sp, best_mode, done; + int best_count, last = -1; + int debug = 0; - if(gbdata[position] > 0xff) { return GM_CHINESE; } + if (gbdata[position] > 0xff) { + return GM_CHINESE; + } - switch(current_mode) { - case GM_CHINESE: - number_count = 13; - byte_count = 13; - mixed_count = 13; - upper_count = 13; - lower_count = 13; - chinese_count = 0; - break; - case GM_NUMBER: - number_count = 0; - byte_count = 10; - mixed_count = 10; - upper_count = 10; - lower_count = 10; - chinese_count = 10; - break; - case GM_LOWER: - number_count = 5; - byte_count = 7; - mixed_count = 7; - upper_count = 5; - lower_count = 0; - chinese_count = 5; - break; - case GM_UPPER: - number_count = 5; - byte_count = 7; - mixed_count = 7; - upper_count = 0; - lower_count = 5; - chinese_count = 5; - break; - case GM_MIXED: - number_count = 10; - byte_count = 10; - mixed_count = 0; - upper_count = 10; - lower_count = 10; - chinese_count = 10; - break; - case GM_BYTE: - number_count = 4; - byte_count = 0; - mixed_count = 4; - upper_count = 4; - lower_count = 4; - chinese_count = 4; - break; - default: /* Start of symbol */ - number_count = 4; - byte_count = 4; - mixed_count = 4; - upper_count = 4; - lower_count = 4; - chinese_count = 4; - } + switch (current_mode) { + case GM_CHINESE: + number_count = 13; + byte_count = 13; + mixed_count = 13; + upper_count = 13; + lower_count = 13; + chinese_count = 0; + break; + case GM_NUMBER: + number_count = 0; + byte_count = 10; + mixed_count = 10; + upper_count = 10; + lower_count = 10; + chinese_count = 10; + break; + case GM_LOWER: + number_count = 5; + byte_count = 7; + mixed_count = 7; + upper_count = 5; + lower_count = 0; + chinese_count = 5; + break; + case GM_UPPER: + number_count = 5; + byte_count = 7; + mixed_count = 7; + upper_count = 0; + lower_count = 5; + chinese_count = 5; + break; + case GM_MIXED: + number_count = 10; + byte_count = 10; + mixed_count = 0; + upper_count = 10; + lower_count = 10; + chinese_count = 10; + break; + case GM_BYTE: + number_count = 4; + byte_count = 0; + mixed_count = 4; + upper_count = 4; + lower_count = 4; + chinese_count = 4; + break; + default: /* Start of symbol */ + number_count = 4; + byte_count = 4; + mixed_count = 4; + upper_count = 4; + lower_count = 4; + chinese_count = 4; + } - for(sp = position; (sp < length) && (sp <= (position + 8)); sp++) { + for (sp = position; (sp < length) && (sp <= (position + 8)); sp++) { - done = 0; + done = 0; - if(gbdata[sp] >= 0xff) { - byte_count += 17; - mixed_count += 23; - upper_count += 18; - lower_count += 18; - chinese_count += 13; - done = 1; - } + if (gbdata[sp] >= 0xff) { + byte_count += 17; + mixed_count += 23; + upper_count += 18; + lower_count += 18; + chinese_count += 13; + done = 1; + } - if((gbdata[sp] >= 'a') && (gbdata[sp] <= 'z')) { - byte_count += 8; - mixed_count += 6; - upper_count += 10; - lower_count += 5; - chinese_count += 13; - done = 1; - } + if ((gbdata[sp] >= 'a') && (gbdata[sp] <= 'z')) { + byte_count += 8; + mixed_count += 6; + upper_count += 10; + lower_count += 5; + chinese_count += 13; + done = 1; + } - if((gbdata[sp] >= 'A') && (gbdata[sp] <= 'Z')) { - byte_count += 8; - mixed_count += 6; - upper_count += 5; - lower_count += 10; - chinese_count += 13; - done = 1; - } + if ((gbdata[sp] >= 'A') && (gbdata[sp] <= 'Z')) { + byte_count += 8; + mixed_count += 6; + upper_count += 5; + lower_count += 10; + chinese_count += 13; + done = 1; + } - if((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) { - byte_count += 8; - mixed_count += 6; - upper_count += 8; - lower_count += 8; - chinese_count += 13; - done = 1; - } + if ((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) { + byte_count += 8; + mixed_count += 6; + upper_count += 8; + lower_count += 8; + chinese_count += 13; + done = 1; + } - if(gbdata[sp] == ' ') { - byte_count += 8; - mixed_count += 6; - upper_count += 5; - lower_count += 5; - chinese_count += 13; - done = 1; - } + if (gbdata[sp] == ' ') { + byte_count += 8; + mixed_count += 6; + upper_count += 5; + lower_count += 5; + chinese_count += 13; + done = 1; + } - if(done == 0) { - /* Control character */ - byte_count += 8; - mixed_count += 16; - upper_count += 13; - lower_count += 13; - chinese_count += 13; - } + if (done == 0) { + /* Control character */ + byte_count += 8; + mixed_count += 16; + upper_count += 13; + lower_count += 13; + chinese_count += 13; + } - if(gbdata[sp] >= 0x7f) { - mixed_count += 20; - upper_count += 20; - lower_count += 20; - } - } + if (gbdata[sp] >= 0x7f) { + mixed_count += 20; + upper_count += 20; + lower_count += 20; + } + } - /* Adjust for */ - for(sp = position; (sp < (length - 1)) && (sp <= (position + 7)); sp++) { - if((gbdata[sp] == 0x13) && (gbdata[sp+1] == 0x10)) { - chinese_count -= 13; - } - } + /* Adjust for */ + for (sp = position; (sp < (length - 1)) && (sp <= (position + 7)); sp++) { + if ((gbdata[sp] == 0x13) && (gbdata[sp + 1] == 0x10)) { + chinese_count -= 13; + } + } - /* Adjust for double digits */ - for(sp = position; (sp < (length - 1)) && (sp <= (position + 7)); sp++) { - if(sp != last) { - if(((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) && ((gbdata[sp + 1] >= '0') && (gbdata[sp + 1] <= '9'))) { - chinese_count -= 13; - last = sp + 1; - } - } - } + /* Adjust for double digits */ + for (sp = position; (sp < (length - 1)) && (sp <= (position + 7)); sp++) { + if (sp != last) { + if (((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) && ((gbdata[sp + 1] >= '0') && (gbdata[sp + 1] <= '9'))) { + chinese_count -= 13; + last = sp + 1; + } + } + } - /* Numeric mode is more complex */ - number_count += number_lat(gbdata, length, position); + /* Numeric mode is more complex */ + number_count += number_lat(gbdata, length, position); - if(debug) { printf("C %d / B %d / M %d / U %d / L %d / N %d\n", chinese_count, byte_count, mixed_count, upper_count, lower_count, number_count); } + if (debug) { + printf("C %d / B %d / M %d / U %d / L %d / N %d\n", chinese_count, byte_count, mixed_count, upper_count, lower_count, number_count); + } - best_count = chinese_count; - best_mode = GM_CHINESE; + best_count = chinese_count; + best_mode = GM_CHINESE; - if(byte_count <= best_count) { - best_count = byte_count; - best_mode = GM_BYTE; - } + if (byte_count <= best_count) { + best_count = byte_count; + best_mode = GM_BYTE; + } - if(mixed_count <= best_count) { - best_count = mixed_count; - best_mode = GM_MIXED; - } + if (mixed_count <= best_count) { + best_count = mixed_count; + best_mode = GM_MIXED; + } - if(upper_count <= best_count) { - best_count = upper_count; - best_mode = GM_UPPER; - } + if (upper_count <= best_count) { + best_count = upper_count; + best_mode = GM_UPPER; + } - if(lower_count <= best_count) { - best_count = lower_count; - best_mode = GM_LOWER; - } + if (lower_count <= best_count) { + best_count = lower_count; + best_mode = GM_LOWER; + } - if(number_count <= best_count) { - best_count = number_count; - best_mode = GM_NUMBER; - } + if (number_count <= best_count) { + best_count = number_count; + best_mode = GM_NUMBER; + } - return best_mode; + return best_mode; } -void add_byte_count(char binary[], int byte_count_posn, int byte_count) -{ - /* Add the length indicator for byte encoded blocks */ - if(byte_count & 0x100) { binary[byte_count_posn] = '0'; } else { binary[byte_count_posn] = '1'; } - if(byte_count & 0x80) { binary[byte_count_posn + 1] = '0'; } else { binary[byte_count_posn + 1] = '1'; } - if(byte_count & 0x40) { binary[byte_count_posn + 2] = '0'; } else { binary[byte_count_posn + 2] = '1'; } - if(byte_count & 0x20) { binary[byte_count_posn + 3] = '0'; } else { binary[byte_count_posn + 3] = '1'; } - if(byte_count & 0x10) { binary[byte_count_posn + 4] = '0'; } else { binary[byte_count_posn + 4] = '1'; } - if(byte_count & 0x08) { binary[byte_count_posn + 5] = '0'; } else { binary[byte_count_posn + 5] = '1'; } - if(byte_count & 0x04) { binary[byte_count_posn + 6] = '0'; } else { binary[byte_count_posn + 6] = '1'; } - if(byte_count & 0x02) { binary[byte_count_posn + 7] = '0'; } else { binary[byte_count_posn + 7] = '1'; } - if(byte_count & 0x01) { binary[byte_count_posn + 8] = '0'; } else { binary[byte_count_posn + 8] = '1'; } +/* Add the length indicator for byte encoded blocks */ +void add_byte_count(char binary[], int byte_count_posn, int byte_count) { + for (int p = 0; p < 8; p++) { + if (byte_count & (0x100 >> p)) { + binary[byte_count_posn + p] = '0'; + } else { + binary[byte_count_posn + p] = '1'; + } + } } -void add_shift_char(char binary[], int shifty) -{ - /* Add a control character to the data stream */ - int i, debug = 0; - int glyph = 0; +/* Add a control character to the data stream */ +void add_shift_char(char binary[], int shifty) { + int i, debug = 0; + int glyph = 0; - for(i = 0; i < 64; i++) { - if(shift_set[i] == shifty) { - glyph = i; - } - } + for (i = 0; i < 64; i++) { + if (shift_set[i] == shifty) { + glyph = i; + } + } - if(debug) { printf("SHIFT [%d] ", glyph); } - - if(glyph & 0x20) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x10) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x08) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x04) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x02) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x01) { concat(binary, "1"); } else { concat(binary, "0"); } + if (debug) { + printf("SHIFT [%d] ", glyph); + } + + for (int p = 0; p < 6; p++) { + if (glyph & (0x20 >> p)) { + concat(binary, "1"); + } else { + concat(binary, "0"); + } + } } -int gm_encode(int gbdata[], int length, char binary[], int reader) -{ - /* Create a binary stream representation of the input data. - 7 sets are defined - Chinese characters, Numerals, Lower case letters, Upper case letters, - Mixed numerals and latters, Control characters and 8-bit binary data */ - int sp, current_mode, next_mode, last_mode, glyph = 0; - int c1, c2, done; - int p = 0, ppos; - int numbuf[3], punt = 0; - int number_pad_posn, debug = 0; - int byte_count_posn = 0, byte_count = 0; - int shift, i; +int gm_encode(int gbdata[], int length, char binary[], int reader) { + /* Create a binary stream representation of the input data. + 7 sets are defined - Chinese characters, Numerals, Lower case letters, Upper case letters, + Mixed numerals and latters, Control characters and 8-bit binary data */ + int sp, current_mode, next_mode, last_mode, glyph = 0; + int c1, c2, done; + int p = 0, ppos; + int numbuf[3], punt = 0; + int number_pad_posn, debug = 0; + int byte_count_posn = 0, byte_count = 0; + int shift, i; - strcpy(binary, ""); + strcpy(binary, ""); - sp = 0; - current_mode = 0; - last_mode = 0; - number_pad_posn = 0; + sp = 0; + current_mode = 0; + last_mode = 0; + number_pad_posn = 0; - if(reader) { - concat(binary, "1010"); /* FNC3 - Reader Initialisation */ - } + if (reader) { + concat(binary, "1010"); /* FNC3 - Reader Initialisation */ + } - do { - next_mode = seek_forward(gbdata, length, sp, current_mode); + do { + next_mode = seek_forward(gbdata, length, sp, current_mode); - if(next_mode != current_mode) { - switch(current_mode) { - case 0: - switch(next_mode) { - case GM_CHINESE: concat(binary, "0001"); break; - case GM_NUMBER: concat(binary, "0010"); break; - case GM_LOWER: concat(binary, "0011"); break; - case GM_UPPER: concat(binary, "0100"); break; - case GM_MIXED: concat(binary, "0101"); break; - case GM_BYTE: concat(binary, "0111"); break; - } - break; - case GM_CHINESE: - switch(next_mode) { - case GM_NUMBER: concat(binary, "1111111100001"); break; // 8161 - case GM_LOWER: concat(binary, "1111111100010"); break; // 8162 - case GM_UPPER: concat(binary, "1111111100011"); break; // 8163 - case GM_MIXED: concat(binary, "1111111100100"); break; // 8164 - case GM_BYTE: concat(binary, "1111111100101"); break; // 8165 - } - break; - case GM_NUMBER: - /* add numeric block padding value */ - switch(p) { - case 1: binary[number_pad_posn] = '1'; binary[number_pad_posn + 1] = '0'; break; // 2 pad digits - case 2: binary[number_pad_posn] = '0'; binary[number_pad_posn + 1] = '1'; break; // 1 pad digit - case 3: binary[number_pad_posn] = '0'; binary[number_pad_posn + 1] = '0'; break; // 0 pad digits - } - switch(next_mode) { - case GM_CHINESE: concat(binary, "1111111011"); break; // 1019 - case GM_LOWER: concat(binary, "1111111100"); break; // 1020 - case GM_UPPER: concat(binary, "1111111101"); break; // 1021 - case GM_MIXED: concat(binary, "1111111110"); break; // 1022 - case GM_BYTE: concat(binary, "1111111111"); break; // 1023 - } - break; - case GM_LOWER: - case GM_UPPER: - switch(next_mode) { - case GM_CHINESE: concat(binary, "11100"); break; // 28 - case GM_NUMBER: concat(binary, "11101"); break; // 29 - case GM_LOWER: - case GM_UPPER: concat(binary, "11110"); break; // 30 - case GM_MIXED: concat(binary, "1111100"); break; // 124 - case GM_BYTE: concat(binary, "1111110"); break; // 126 - } - break; - case GM_MIXED: - switch(next_mode) { - case GM_CHINESE: concat(binary, "1111110001"); break; // 1009 - case GM_NUMBER: concat(binary, "1111110010"); break; // 1010 - case GM_LOWER: concat(binary, "1111110011"); break; // 1011 - case GM_UPPER: concat(binary, "1111110100"); break; // 1012 - case GM_BYTE: concat(binary, "1111110111"); break; // 1015 - } - break; - case GM_BYTE: - /* add byte block length indicator */ - add_byte_count(binary, byte_count_posn, byte_count); - byte_count = 0; - switch(next_mode) { - case GM_CHINESE: concat(binary, "0001"); break; // 1 - case GM_NUMBER: concat(binary, "0010"); break; // 2 - case GM_LOWER: concat(binary, "0011"); break; // 3 - case GM_UPPER: concat(binary, "0100"); break; // 4 - case GM_MIXED: concat(binary, "0101"); break; // 5 - } - break; - } - if(debug) { - switch(next_mode) { - case GM_CHINESE: printf("CHIN "); break; - case GM_NUMBER: printf("NUMB "); break; - case GM_LOWER: printf("LOWR "); break; - case GM_UPPER: printf("UPPR "); break; - case GM_MIXED: printf("MIXD "); break; - case GM_BYTE: printf("BYTE "); break; - } - } - } - last_mode = current_mode; - current_mode = next_mode; + if (next_mode != current_mode) { + switch (current_mode) { + case 0: + switch (next_mode) { + case GM_CHINESE: concat(binary, "0001"); + break; + case GM_NUMBER: concat(binary, "0010"); + break; + case GM_LOWER: concat(binary, "0011"); + break; + case GM_UPPER: concat(binary, "0100"); + break; + case GM_MIXED: concat(binary, "0101"); + break; + case GM_BYTE: concat(binary, "0111"); + break; + } + break; + case GM_CHINESE: + switch (next_mode) { + case GM_NUMBER: concat(binary, "1111111100001"); + break; // 8161 + case GM_LOWER: concat(binary, "1111111100010"); + break; // 8162 + case GM_UPPER: concat(binary, "1111111100011"); + break; // 8163 + case GM_MIXED: concat(binary, "1111111100100"); + break; // 8164 + case GM_BYTE: concat(binary, "1111111100101"); + break; // 8165 + } + break; + case GM_NUMBER: + /* add numeric block padding value */ + switch (p) { + case 1: binary[number_pad_posn] = '1'; + binary[number_pad_posn + 1] = '0'; + break; // 2 pad digits + case 2: binary[number_pad_posn] = '0'; + binary[number_pad_posn + 1] = '1'; + break; // 1 pad digit + case 3: binary[number_pad_posn] = '0'; + binary[number_pad_posn + 1] = '0'; + break; // 0 pad digits + } + switch (next_mode) { + case GM_CHINESE: concat(binary, "1111111011"); + break; // 1019 + case GM_LOWER: concat(binary, "1111111100"); + break; // 1020 + case GM_UPPER: concat(binary, "1111111101"); + break; // 1021 + case GM_MIXED: concat(binary, "1111111110"); + break; // 1022 + case GM_BYTE: concat(binary, "1111111111"); + break; // 1023 + } + break; + case GM_LOWER: + case GM_UPPER: + switch (next_mode) { + case GM_CHINESE: concat(binary, "11100"); + break; // 28 + case GM_NUMBER: concat(binary, "11101"); + break; // 29 + case GM_LOWER: + case GM_UPPER: concat(binary, "11110"); + break; // 30 + case GM_MIXED: concat(binary, "1111100"); + break; // 124 + case GM_BYTE: concat(binary, "1111110"); + break; // 126 + } + break; + case GM_MIXED: + switch (next_mode) { + case GM_CHINESE: concat(binary, "1111110001"); + break; // 1009 + case GM_NUMBER: concat(binary, "1111110010"); + break; // 1010 + case GM_LOWER: concat(binary, "1111110011"); + break; // 1011 + case GM_UPPER: concat(binary, "1111110100"); + break; // 1012 + case GM_BYTE: concat(binary, "1111110111"); + break; // 1015 + } + break; + case GM_BYTE: + /* add byte block length indicator */ + add_byte_count(binary, byte_count_posn, byte_count); + byte_count = 0; + switch (next_mode) { + case GM_CHINESE: concat(binary, "0001"); + break; // 1 + case GM_NUMBER: concat(binary, "0010"); + break; // 2 + case GM_LOWER: concat(binary, "0011"); + break; // 3 + case GM_UPPER: concat(binary, "0100"); + break; // 4 + case GM_MIXED: concat(binary, "0101"); + break; // 5 + } + break; + } + if (debug) { + switch (next_mode) { + case GM_CHINESE: printf("CHIN "); + break; + case GM_NUMBER: printf("NUMB "); + break; + case GM_LOWER: printf("LOWR "); + break; + case GM_UPPER: printf("UPPR "); + break; + case GM_MIXED: printf("MIXD "); + break; + case GM_BYTE: printf("BYTE "); + break; + } + } + } + last_mode = current_mode; + current_mode = next_mode; - switch(current_mode) { - case GM_CHINESE: - done = 0; - if(gbdata[sp] > 0xff) { - /* GB2312 character */ - c1 = (gbdata[sp] & 0xff00) >> 8; - c2 = gbdata[sp] & 0xff; + switch (current_mode) { + case GM_CHINESE: + done = 0; + if (gbdata[sp] > 0xff) { + /* GB2312 character */ + c1 = (gbdata[sp] & 0xff00) >> 8; + c2 = gbdata[sp] & 0xff; - if((c1 >= 0xa0) && (c1 <= 0xa9)) { - glyph = (0x60 * (c1 - 0xa1)) + (c2 - 0xa0); - } - if((c1 >= 0xb0) && (c1 <= 0xf7)) { - glyph = (0x60 * (c1 - 0xb0 + 9)) + (c2 - 0xa0); - } - done = 1; - } - if(!(done)) { - if(sp != (length - 1)) { - if((gbdata[sp] == 0x13) && (gbdata[sp + 1] == 0x10)) { - /* End of Line */ - glyph = 7776; - sp++; - } - done = 1; - } - } - if(!(done)) { - if(sp != (length - 1)) { - if(((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) && - ((gbdata[sp + 1] >= '0') && (gbdata[sp + 1] <= '9'))) { - /* Two digits */ - glyph = 8033 + (10 * (gbdata[sp] - '0')) + (gbdata[sp + 1] - '0'); - sp++; - } - } - } - if(!(done)) { - /* Byte value */ - glyph = 7777 + gbdata[sp]; - } + if ((c1 >= 0xa0) && (c1 <= 0xa9)) { + glyph = (0x60 * (c1 - 0xa1)) + (c2 - 0xa0); + } + if ((c1 >= 0xb0) && (c1 <= 0xf7)) { + glyph = (0x60 * (c1 - 0xb0 + 9)) + (c2 - 0xa0); + } + done = 1; + } + if (!(done)) { + if (sp != (length - 1)) { + if ((gbdata[sp] == 0x13) && (gbdata[sp + 1] == 0x10)) { + /* End of Line */ + glyph = 7776; + sp++; + } + done = 1; + } + } + if (!(done)) { + if (sp != (length - 1)) { + if (((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) && + ((gbdata[sp + 1] >= '0') && (gbdata[sp + 1] <= '9'))) { + /* Two digits */ + glyph = 8033 + (10 * (gbdata[sp] - '0')) + (gbdata[sp + 1] - '0'); + sp++; + } + } + } + if (!(done)) { + /* Byte value */ + glyph = 7777 + gbdata[sp]; + } - if(debug) { printf("[%d] ", glyph); } - - if(glyph & 0x1000) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x800) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x400) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x200) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x100) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x80) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x40) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x20) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x10) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x08) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x04) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x02) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x01) { concat(binary, "1"); } else { concat(binary, "0"); } - sp++; - break; + if (debug) { + printf("[%d] ", glyph); + } - case GM_NUMBER: - if(last_mode != current_mode) { - /* Reserve a space for numeric digit padding value (2 bits) */ - number_pad_posn = strlen(binary); - concat(binary, "XX"); - } - p = 0; - ppos = -1; + for (int p = 0; p < 13; p++) { + if (glyph & (0x1000 >> p)) { + concat(binary, "1"); + } else { + concat(binary, "0"); + } + } + sp++; + break; - /* Numeric compression can also include certain combinations of - non-numeric character */ + case GM_NUMBER: + if (last_mode != current_mode) { + /* Reserve a space for numeric digit padding value (2 bits) */ + number_pad_posn = strlen(binary); + concat(binary, "XX"); + } + p = 0; + ppos = -1; - numbuf[0] = '0'; - numbuf[1] = '0'; - numbuf[2] = '0'; - do { - if((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) { - numbuf[p] = gbdata[sp]; - sp++; - p++; - } - switch(gbdata[sp]) { - case ' ': - case '+': - case '-': - case '.': - case ',': - punt = gbdata[sp]; - sp++; - ppos = p; - break; - } - if(sp < (length - 1)) { - if((gbdata[sp] == 0x13) && (gbdata[sp + 1] == 0x10)) { - /* */ - punt = gbdata[sp]; - sp += 2; - ppos = p; - } - } - } while ((p < 3) && (sp < length)); + /* Numeric compression can also include certain combinations of + non-numeric character */ - if(ppos != -1) { - switch(punt) { - case ' ': glyph = 0; break; - case '+': glyph = 3; break; - case '-': glyph = 6; break; - case '.': glyph = 9; break; - case ',': glyph = 12; break; - case 0x13: glyph = 15; break; - } - glyph += ppos; - glyph += 1000; + numbuf[0] = '0'; + numbuf[1] = '0'; + numbuf[2] = '0'; + do { + if ((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) { + numbuf[p] = gbdata[sp]; + sp++; + p++; + } + switch (gbdata[sp]) { + case ' ': + case '+': + case '-': + case '.': + case ',': + punt = gbdata[sp]; + sp++; + ppos = p; + break; + } + if (sp < (length - 1)) { + if ((gbdata[sp] == 0x13) && (gbdata[sp + 1] == 0x10)) { + /* */ + punt = gbdata[sp]; + sp += 2; + ppos = p; + } + } + } while ((p < 3) && (sp < length)); - if(debug) { printf("[%d] ", glyph); } - - if(glyph & 0x200) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x100) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x80) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x40) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x20) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x10) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x08) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x04) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x02) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x01) { concat(binary, "1"); } else { concat(binary, "0"); } - } + if (ppos != -1) { + switch (punt) { + case ' ': glyph = 0; + break; + case '+': glyph = 3; + break; + case '-': glyph = 6; + break; + case '.': glyph = 9; + break; + case ',': glyph = 12; + break; + case 0x13: glyph = 15; + break; + } + glyph += ppos; + glyph += 1000; - glyph = (100 * (numbuf[0] - '0')) + (10 * (numbuf[1] - '0')) + (numbuf[2] - '0'); - if(debug) { printf("[%d] ", glyph); } - - if(glyph & 0x200) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x100) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x80) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x40) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x20) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x10) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x08) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x04) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x02) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x01) { concat(binary, "1"); } else { concat(binary, "0"); } - break; + if (debug) { + printf("[%d] ", glyph); + } - case GM_BYTE: - if(last_mode != current_mode) { - /* Reserve space for byte block length indicator (9 bits) */ - byte_count_posn = strlen(binary); - concat(binary, "LLLLLLLLL"); - } - if(byte_count == 512) { - /* Maximum byte block size is 512 bytes. If longer is needed then start a new block */ - add_byte_count(binary, byte_count_posn, byte_count); - concat(binary, "0111"); - byte_count_posn = strlen(binary); - concat(binary, "LLLLLLLLL"); - byte_count = 0; - } + for (int p = 0; p < 10; p++) { + if (glyph & (0x200 >> p)) { + concat(binary, "1"); + } else { + concat(binary, "0"); + } + } + } - glyph = gbdata[sp]; - if(debug) { printf("[%d] ", glyph); } - if(glyph & 0x80) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x40) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x20) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x10) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x08) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x04) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x02) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x01) { concat(binary, "1"); } else { concat(binary, "0"); } - sp++; - byte_count++; - break; + glyph = (100 * (numbuf[0] - '0')) + (10 * (numbuf[1] - '0')) + (numbuf[2] - '0'); + if (debug) { + printf("[%d] ", glyph); + } - case GM_MIXED: - shift = 1; - if((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) { shift = 0; } - if((gbdata[sp] >= 'A') && (gbdata[sp] <= 'Z')) { shift = 0; } - if((gbdata[sp] >= 'a') && (gbdata[sp] <= 'z')) { shift = 0; } - if(gbdata[sp] == ' ') { shift = 0; } + for (int p = 0; p < 10; p++) { + if (glyph & (0x200 >> p)) { + concat(binary, "1"); + } else { + concat(binary, "0"); + } + } + break; - if(shift == 0) { - /* Mixed Mode character */ - glyph = posn(EUROPIUM, gbdata[sp]); - if(debug) { printf("[%d] ", glyph); } - - if(glyph & 0x20) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x10) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x08) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x04) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x02) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x01) { concat(binary, "1"); } else { concat(binary, "0"); } - } else { - /* Shift Mode character */ - concat(binary, "1111110110"); /* 1014 - shift indicator */ - add_shift_char(binary, gbdata[sp]); - } + case GM_BYTE: + if (last_mode != current_mode) { + /* Reserve space for byte block length indicator (9 bits) */ + byte_count_posn = strlen(binary); + concat(binary, "LLLLLLLLL"); + } + if (byte_count == 512) { + /* Maximum byte block size is 512 bytes. If longer is needed then start a new block */ + add_byte_count(binary, byte_count_posn, byte_count); + concat(binary, "0111"); + byte_count_posn = strlen(binary); + concat(binary, "LLLLLLLLL"); + byte_count = 0; + } - sp++; - break; + glyph = gbdata[sp]; + if (debug) { + printf("[%d] ", glyph); + } + for (int p = 0; p < 8; p++) { + if (glyph & (0x80 >> p)) { + concat(binary, "1"); + } else { + concat(binary, "0"); + } + } + sp++; + byte_count++; + break; - case GM_UPPER: - shift = 1; - if((gbdata[sp] >= 'A') && (gbdata[sp] <= 'Z')) { shift = 0; } - if(gbdata[sp] == ' ') { shift = 0; } + case GM_MIXED: + shift = 1; + if ((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) { + shift = 0; + } + if ((gbdata[sp] >= 'A') && (gbdata[sp] <= 'Z')) { + shift = 0; + } + if ((gbdata[sp] >= 'a') && (gbdata[sp] <= 'z')) { + shift = 0; + } + if (gbdata[sp] == ' ') { + shift = 0; + } - if(shift == 0) { - /* Upper Case character */ - glyph = posn("ABCDEFGHIJKLMNOPQRSTUVWXYZ ", gbdata[sp]); - if(debug) { printf("[%d] ", glyph); } - - if(glyph & 0x10) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x08) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x04) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x02) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x01) { concat(binary, "1"); } else { concat(binary, "0"); } - } else { - /* Shift Mode character */ - concat(binary, "1111101"); /* 127 - shift indicator */ - add_shift_char(binary, gbdata[sp]); - } + if (shift == 0) { + /* Mixed Mode character */ + glyph = posn(EUROPIUM, gbdata[sp]); + if (debug) { + printf("[%d] ", glyph); + } - sp++; - break; - - case GM_LOWER: - shift = 1; - if((gbdata[sp] >= 'a') && (gbdata[sp] <= 'z')) { shift = 0; } - if(gbdata[sp] == ' ') { shift = 0; } + for (int p = 0; p < 6; p++) { + if (glyph & (0x20 >> p)) { + concat(binary, "1"); + } else { + concat(binary, "0"); + } + } + } else { + /* Shift Mode character */ + concat(binary, "1111110110"); /* 1014 - shift indicator */ + add_shift_char(binary, gbdata[sp]); + } - if(shift == 0) { - /* Lower Case character */ - glyph = posn("abcdefghijklmnopqrstuvwxyz ", gbdata[sp]); - if(debug) { printf("[%d] ", glyph); } - - if(glyph & 0x10) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x08) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x04) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x02) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x01) { concat(binary, "1"); } else { concat(binary, "0"); } - } else { - /* Shift Mode character */ - concat(binary, "1111101"); /* 127 - shift indicator */ - add_shift_char(binary, gbdata[sp]); - } + sp++; + break; - sp++; - break; - } - if(strlen(binary) > 9191) { - return ZINT_ERROR_TOO_LONG; - } + case GM_UPPER: + shift = 1; + if ((gbdata[sp] >= 'A') && (gbdata[sp] <= 'Z')) { + shift = 0; + } + if (gbdata[sp] == ' ') { + shift = 0; + } - } while(sp < length); + if (shift == 0) { + /* Upper Case character */ + glyph = posn("ABCDEFGHIJKLMNOPQRSTUVWXYZ ", gbdata[sp]); + if (debug) { + printf("[%d] ", glyph); + } - if(current_mode == GM_NUMBER) { - /* add numeric block padding value */ - switch(p) { - case 1: binary[number_pad_posn] = '1'; binary[number_pad_posn + 1] = '0'; break; // 2 pad digits - case 2: binary[number_pad_posn] = '0'; binary[number_pad_posn + 1] = '1'; break; // 1 pad digit - case 3: binary[number_pad_posn] = '0'; binary[number_pad_posn + 1] = '0'; break; // 0 pad digits - } - } + for (int p = 0; p < 5; p++) { + if (glyph & (0x10 >> p)) { + concat(binary, "1"); + } else { + concat(binary, "0"); + } + } + } else { + /* Shift Mode character */ + concat(binary, "1111101"); /* 127 - shift indicator */ + add_shift_char(binary, gbdata[sp]); + } - if(current_mode == GM_BYTE) { - /* Add byte block length indicator */ - add_byte_count(binary, byte_count_posn, byte_count); - } + sp++; + break; - /* Add "end of data" character */ - switch(current_mode) { - case GM_CHINESE: concat(binary, "1111111100000"); break; // 8160 - case GM_NUMBER: concat(binary, "1111111010"); break; // 1018 - case GM_LOWER: - case GM_UPPER: concat(binary, "11011"); break; // 27 - case GM_MIXED: concat(binary, "1111110000"); break; // 1008 - case GM_BYTE: concat(binary, "0000"); break; // 0 - } + case GM_LOWER: + shift = 1; + if ((gbdata[sp] >= 'a') && (gbdata[sp] <= 'z')) { + shift = 0; + } + if (gbdata[sp] == ' ') { + shift = 0; + } - /* Add padding bits if required */ - p = 7 - (strlen(binary) % 7); - if(p == 7) { p = 0; } - for(i = 0; i < p; i++) { - concat(binary, "0"); - } + if (shift == 0) { + /* Lower Case character */ + glyph = posn("abcdefghijklmnopqrstuvwxyz ", gbdata[sp]); + if (debug) { + printf("[%d] ", glyph); + } - if(strlen(binary) > 9191) { - return ZINT_ERROR_TOO_LONG; - } - return 0; + for (int p = 0; p < 5; p++) { + if (glyph & (0x10 >> p)) { + concat(binary, "1"); + } else { + concat(binary, "0"); + } + } + } else { + /* Shift Mode character */ + concat(binary, "1111101"); /* 127 - shift indicator */ + add_shift_char(binary, gbdata[sp]); + } + + sp++; + break; + } + if (strlen(binary) > 9191) { + return ZINT_ERROR_TOO_LONG; + } + + } while (sp < length); + + if (current_mode == GM_NUMBER) { + /* add numeric block padding value */ + switch (p) { + case 1: binary[number_pad_posn] = '1'; + binary[number_pad_posn + 1] = '0'; + break; // 2 pad digits + case 2: binary[number_pad_posn] = '0'; + binary[number_pad_posn + 1] = '1'; + break; // 1 pad digit + case 3: binary[number_pad_posn] = '0'; + binary[number_pad_posn + 1] = '0'; + break; // 0 pad digits + } + } + + if (current_mode == GM_BYTE) { + /* Add byte block length indicator */ + add_byte_count(binary, byte_count_posn, byte_count); + } + + /* Add "end of data" character */ + switch (current_mode) { + case GM_CHINESE: concat(binary, "1111111100000"); + break; // 8160 + case GM_NUMBER: concat(binary, "1111111010"); + break; // 1018 + case GM_LOWER: + case GM_UPPER: concat(binary, "11011"); + break; // 27 + case GM_MIXED: concat(binary, "1111110000"); + break; // 1008 + case GM_BYTE: concat(binary, "0000"); + break; // 0 + } + + /* Add padding bits if required */ + p = 7 - (strlen(binary) % 7); + if (p == 7) { + p = 0; + } + for (i = 0; i < p; i++) { + concat(binary, "0"); + } + + if (strlen(binary) > 9191) { + return ZINT_ERROR_TOO_LONG; + } + return 0; } -void gm_add_ecc(char binary[], int data_posn, int layers, int ecc_level, int word[]) -{ - int data_cw, i, j, wp; - int n1, b1, n2, b2, e1, b3, e2; - int block_size, data_size, ecc_size; - int data[1320], block[130]; - unsigned char data_block[115], ecc_block[70]; +void gm_add_ecc(char binary[], int data_posn, int layers, int ecc_level, int word[]) { + int data_cw, i, j, wp; + int n1, b1, n2, b2, e1, b3, e2; + int block_size, data_size, ecc_size; + int data[1320], block[130]; + unsigned char data_block[115], ecc_block[70]; - data_cw = gm_data_codewords[((layers - 1) * 5) + (ecc_level - 1)]; + data_cw = gm_data_codewords[((layers - 1) * 5) + (ecc_level - 1)]; - for(i = 0; i < 1320; i++) { - data[i] = 0; - } + for (i = 0; i < 1320; i++) { + data[i] = 0; + } - /* Convert from binary sream to 7-bit codewords */ - for(i = 0; i < data_posn; i++) { - if(binary[i * 7] == '1') { data[i] += 0x40; } - if(binary[(i * 7) + 1] == '1') { data[i] += 0x20; } - if(binary[(i * 7) + 2] == '1') { data[i] += 0x10; } - if(binary[(i * 7) + 3] == '1') { data[i] += 0x08; } - if(binary[(i * 7) + 4] == '1') { data[i] += 0x04; } - if(binary[(i * 7) + 5] == '1') { data[i] += 0x02; } - if(binary[(i * 7) + 6] == '1') { data[i] += 0x01; } - } + /* Convert from binary sream to 7-bit codewords */ + for (i = 0; i < data_posn; i++) { + for (int p = 0; p < 7; p++) { + if (binary[i * 7 + p] == '1') { + data[i] += (0x40 >> p); + } + } + } - /* Add padding codewords */ - data[data_posn] = 0x00; - for(i = (data_posn + 1); i < data_cw; i++) { - if(i & 1) { - data[i] = 0x7e; - } else { - data[i] = 0x00; - } - } + /* Add padding codewords */ + data[data_posn] = 0x00; + for (i = (data_posn + 1); i < data_cw; i++) { + if (i & 1) { + data[i] = 0x7e; + } else { + data[i] = 0x00; + } + } - /* Get block sizes */ - n1 = gm_n1[(layers - 1)]; - b1 = gm_b1[(layers - 1)]; - n2 = n1 - 1; - b2 = gm_b2[(layers - 1)]; - e1 = gm_ebeb[((layers - 1) * 20) + ((ecc_level - 1) * 4)]; - b3 = gm_ebeb[((layers - 1) * 20) + ((ecc_level - 1) * 4) + 1]; - e2 = gm_ebeb[((layers - 1) * 20) + ((ecc_level - 1) * 4) + 2]; + /* Get block sizes */ + n1 = gm_n1[(layers - 1)]; + b1 = gm_b1[(layers - 1)]; + n2 = n1 - 1; + b2 = gm_b2[(layers - 1)]; + e1 = gm_ebeb[((layers - 1) * 20) + ((ecc_level - 1) * 4)]; + b3 = gm_ebeb[((layers - 1) * 20) + ((ecc_level - 1) * 4) + 1]; + e2 = gm_ebeb[((layers - 1) * 20) + ((ecc_level - 1) * 4) + 2]; - /* Split the data into blocks */ - wp = 0; - for(i = 0; i < (b1 + b2); i++) { - if(i < b1) { block_size = n1; } else { block_size = n2; } - if(i < b3) { ecc_size = e1; } else { ecc_size = e2; } - data_size = block_size - ecc_size; + /* Split the data into blocks */ + wp = 0; + for (i = 0; i < (b1 + b2); i++) { + if (i < b1) { + block_size = n1; + } else { + block_size = n2; + } + if (i < b3) { + ecc_size = e1; + } else { + ecc_size = e2; + } + data_size = block_size - ecc_size; - /* printf("block %d/%d: data %d / ecc %d\n", i + 1, (b1 + b2), data_size, ecc_size);*/ + /* printf("block %d/%d: data %d / ecc %d\n", i + 1, (b1 + b2), data_size, ecc_size);*/ - for(j = 0; j < data_size; j++) { - data_block[j] = data[wp]; - wp++; - } + for (j = 0; j < data_size; j++) { + data_block[j] = data[wp]; + wp++; + } - /* Calculate ECC data for this block */ - rs_init_gf(0x89); - rs_init_code(ecc_size, 1); - rs_encode(data_size, data_block, ecc_block); - rs_free(); + /* Calculate ECC data for this block */ + rs_init_gf(0x89); + rs_init_code(ecc_size, 1); + rs_encode(data_size, data_block, ecc_block); + rs_free(); - /* Correct error correction data but in reverse order */ - for(j = 0; j < data_size; j++) { - block[j] = data_block[j]; - } - for(j = 0; j < ecc_size; j++) { - block[(j + data_size)] = ecc_block[ecc_size - j - 1]; - } + /* Correct error correction data but in reverse order */ + for (j = 0; j < data_size; j++) { + block[j] = data_block[j]; + } + for (j = 0; j < ecc_size; j++) { + block[(j + data_size)] = ecc_block[ecc_size - j - 1]; + } - for(j = 0; j < n2; j++) { - word[((b1 + b2) * j) + i] = block[j]; - } - if(block_size == n1) { - word[((b1 + b2) * (n1 - 1)) + i] = block[(n1 - 1)]; - } - } + for (j = 0; j < n2; j++) { + word[((b1 + b2) * j) + i] = block[j]; + } + if (block_size == n1) { + word[((b1 + b2) * (n1 - 1)) + i] = block[(n1 - 1)]; + } + } } -void place_macromodule(char grid[], int x, int y, int word1, int word2, int size) -{ - int i, j; +void place_macromodule(char grid[], int x, int y, int word1, int word2, int size) { + int i, j; - i = (x * 6) + 1; - j = (y * 6) + 1; + i = (x * 6) + 1; + j = (y * 6) + 1; - if(word2 & 0x40) { grid[(j * size) + i + 2] = '1'; } - if(word2 & 0x20) { grid[(j * size) + i + 3] = '1'; } - if(word2 & 0x10) { grid[((j + 1) * size) + i] = '1'; } - if(word2 & 0x08) { grid[((j + 1) * size) + i + 1] = '1'; } - if(word2 & 0x04) { grid[((j + 1) * size) + i + 2] = '1'; } - if(word2 & 0x02) { grid[((j + 1) * size) + i + 3] = '1'; } - if(word2 & 0x01) { grid[((j + 2) * size) + i] = '1'; } - if(word1 & 0x40) { grid[((j + 2) * size) + i + 1] = '1'; } - if(word1 & 0x20) { grid[((j + 2) * size) + i + 2] = '1'; } - if(word1 & 0x10) { grid[((j + 2) * size) + i + 3] = '1'; } - if(word1 & 0x08) { grid[((j + 3) * size) + i] = '1'; } - if(word1 & 0x04) { grid[((j + 3) * size) + i + 1] = '1'; } - if(word1 & 0x02) { grid[((j + 3) * size) + i + 2] = '1'; } - if(word1 & 0x01) { grid[((j + 3) * size) + i + 3] = '1'; } + if (word2 & 0x40) { + grid[(j * size) + i + 2] = '1'; + } + if (word2 & 0x20) { + grid[(j * size) + i + 3] = '1'; + } + if (word2 & 0x10) { + grid[((j + 1) * size) + i] = '1'; + } + if (word2 & 0x08) { + grid[((j + 1) * size) + i + 1] = '1'; + } + if (word2 & 0x04) { + grid[((j + 1) * size) + i + 2] = '1'; + } + if (word2 & 0x02) { + grid[((j + 1) * size) + i + 3] = '1'; + } + if (word2 & 0x01) { + grid[((j + 2) * size) + i] = '1'; + } + if (word1 & 0x40) { + grid[((j + 2) * size) + i + 1] = '1'; + } + if (word1 & 0x20) { + grid[((j + 2) * size) + i + 2] = '1'; + } + if (word1 & 0x10) { + grid[((j + 2) * size) + i + 3] = '1'; + } + if (word1 & 0x08) { + grid[((j + 3) * size) + i] = '1'; + } + if (word1 & 0x04) { + grid[((j + 3) * size) + i + 1] = '1'; + } + if (word1 & 0x02) { + grid[((j + 3) * size) + i + 2] = '1'; + } + if (word1 & 0x01) { + grid[((j + 3) * size) + i + 3] = '1'; + } } -void place_data_in_grid(int word[], char grid[], int modules, int size) -{ - int x, y, macromodule, offset; +void place_data_in_grid(int word[], char grid[], int modules, int size) { + int x, y, macromodule, offset; - offset = 13 - ((modules - 1) / 2); - for(y = 0; y < modules; y++) { - for(x = 0; x < modules; x++) { - macromodule = gm_macro_matrix[((y + offset) * 27) + (x + offset)]; - place_macromodule(grid, x, y, word[macromodule * 2], word[(macromodule * 2) + 1], size); - } - } + offset = 13 - ((modules - 1) / 2); + for (y = 0; y < modules; y++) { + for (x = 0; x < modules; x++) { + macromodule = gm_macro_matrix[((y + offset) * 27) + (x + offset)]; + place_macromodule(grid, x, y, word[macromodule * 2], word[(macromodule * 2) + 1], size); + } + } } -void place_layer_id(char* grid, int size, int layers, int modules, int ecc_level) -{ - /* Place the layer ID into each macromodule */ +/* Place the layer ID into each macromodule */ +void place_layer_id(char* grid, int size, int layers, int modules, int ecc_level) { + int i, j, layer, start, stop; - int i, j, layer, start, stop; - #ifndef _MSC_VER - int layerid[layers + 1]; - int id[modules * modules]; + int layerid[layers + 1]; + int id[modules * modules]; #else - int* layerid = (int *)_alloca((layers + 1) * sizeof(int)); - int* id = (int *)_alloca((modules * modules) * sizeof(int)); + int* layerid = (int *) _alloca((layers + 1) * sizeof (int)); + int* id = (int *) _alloca((modules * modules) * sizeof (int)); #endif - /* Calculate Layer IDs */ - for(i = 0; i <= layers; i++) { - if(ecc_level == 1) { - layerid[i] = 3 - (i % 4); - } else { - layerid[i] = (i + 5 - ecc_level) % 4; - } - } + /* Calculate Layer IDs */ + for (i = 0; i <= layers; i++) { + if (ecc_level == 1) { + layerid[i] = 3 - (i % 4); + } else { + layerid[i] = (i + 5 - ecc_level) % 4; + } + } - for(i = 0; i < modules; i++) { - for(j = 0; j < modules; j++) { - id[(i * modules) + j] = 0; - } - } + for (i = 0; i < modules; i++) { + for (j = 0; j < modules; j++) { + id[(i * modules) + j] = 0; + } + } - /* Calculate which value goes in each macromodule */ - start = modules / 2; - stop = modules / 2; - for(layer = 0; layer <= layers; layer++) { - for(i = start; i <= stop; i++) { - id[(start * modules) + i] = layerid[layer]; - id[(i * modules) + start] = layerid[layer]; - id[((modules - start - 1) * modules) + i] = layerid[layer]; - id[(i * modules) + (modules - start - 1)] = layerid[layer]; - } - start--; - stop++; - } + /* Calculate which value goes in each macromodule */ + start = modules / 2; + stop = modules / 2; + for (layer = 0; layer <= layers; layer++) { + for (i = start; i <= stop; i++) { + id[(start * modules) + i] = layerid[layer]; + id[(i * modules) + start] = layerid[layer]; + id[((modules - start - 1) * modules) + i] = layerid[layer]; + id[(i * modules) + (modules - start - 1)] = layerid[layer]; + } + start--; + stop++; + } - /* Place the data in the grid */ - for(i = 0; i < modules; i++) { - for(j = 0; j < modules; j++) { - if(id[(i * modules) + j] & 0x02) { - grid[(((i * 6) + 1) * size) + (j * 6) + 1] = '1'; - } - if(id[(i * modules) + j] & 0x01) { - grid[(((i * 6) + 1) * size) + (j * 6) + 2] = '1'; - } - } - } + /* Place the data in the grid */ + for (i = 0; i < modules; i++) { + for (j = 0; j < modules; j++) { + if (id[(i * modules) + j] & 0x02) { + grid[(((i * 6) + 1) * size) + (j * 6) + 1] = '1'; + } + if (id[(i * modules) + j] & 0x01) { + grid[(((i * 6) + 1) * size) + (j * 6) + 2] = '1'; + } + } + } } -int grid_matrix(struct zint_symbol *symbol, unsigned char source[], int length) -{ - int size, modules, dark, error_number; - int auto_layers, min_layers, layers, auto_ecc_level, min_ecc_level, ecc_level; - int x, y, i, j, glyph; - char binary[9300]; - int data_cw, input_latch = 0; - int word[1460], data_max, reader = 0; - +int grid_matrix(struct zint_symbol *symbol, unsigned char source[], int length) { + int size, modules, dark, error_number; + int auto_layers, min_layers, layers, auto_ecc_level, min_ecc_level, ecc_level; + int x, y, i, j, glyph; + char binary[9300]; + int data_cw, input_latch = 0; + int word[1460], data_max, reader = 0; + #ifndef _MSC_VER - int utfdata[length + 1]; - int gbdata[length + 1]; + int utfdata[length + 1]; + int gbdata[length + 1]; #else - char* grid; - int* utfdata = (int *)_alloca((length + 1) * sizeof(int)); - int* gbdata = (int *)_alloca((length + 1) * sizeof(int)); + char* grid; + int* utfdata = (int *) _alloca((length + 1) * sizeof (int)); + int* gbdata = (int *) _alloca((length + 1) * sizeof (int)); #endif - for(i = 0; i < 1460; i++) { - word[i] = 0; - } + for (i = 0; i < 1460; i++) { + word[i] = 0; + } - switch(symbol->input_mode) { - case DATA_MODE: - for(i = 0; i < length; i++) { - gbdata[i] = (int)source[i]; - } - break; - default: - /* Convert Unicode input to GB-2312 */ - error_number = utf8toutf16(symbol, source, utfdata, &length); - if(error_number != 0) { return error_number; } + switch (symbol->input_mode) { + case DATA_MODE: + for (i = 0; i < length; i++) { + gbdata[i] = (int) source[i]; + } + break; + default: + /* Convert Unicode input to GB-2312 */ + error_number = utf8toutf16(symbol, source, utfdata, &length); + if (error_number != 0) { + return error_number; + } - for(i = 0; i < length; i++) { - if(utfdata[i] <= 0xff) { - gbdata[i] = utfdata[i]; - } else { - j = 0; - glyph = 0; - do { - if(gb2312_lookup[j * 2] == utfdata[i]) { - glyph = gb2312_lookup[(j * 2) + 1]; - } - j++; - } while ((j < 7445) && (glyph == 0)); - if(glyph == 0) { - strcpy(symbol->errtxt, "Invalid character in input data"); - return ZINT_ERROR_INVALID_DATA; - } - gbdata[i] = glyph; - } - } - break; - } + for (i = 0; i < length; i++) { + if (utfdata[i] <= 0xff) { + gbdata[i] = utfdata[i]; + } else { + j = 0; + glyph = 0; + do { + if (gb2312_lookup[j * 2] == utfdata[i]) { + glyph = gb2312_lookup[(j * 2) + 1]; + } + j++; + } while ((j < 7445) && (glyph == 0)); + if (glyph == 0) { + strcpy(symbol->errtxt, "Invalid character in input data"); + return ZINT_ERROR_INVALID_DATA; + } + gbdata[i] = glyph; + } + } + break; + } - if(symbol->output_options & READER_INIT) reader = 1; + if (symbol->output_options & READER_INIT) reader = 1; - error_number = gm_encode(gbdata, length, binary, reader); - if(error_number != 0) { - strcpy(symbol->errtxt, "Input data too long"); - return error_number; - } + error_number = gm_encode(gbdata, length, binary, reader); + if (error_number != 0) { + strcpy(symbol->errtxt, "Input data too long"); + return error_number; + } - /* Determine the size of the symbol */ - data_cw = strlen(binary) / 7; + /* Determine the size of the symbol */ + data_cw = strlen(binary) / 7; - auto_layers = 13; - for(i = 12; i > 0; i--) { - if(gm_recommend_cw[(i - 1)] >= data_cw) { auto_layers = i; } - } - min_layers = 13; - for(i = 12; i > 0; i--) { - if(gm_max_cw[(i - 1)] >= data_cw) { min_layers = i; } - } - layers = auto_layers; - auto_ecc_level = 3; - if(layers == 1) { auto_ecc_level = 5; } - if((layers == 2) || (layers == 3)) { auto_ecc_level = 4; } - min_ecc_level = 1; - if(layers == 1) { min_ecc_level = 4; } - if((layers == 2) || (layers == 3)) { min_ecc_level = 2; } - ecc_level = auto_ecc_level; + auto_layers = 13; + for (i = 12; i > 0; i--) { + if (gm_recommend_cw[(i - 1)] >= data_cw) { + auto_layers = i; + } + } + min_layers = 13; + for (i = 12; i > 0; i--) { + if (gm_max_cw[(i - 1)] >= data_cw) { + min_layers = i; + } + } + layers = auto_layers; + auto_ecc_level = 3; + if (layers == 1) { + auto_ecc_level = 5; + } + if ((layers == 2) || (layers == 3)) { + auto_ecc_level = 4; + } + min_ecc_level = 1; + if (layers == 1) { + min_ecc_level = 4; + } + if ((layers == 2) || (layers == 3)) { + min_ecc_level = 2; + } + ecc_level = auto_ecc_level; - if((symbol->option_2 >= 1) && (symbol->option_2 <= 13)) { - input_latch = 1; - if(symbol->option_2 > min_layers) { - layers = symbol->option_2; - } else { - layers = min_layers; - } - } + if ((symbol->option_2 >= 1) && (symbol->option_2 <= 13)) { + input_latch = 1; + if (symbol->option_2 > min_layers) { + layers = symbol->option_2; + } else { + layers = min_layers; + } + } - if(input_latch == 1) { - auto_ecc_level = 3; - if(layers == 1) { auto_ecc_level = 5; } - if((layers == 2) || (layers == 3)) { auto_ecc_level = 4; } - ecc_level = auto_ecc_level; - if(data_cw > gm_data_codewords[(5 * (layers - 1)) + (ecc_level - 1)]) { - layers++; - } - } + if (input_latch == 1) { + auto_ecc_level = 3; + if (layers == 1) { + auto_ecc_level = 5; + } + if ((layers == 2) || (layers == 3)) { + auto_ecc_level = 4; + } + ecc_level = auto_ecc_level; + if (data_cw > gm_data_codewords[(5 * (layers - 1)) + (ecc_level - 1)]) { + layers++; + } + } - if(input_latch == 0) { - if((symbol->option_1 >= 1) && (symbol->option_1 <= 5)) { - if(symbol->option_1 > min_ecc_level) { - ecc_level = symbol->option_1; - } else { - ecc_level = min_ecc_level; - } - } - if(data_cw > gm_data_codewords[(5 * (layers - 1)) + (ecc_level - 1)]) { - do { - layers++; - } while ((data_cw > gm_data_codewords[(5 * (layers - 1)) + (ecc_level - 1)]) && (layers <= 13)); - } - } + if (input_latch == 0) { + if ((symbol->option_1 >= 1) && (symbol->option_1 <= 5)) { + if (symbol->option_1 > min_ecc_level) { + ecc_level = symbol->option_1; + } else { + ecc_level = min_ecc_level; + } + } + if (data_cw > gm_data_codewords[(5 * (layers - 1)) + (ecc_level - 1)]) { + do { + layers++; + } while ((data_cw > gm_data_codewords[(5 * (layers - 1)) + (ecc_level - 1)]) && (layers <= 13)); + } + } - data_max = 1313; - switch(ecc_level) { - case 2: data_max = 1167; break; - case 3: data_max = 1021; break; - case 4: data_max = 875; break; - case 5: data_max = 729; break; - } + data_max = 1313; + switch (ecc_level) { + case 2: data_max = 1167; + break; + case 3: data_max = 1021; + break; + case 4: data_max = 875; + break; + case 5: data_max = 729; + break; + } + + if (data_cw > data_max) { + strcpy(symbol->errtxt, "Input data too long"); + return ZINT_ERROR_TOO_LONG; + } + + gm_add_ecc(binary, data_cw, layers, ecc_level, word); + size = 6 + (layers * 12); + modules = 1 + (layers * 2); - if(data_cw > data_max) { - strcpy(symbol->errtxt, "Input data too long"); - return ZINT_ERROR_TOO_LONG; - } - - gm_add_ecc(binary, data_cw, layers, ecc_level, word); - size = 6 + (layers * 12); - modules = 1 + (layers * 2); - #ifndef _MSC_VER - char grid[size * size]; + char grid[size * size]; #else - grid = (char *)_alloca((size * size) * sizeof(char)); + grid = (char *) _alloca((size * size) * sizeof (char)); #endif - for(x = 0; x < size; x++) { - for(y = 0; y < size; y++) { - grid[(y * size) + x] = '0'; - } - } + for (x = 0; x < size; x++) { + for (y = 0; y < size; y++) { + grid[(y * size) + x] = '0'; + } + } - place_data_in_grid(word, grid, modules, size); - place_layer_id(grid, size, layers, modules, ecc_level); + place_data_in_grid(word, grid, modules, size); + place_layer_id(grid, size, layers, modules, ecc_level); - /* Add macromodule frames */ - for(x = 0; x < modules; x++) { - dark = 1 - (x & 1); - for(y = 0; y < modules; y++) { - if(dark == 1) { - for(i = 0; i < 5; i++) { - grid[((y * 6) * size) + (x * 6) + i] = '1'; - grid[(((y * 6) + 5) * size) + (x * 6) + i] = '1'; - grid[(((y * 6) + i) * size) + (x * 6)] = '1'; - grid[(((y * 6) + i) * size) + (x * 6) + 5] = '1'; - } - grid[(((y * 6) + 5) * size) + (x * 6) + 5] = '1'; - dark = 0; - } else { - dark = 1; - } - } - } + /* Add macromodule frames */ + for (x = 0; x < modules; x++) { + dark = 1 - (x & 1); + for (y = 0; y < modules; y++) { + if (dark == 1) { + for (i = 0; i < 5; i++) { + grid[((y * 6) * size) + (x * 6) + i] = '1'; + grid[(((y * 6) + 5) * size) + (x * 6) + i] = '1'; + grid[(((y * 6) + i) * size) + (x * 6)] = '1'; + grid[(((y * 6) + i) * size) + (x * 6) + 5] = '1'; + } + grid[(((y * 6) + 5) * size) + (x * 6) + 5] = '1'; + dark = 0; + } else { + dark = 1; + } + } + } - /* Copy values to symbol */ - symbol->width = size; - symbol->rows = size; + /* Copy values to symbol */ + symbol->width = size; + symbol->rows = size; - for(x = 0; x < size; x++) { - for(y = 0; y < size; y++) { - if(grid[(y * size) + x] == '1') { - set_module(symbol, y, x); - } - } - symbol->row_height[x] = 1; - } + for (x = 0; x < size; x++) { + for (y = 0; y < size; y++) { + if (grid[(y * size) + x] == '1') { + set_module(symbol, y, x); + } + } + symbol->row_height[x] = 1; + } - return 0; + return 0; } diff --git a/backend/gridmtx.h b/backend/gridmtx.h index 61a7e7d3..7e2e8250 100644 --- a/backend/gridmtx.h +++ b/backend/gridmtx.h @@ -1,7 +1,7 @@ /* gridmtx.h - definitions for Grid Matrix libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart + Copyright (C) 2009-2016 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -27,7 +27,7 @@ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + */ #define GM_NUMBER 1 #define GM_LOWER 2 @@ -40,132 +40,144 @@ #define EUROPIUM "0123456789ABCDEFGHIJKLMOPRSTUVWXYZabcdefghijklmnopqrstuvwxyz " static const char shift_set[] = { - /* From Table 7 - Encoding of control characters */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* NULL -> SI */ - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* DLE -> US */ - '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', ':', - ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`', '{', '|', '}', '~' + /* From Table 7 - Encoding of control characters */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* NULL -> SI */ + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* DLE -> US */ + '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', ':', + ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`', '{', '|', '}', '~' }; -static const int gm_recommend_cw[] = { 9, 30, 59, 114, 170, 237, 315, 405, 506, 618, 741, 875, 1021 }; -static const int gm_max_cw[] = { 11, 40, 79, 146, 218, 305, 405, 521, 650, 794, 953, 1125, 1313 }; -//static const int gm_total_cw[] = { 18, 50, 98, 162, 242, 338, 450, 578, 722, 882, 1058, 1250, 1458 }; +static const int gm_recommend_cw[] = { + 9, 30, 59, 114, 170, 237, 315, 405, 506, 618, 741, 875, 1021 +}; + +static const int gm_max_cw[] = { + 11, 40, 79, 146, 218, 305, 405, 521, 650, 794, 953, 1125, 1313 +}; static const int gm_data_codewords[] = { - 0, 15, 13, 11, 9, - 45, 40, 35, 30, 25, - 89, 79, 69, 59, 49, - 146, 130, 114, 98, 81, - 218, 194, 170, 146, 121, - 305, 271, 237, 203, 169, - 405, 360, 315, 270, 225, - 521, 463, 405, 347, 289, - 650, 578, 506, 434, 361, - 794, 706, 618, 530, 441, - 953, 847, 741, 635, 529, - 1125, 1000, 875, 750, 625, - 1313, 1167, 1021, 875, 729 + 0, 15, 13, 11, 9, + 45, 40, 35, 30, 25, + 89, 79, 69, 59, 49, + 146, 130, 114, 98, 81, + 218, 194, 170, 146, 121, + 305, 271, 237, 203, 169, + 405, 360, 315, 270, 225, + 521, 463, 405, 347, 289, + 650, 578, 506, 434, 361, + 794, 706, 618, 530, 441, + 953, 847, 741, 635, 529, + 1125, 1000, 875, 750, 625, + 1313, 1167, 1021, 875, 729 }; -static const int gm_n1[] = { 18, 50, 98, 81, 121, 113, 113, 116, 121, 126, 118, 125, 122 }; -static const int gm_b1[] = { 1, 1, 1, 2, 2, 2, 2, 3, 2, 7, 5, 10, 6 }; -static const int gm_b2[] = { 0, 0, 0, 0, 0, 1, 2, 2, 4, 0, 4, 0, 6 }; +static const int gm_n1[] = { + 18, 50, 98, 81, 121, 113, 113, 116, 121, 126, 118, 125, 122 +}; -static const int gm_ebeb[] = { - /* E1 B3 E2 B4 */ - 0, 0, 0, 0, // version 1 - 3, 1, 0, 0, - 5, 1, 0, 0, - 7, 1, 0, 0, - 9, 1, 0, 0, - 5, 1, 0, 0, // version 2 - 10, 1, 0, 0, - 15, 1, 0, 0, - 20, 1, 0, 0, - 25, 1, 0, 0, - 9, 1, 0, 0, // version 3 - 19, 1, 0, 0, - 29, 1, 0, 0, - 39, 1, 0, 0, - 49, 1, 0, 0, - 8, 2, 0, 0, // version 4 - 16, 2, 0, 0, - 24, 2, 0, 0, - 32, 2, 0, 0, - 41, 1, 10, 1, - 12, 2, 0, 0, // version 5 - 24, 2, 0, 0, - 36, 2, 0, 0, - 48, 2, 0, 0, - 61, 1, 60, 1, - 11, 3, 0, 0, // version 6 - 23, 1, 22, 2, - 34, 2, 33, 1, - 45, 3, 0, 0, - 57, 1, 56, 2, - 12, 1, 11, 3, // version 7 - 23, 2, 22, 2, - 34, 3, 33, 1, - 45, 4, 0, 0, - 57, 1, 56, 3, - 12, 2, 11, 3, // version 8 - 23, 5, 0, 0, - 35, 3, 34, 2, - 47, 1, 46, 4, - 58, 4, 57, 1, - 12, 6, 0, 0, // version 9 - 24, 6, 0, 0, - 36, 6, 0, 0, - 48, 6, 0, 0, - 61, 1, 60, 5, - 13, 4, 12, 3, // version 10 - 26, 1, 25, 6, - 38, 5, 37, 2, - 51, 2, 50, 5, - 63, 7, 0, 0, - 12, 6, 11, 3, // version 11 - 24, 4, 23, 5, - 36, 2, 35, 7, - 47, 9, 0, 0, - 59, 7, 58, 2, - 13, 5, 12, 5, // version 12 - 25, 10, 0, 0, - 38, 5, 37, 5, - 50, 10, 0, 0, - 63, 5, 62, 5, - 13, 1, 12, 11, //version 13 - 25, 3, 24, 9, - 37, 5, 36, 7, - 49, 7, 48, 5, - 61, 9, 60, 3 +static const int gm_b1[] = { + 1, 1, 1, 2, 2, 2, 2, 3, 2, 7, 5, 10, 6 +}; + +static const int gm_b2[] = { + 0, 0, 0, 0, 0, 1, 2, 2, 4, 0, 4, 0, 6 +}; + +static const int gm_ebeb[] = { + /* E1 B3 E2 B4 */ + 0, 0, 0, 0, // version 1 + 3, 1, 0, 0, + 5, 1, 0, 0, + 7, 1, 0, 0, + 9, 1, 0, 0, + 5, 1, 0, 0, // version 2 + 10, 1, 0, 0, + 15, 1, 0, 0, + 20, 1, 0, 0, + 25, 1, 0, 0, + 9, 1, 0, 0, // version 3 + 19, 1, 0, 0, + 29, 1, 0, 0, + 39, 1, 0, 0, + 49, 1, 0, 0, + 8, 2, 0, 0, // version 4 + 16, 2, 0, 0, + 24, 2, 0, 0, + 32, 2, 0, 0, + 41, 1, 10, 1, + 12, 2, 0, 0, // version 5 + 24, 2, 0, 0, + 36, 2, 0, 0, + 48, 2, 0, 0, + 61, 1, 60, 1, + 11, 3, 0, 0, // version 6 + 23, 1, 22, 2, + 34, 2, 33, 1, + 45, 3, 0, 0, + 57, 1, 56, 2, + 12, 1, 11, 3, // version 7 + 23, 2, 22, 2, + 34, 3, 33, 1, + 45, 4, 0, 0, + 57, 1, 56, 3, + 12, 2, 11, 3, // version 8 + 23, 5, 0, 0, + 35, 3, 34, 2, + 47, 1, 46, 4, + 58, 4, 57, 1, + 12, 6, 0, 0, // version 9 + 24, 6, 0, 0, + 36, 6, 0, 0, + 48, 6, 0, 0, + 61, 1, 60, 5, + 13, 4, 12, 3, // version 10 + 26, 1, 25, 6, + 38, 5, 37, 2, + 51, 2, 50, 5, + 63, 7, 0, 0, + 12, 6, 11, 3, // version 11 + 24, 4, 23, 5, + 36, 2, 35, 7, + 47, 9, 0, 0, + 59, 7, 58, 2, + 13, 5, 12, 5, // version 12 + 25, 10, 0, 0, + 38, 5, 37, 5, + 50, 10, 0, 0, + 63, 5, 62, 5, + 13, 1, 12, 11, //version 13 + 25, 3, 24, 9, + 37, 5, 36, 7, + 49, 7, 48, 5, + 61, 9, 60, 3 }; static const int gm_macro_matrix[] = { - 728,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650, - 727,624,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,651, - 726,623,528,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,553,652, - 725,622,527,440,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,463,554,653, - 724,621,526,439,360,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,381,464,555,654, - 723,620,525,438,359,288,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,307,382,465,556,655, - 722,619,524,437,358,287,224,169,170,171,172,173,174,175,176,177,178,179,180,181,182,241,308,383,466,557,656, - 721,618,523,436,357,286,223,168,121,122,123,124,125,126,127,128,129,130,131,132,183,242,309,384,467,558,657, - 720,617,522,435,356,285,222,167,120,81,82,83,84,85,86,87,88,89,90,133,184,243,310,385,468,559,658, - 719,616,521,434,355,284,221,166,119,80,49,50,51,52,53,54,55,56,91,134,185,244,311,386,469,560,659, - 718,615,520,433,354,283,220,165,118,79,48,25,26,27,28,29,30,57,92,135,186,245,312,387,470,561,660, - 717,614,519,432,353,282,219,164,117,78,47,24,9,10,11,12,31,58,93,136,187,246,313,388,471,562,661, - 716,613,518,431,352,281,218,163,116,77,46,23,8,1,2,13,32,59,94,137,188,247,314,389,472,563,662, - 715,612,517,430,351,280,217,162,115,76,45,22,7,0,3,14,33,60,95,138,189,248,315,390,473,564,663, - 714,611,516,429,350,279,216,161,114,75,44,21,6,5,4,15,34,61,96,139,190,249,316,391,474,565,664, - 713,610,515,428,349,278,215,160,113,74,43,20,19,18,17,16,35,62,97,140,191,250,317,392,475,566,665, - 712,609,514,427,348,277,214,159,112,73,42,41,40,39,38,37,36,63,98,141,192,251,318,393,476,567,666, - 711,608,513,426,347,276,213,158,111,72,71,70,69,68,67,66,65,64,99,142,193,252,319,394,477,568,667, - 710,607,512,425,346,275,212,157,110,109,108,107,106,105,104,103,102,101,100,143,194,253,320,395,478,569,668, - 709,606,511,424,345,274,211,156,155,154,153,152,151,150,149,148,147,146,145,144,195,254,321,396,479,570,669, - 708,605,510,423,344,273,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,255,322,397,480,571,670, - 707,604,509,422,343,272,271,270,269,268,267,266,265,264,263,262,261,260,259,258,257,256,323,398,481,572,671, - 706,603,508,421,342,341,340,339,338,337,336,335,334,333,332,331,330,329,328,327,326,325,324,399,482,573,672, - 705,602,507,420,419,418,417,416,415,414,413,412,411,410,409,408,407,406,405,404,403,402,401,400,483,574,673, - 704,601,506,505,504,503,502,501,500,499,498,497,496,495,494,493,492,491,490,489,488,487,486,485,484,575,674, - 703,600,599,598,597,596,595,594,593,592,591,590,589,588,587,586,585,584,583,582,581,580,579,578,577,576,675, - 702,701,700,699,698,697,696,695,694,693,692,691,690,689,688,687,686,685,684,683,682,681,680,679,678,677,676, + 728, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 727, 624, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 651, + 726, 623, 528, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 553, 652, + 725, 622, 527, 440, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 463, 554, 653, + 724, 621, 526, 439, 360, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 381, 464, 555, 654, + 723, 620, 525, 438, 359, 288, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 307, 382, 465, 556, 655, + 722, 619, 524, 437, 358, 287, 224, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 241, 308, 383, 466, 557, 656, + 721, 618, 523, 436, 357, 286, 223, 168, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 183, 242, 309, 384, 467, 558, 657, + 720, 617, 522, 435, 356, 285, 222, 167, 120, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 133, 184, 243, 310, 385, 468, 559, 658, + 719, 616, 521, 434, 355, 284, 221, 166, 119, 80, 49, 50, 51, 52, 53, 54, 55, 56, 91, 134, 185, 244, 311, 386, 469, 560, 659, + 718, 615, 520, 433, 354, 283, 220, 165, 118, 79, 48, 25, 26, 27, 28, 29, 30, 57, 92, 135, 186, 245, 312, 387, 470, 561, 660, + 717, 614, 519, 432, 353, 282, 219, 164, 117, 78, 47, 24, 9, 10, 11, 12, 31, 58, 93, 136, 187, 246, 313, 388, 471, 562, 661, + 716, 613, 518, 431, 352, 281, 218, 163, 116, 77, 46, 23, 8, 1, 2, 13, 32, 59, 94, 137, 188, 247, 314, 389, 472, 563, 662, + 715, 612, 517, 430, 351, 280, 217, 162, 115, 76, 45, 22, 7, 0, 3, 14, 33, 60, 95, 138, 189, 248, 315, 390, 473, 564, 663, + 714, 611, 516, 429, 350, 279, 216, 161, 114, 75, 44, 21, 6, 5, 4, 15, 34, 61, 96, 139, 190, 249, 316, 391, 474, 565, 664, + 713, 610, 515, 428, 349, 278, 215, 160, 113, 74, 43, 20, 19, 18, 17, 16, 35, 62, 97, 140, 191, 250, 317, 392, 475, 566, 665, + 712, 609, 514, 427, 348, 277, 214, 159, 112, 73, 42, 41, 40, 39, 38, 37, 36, 63, 98, 141, 192, 251, 318, 393, 476, 567, 666, + 711, 608, 513, 426, 347, 276, 213, 158, 111, 72, 71, 70, 69, 68, 67, 66, 65, 64, 99, 142, 193, 252, 319, 394, 477, 568, 667, + 710, 607, 512, 425, 346, 275, 212, 157, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 143, 194, 253, 320, 395, 478, 569, 668, + 709, 606, 511, 424, 345, 274, 211, 156, 155, 154, 153, 152, 151, 150, 149, 148, 147, 146, 145, 144, 195, 254, 321, 396, 479, 570, 669, + 708, 605, 510, 423, 344, 273, 210, 209, 208, 207, 206, 205, 204, 203, 202, 201, 200, 199, 198, 197, 196, 255, 322, 397, 480, 571, 670, + 707, 604, 509, 422, 343, 272, 271, 270, 269, 268, 267, 266, 265, 264, 263, 262, 261, 260, 259, 258, 257, 256, 323, 398, 481, 572, 671, + 706, 603, 508, 421, 342, 341, 340, 339, 338, 337, 336, 335, 334, 333, 332, 331, 330, 329, 328, 327, 326, 325, 324, 399, 482, 573, 672, + 705, 602, 507, 420, 419, 418, 417, 416, 415, 414, 413, 412, 411, 410, 409, 408, 407, 406, 405, 404, 403, 402, 401, 400, 483, 574, 673, + 704, 601, 506, 505, 504, 503, 502, 501, 500, 499, 498, 497, 496, 495, 494, 493, 492, 491, 490, 489, 488, 487, 486, 485, 484, 575, 674, + 703, 600, 599, 598, 597, 596, 595, 594, 593, 592, 591, 590, 589, 588, 587, 586, 585, 584, 583, 582, 581, 580, 579, 578, 577, 576, 675, + 702, 701, 700, 699, 698, 697, 696, 695, 694, 693, 692, 691, 690, 689, 688, 687, 686, 685, 684, 683, 682, 681, 680, 679, 678, 677, 676, }; diff --git a/backend/gs1.c b/backend/gs1.c index bf467a37..e733b699 100644 --- a/backend/gs1.c +++ b/backend/gs1.c @@ -2,7 +2,7 @@ /* libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart + Copyright (C) 2009-2016 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -28,7 +28,7 @@ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + */ #include #include @@ -43,280 +43,316 @@ to be bulletproof, nor does it report very accurately what problem was found or where, but should prevent some of the more common encoding errors */ -void itostr(char ai_string[], int ai_value) -{ - int thou, hund, ten, unit; - char temp[2]; +void itostr(char ai_string[], int ai_value) { + int thou, hund, ten, unit; + char temp[2]; - strcpy(ai_string, "("); - thou = ai_value / 1000; - hund = (ai_value - (1000 * thou)) / 100; - ten = (ai_value - ((1000 * thou) + (100 * hund))) / 10; - unit = ai_value - ((1000 * thou) + (100 * hund) + (10 * ten)); + strcpy(ai_string, "("); + thou = ai_value / 1000; + hund = (ai_value - (1000 * thou)) / 100; + ten = (ai_value - ((1000 * thou) + (100 * hund))) / 10; + unit = ai_value - ((1000 * thou) + (100 * hund) + (10 * ten)); - temp[1] = '\0'; - if(ai_value >= 1000) { temp[0] = itoc(thou); concat(ai_string, temp); } - if(ai_value >= 100) { temp[0] = itoc(hund); concat(ai_string, temp); } - temp[0] = itoc(ten); - concat(ai_string, temp); - temp[0] = itoc(unit); - concat(ai_string, temp); - concat(ai_string, ")"); + temp[1] = '\0'; + if (ai_value >= 1000) { + temp[0] = itoc(thou); + concat(ai_string, temp); + } + if (ai_value >= 100) { + temp[0] = itoc(hund); + concat(ai_string, temp); + } + temp[0] = itoc(ten); + concat(ai_string, temp); + temp[0] = itoc(unit); + concat(ai_string, temp); + concat(ai_string, ")"); } -int gs1_verify(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len, char reduced[]) -{ - int i, j, last_ai, ai_latch; - char ai_string[6]; - int bracket_level, max_bracket_level, ai_length, max_ai_length, min_ai_length; - int ai_value[100], ai_location[100], ai_count, data_location[100], data_length[100]; - int error_latch; +int gs1_verify(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len, char reduced[]) { + int i, j, last_ai, ai_latch; + char ai_string[6]; + int bracket_level, max_bracket_level, ai_length, max_ai_length, min_ai_length; + int ai_value[100], ai_location[100], ai_count, data_location[100], data_length[100]; + int error_latch; - /* Detect extended ASCII characters */ - for(i = 0; i < src_len; i++) { - if(source[i] >=128) { - strcpy(symbol->errtxt, "Extended ASCII characters are not supported by GS1"); - return ZINT_ERROR_INVALID_DATA; - } - if(source[i] < 32) { - strcpy(symbol->errtxt, "Control characters are not supported by GS1"); - return ZINT_ERROR_INVALID_DATA; - } - } + /* Detect extended ASCII characters */ + for (i = 0; i < src_len; i++) { + if (source[i] >= 128) { + strcpy(symbol->errtxt, "Extended ASCII characters are not supported by GS1"); + return ZINT_ERROR_INVALID_DATA; + } + if (source[i] < 32) { + strcpy(symbol->errtxt, "Control characters are not supported by GS1"); + return ZINT_ERROR_INVALID_DATA; + } + } - if(source[0] != '[') { - strcpy(symbol->errtxt, "Data does not start with an AI"); - return ZINT_ERROR_INVALID_DATA; - } + if (source[0] != '[') { + strcpy(symbol->errtxt, "Data does not start with an AI"); + return ZINT_ERROR_INVALID_DATA; + } - /* Check the position of the brackets */ - bracket_level = 0; - max_bracket_level = 0; - ai_length = 0; - max_ai_length = 0; - min_ai_length = 5; - j = 0; - ai_latch = 0; - for(i = 0; i < src_len; i++) { - ai_length += j; - if(((j == 1) && (source[i] != ']')) && ((source[i] < '0') || (source[i] > '9'))) { ai_latch = 1; } - if(source[i] == '[') { bracket_level++; j = 1; } - if(source[i] == ']') { - bracket_level--; - if(ai_length < min_ai_length) { min_ai_length = ai_length; } - j = 0; - ai_length = 0; - } - if(bracket_level > max_bracket_level) { max_bracket_level = bracket_level; } - if(ai_length > max_ai_length) { max_ai_length = ai_length; } - } - min_ai_length--; + /* Check the position of the brackets */ + bracket_level = 0; + max_bracket_level = 0; + ai_length = 0; + max_ai_length = 0; + min_ai_length = 5; + j = 0; + ai_latch = 0; + for (i = 0; i < src_len; i++) { + ai_length += j; + if (((j == 1) && (source[i] != ']')) && ((source[i] < '0') || (source[i] > '9'))) { + ai_latch = 1; + } + if (source[i] == '[') { + bracket_level++; + j = 1; + } + if (source[i] == ']') { + bracket_level--; + if (ai_length < min_ai_length) { + min_ai_length = ai_length; + } + j = 0; + ai_length = 0; + } + if (bracket_level > max_bracket_level) { + max_bracket_level = bracket_level; + } + if (ai_length > max_ai_length) { + max_ai_length = ai_length; + } + } + min_ai_length--; - if(bracket_level != 0) { - /* Not all brackets are closed */ - strcpy(symbol->errtxt, "Malformed AI in input data (brackets don\'t match)"); - return ZINT_ERROR_INVALID_DATA; - } + if (bracket_level != 0) { + /* Not all brackets are closed */ + strcpy(symbol->errtxt, "Malformed AI in input data (brackets don\'t match)"); + return ZINT_ERROR_INVALID_DATA; + } - if(max_bracket_level > 1) { - /* Nested brackets */ - strcpy(symbol->errtxt, "Found nested brackets in input data"); - return ZINT_ERROR_INVALID_DATA; - } + if (max_bracket_level > 1) { + /* Nested brackets */ + strcpy(symbol->errtxt, "Found nested brackets in input data"); + return ZINT_ERROR_INVALID_DATA; + } - if(max_ai_length > 4) { - /* AI is too long */ - strcpy(symbol->errtxt, "Invalid AI in input data (AI too long)"); - return ZINT_ERROR_INVALID_DATA; - } + if (max_ai_length > 4) { + /* AI is too long */ + strcpy(symbol->errtxt, "Invalid AI in input data (AI too long)"); + return ZINT_ERROR_INVALID_DATA; + } - if(min_ai_length <= 1) { - /* AI is too short */ - strcpy(symbol->errtxt, "Invalid AI in input data (AI too short)"); - return ZINT_ERROR_INVALID_DATA; - } + if (min_ai_length <= 1) { + /* AI is too short */ + strcpy(symbol->errtxt, "Invalid AI in input data (AI too short)"); + return ZINT_ERROR_INVALID_DATA; + } - if(ai_latch == 1) { - /* Non-numeric data in AI */ - strcpy(symbol->errtxt, "Invalid AI in input data (non-numeric characters in AI)"); - return ZINT_ERROR_INVALID_DATA; - } + if (ai_latch == 1) { + /* Non-numeric data in AI */ + strcpy(symbol->errtxt, "Invalid AI in input data (non-numeric characters in AI)"); + return ZINT_ERROR_INVALID_DATA; + } - ai_count = 0; - for(i = 1; i < src_len; i++) { - if(source[i - 1] == '[') { - ai_location[ai_count] = i; - j = 0; - do { - ai_string[j] = source[i + j]; - j++; - } while (ai_string[j - 1] != ']'); - ai_string[j - 1] = '\0'; - ai_value[ai_count] = atoi(ai_string); - ai_count++; - } - } + ai_count = 0; + for (i = 1; i < src_len; i++) { + if (source[i - 1] == '[') { + ai_location[ai_count] = i; + j = 0; + do { + ai_string[j] = source[i + j]; + j++; + } while (ai_string[j - 1] != ']'); + ai_string[j - 1] = '\0'; + ai_value[ai_count] = atoi(ai_string); + ai_count++; + } + } - for(i = 0; i < ai_count; i++) { - data_location[i] = ai_location[i] + 3; - if(ai_value[i] >= 100) { data_location[i]++; } - if(ai_value[i] >= 1000) { data_location[i]++; } - data_length[i] = 0; - do { - data_length[i]++; - } while ((source[data_location[i] + data_length[i] - 1] != '[') && (data_location[i] + data_length[i] <= src_len)); - data_length[i]--; - } + for (i = 0; i < ai_count; i++) { + data_location[i] = ai_location[i] + 3; + if (ai_value[i] >= 100) { + data_location[i]++; + } + if (ai_value[i] >= 1000) { + data_location[i]++; + } + data_length[i] = 0; + do { + data_length[i]++; + } while ((source[data_location[i] + data_length[i] - 1] != '[') && (data_location[i] + data_length[i] <= src_len)); + data_length[i]--; + } - for(i = 0; i < ai_count; i++) { - if(data_length[i] == 0) { - /* No data for given AI */ - strcpy(symbol->errtxt, "Empty data field in input data"); - return ZINT_ERROR_INVALID_DATA; - } - } + for (i = 0; i < ai_count; i++) { + if (data_length[i] == 0) { + /* No data for given AI */ + strcpy(symbol->errtxt, "Empty data field in input data"); + return ZINT_ERROR_INVALID_DATA; + } + } - error_latch = 0; - strcpy(ai_string, ""); - for(i = 0; i < ai_count; i++) { - switch (ai_value[i]) { - case 0: if(data_length[i] != 18) { error_latch = 1; } break; - case 1: - case 2: - case 3: if(data_length[i] != 14) { error_latch = 1; } break; - case 4: if(data_length[i] != 16) { error_latch = 1; } break; - case 11: - case 12: - case 13: - case 14: - case 15: - case 16: - case 17: - case 18: - case 19: if(data_length[i] != 6) { error_latch = 1; } break; - case 20: if(data_length[i] != 2) { error_latch = 1; } break; - case 23: - case 24: - case 25: - case 39: - case 40: - case 41: - case 42: - case 70: - case 80: - case 81: error_latch = 2; break; - } - if( - ((ai_value[i] >= 100) && (ai_value[i] <= 179)) - || ((ai_value[i] >= 1000) && (ai_value[i] <= 1799)) - || ((ai_value[i] >= 200) && (ai_value[i] <= 229)) - || ((ai_value[i] >= 2000) && (ai_value[i] <= 2299)) - || ((ai_value[i] >= 300) && (ai_value[i] <= 309)) - || ((ai_value[i] >= 3000) && (ai_value[i] <= 3099)) - || ((ai_value[i] >= 31) && (ai_value[i] <= 36)) - || ((ai_value[i] >= 310) && (ai_value[i] <= 369)) - ) { - error_latch = 2; - } - if((ai_value[i] >= 3100) && (ai_value[i] <= 3699)) { - if(data_length[i] != 6) { - error_latch = 1; - } - } - if( - ((ai_value[i] >= 370) && (ai_value[i] <= 379)) - || ((ai_value[i] >= 3700) && (ai_value[i] <= 3799)) - ) { - error_latch = 2; - } - if((ai_value[i] >= 410) && (ai_value[i] <= 415)) { - if(data_length[i] != 13) { - error_latch = 1; - } - } - if( - ((ai_value[i] >= 4100) && (ai_value[i] <= 4199)) - || ((ai_value[i] >= 700) && (ai_value[i] <= 703)) - || ((ai_value[i] >= 800) && (ai_value[i] <= 810)) - || ((ai_value[i] >= 900) && (ai_value[i] <= 999)) - || ((ai_value[i] >= 9000) && (ai_value[i] <= 9999)) - ) { - error_latch = 2; - } - if((error_latch < 4) && (error_latch > 0)) { - /* error has just been detected: capture AI */ - itostr(ai_string, ai_value[i]); - error_latch += 4; - } - } + error_latch = 0; + strcpy(ai_string, ""); + for (i = 0; i < ai_count; i++) { + switch (ai_value[i]) { + case 0: if (data_length[i] != 18) { + error_latch = 1; + } + break; + case 1: + case 2: + case 3: if (data_length[i] != 14) { + error_latch = 1; + } + break; + case 4: if (data_length[i] != 16) { + error_latch = 1; + } + break; + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: if (data_length[i] != 6) { + error_latch = 1; + } + break; + case 20: if (data_length[i] != 2) { + error_latch = 1; + } + break; + case 23: + case 24: + case 25: + case 39: + case 40: + case 41: + case 42: + case 70: + case 80: + case 81: error_latch = 2; + break; + } + if ( + ((ai_value[i] >= 100) && (ai_value[i] <= 179)) + || ((ai_value[i] >= 1000) && (ai_value[i] <= 1799)) + || ((ai_value[i] >= 200) && (ai_value[i] <= 229)) + || ((ai_value[i] >= 2000) && (ai_value[i] <= 2299)) + || ((ai_value[i] >= 300) && (ai_value[i] <= 309)) + || ((ai_value[i] >= 3000) && (ai_value[i] <= 3099)) + || ((ai_value[i] >= 31) && (ai_value[i] <= 36)) + || ((ai_value[i] >= 310) && (ai_value[i] <= 369)) + ) { + error_latch = 2; + } + if ((ai_value[i] >= 3100) && (ai_value[i] <= 3699)) { + if (data_length[i] != 6) { + error_latch = 1; + } + } + if ( + ((ai_value[i] >= 370) && (ai_value[i] <= 379)) + || ((ai_value[i] >= 3700) && (ai_value[i] <= 3799)) + ) { + error_latch = 2; + } + if ((ai_value[i] >= 410) && (ai_value[i] <= 415)) { + if (data_length[i] != 13) { + error_latch = 1; + } + } + if ( + ((ai_value[i] >= 4100) && (ai_value[i] <= 4199)) + || ((ai_value[i] >= 700) && (ai_value[i] <= 703)) + || ((ai_value[i] >= 800) && (ai_value[i] <= 810)) + || ((ai_value[i] >= 900) && (ai_value[i] <= 999)) + || ((ai_value[i] >= 9000) && (ai_value[i] <= 9999)) + ) { + error_latch = 2; + } + if ((error_latch < 4) && (error_latch > 0)) { + /* error has just been detected: capture AI */ + itostr(ai_string, ai_value[i]); + error_latch += 4; + } + } - if(error_latch == 5) { - strcpy(symbol->errtxt, "Invalid data length for AI "); - concat(symbol->errtxt, ai_string); - return ZINT_ERROR_INVALID_DATA; - } + if (error_latch == 5) { + strcpy(symbol->errtxt, "Invalid data length for AI "); + concat(symbol->errtxt, ai_string); + return ZINT_ERROR_INVALID_DATA; + } - if(error_latch == 6) { - strcpy(symbol->errtxt, "Invalid AI value "); - concat(symbol->errtxt, ai_string); - return ZINT_ERROR_INVALID_DATA; - } + if (error_latch == 6) { + strcpy(symbol->errtxt, "Invalid AI value "); + concat(symbol->errtxt, ai_string); + return ZINT_ERROR_INVALID_DATA; + } - /* Resolve AI data - put resulting string in 'reduced' */ - j = 0; - last_ai = 0; - ai_latch = 1; - for(i = 0; i < src_len; i++) { - if((source[i] != '[') && (source[i] != ']')) { - reduced[j++] = source[i]; - } - if(source[i] == '[') { - /* Start of an AI string */ - if(ai_latch == 0) { - reduced[j++] = '['; - } - ai_string[0] = source[i + 1]; - ai_string[1] = source[i + 2]; - ai_string[2] = '\0'; - last_ai = atoi(ai_string); - ai_latch = 0; - /* The following values from "GS-1 General Specification version 8.0 issue 2, May 2008" - figure 5.4.8.2.1 - 1 "Element Strings with Pre-Defined Length Using Application Identifiers" */ - if( - ((last_ai >= 0) && (last_ai <= 4)) - || ((last_ai >= 11) && (last_ai <= 20)) - || (last_ai == 23) /* legacy support - see 5.3.8.2.2 */ - || ((last_ai >= 31) && (last_ai <= 36)) - || (last_ai == 41) - ) { - ai_latch = 1; - } - } - /* The ']' character is simply dropped from the input */ - } - reduced[j] = '\0'; + /* Resolve AI data - put resulting string in 'reduced' */ + j = 0; + last_ai = 0; + ai_latch = 1; + for (i = 0; i < src_len; i++) { + if ((source[i] != '[') && (source[i] != ']')) { + reduced[j++] = source[i]; + } + if (source[i] == '[') { + /* Start of an AI string */ + if (ai_latch == 0) { + reduced[j++] = '['; + } + ai_string[0] = source[i + 1]; + ai_string[1] = source[i + 2]; + ai_string[2] = '\0'; + last_ai = atoi(ai_string); + ai_latch = 0; + /* The following values from "GS-1 General Specification version 8.0 issue 2, May 2008" + figure 5.4.8.2.1 - 1 "Element Strings with Pre-Defined Length Using Application Identifiers" */ + if ( + ((last_ai >= 0) && (last_ai <= 4)) + || ((last_ai >= 11) && (last_ai <= 20)) + || (last_ai == 23) /* legacy support - see 5.3.8.2.2 */ + || ((last_ai >= 31) && (last_ai <= 36)) + || (last_ai == 41) + ) { + ai_latch = 1; + } + } + /* The ']' character is simply dropped from the input */ + } + reduced[j] = '\0'; - /* the character '[' in the reduced string refers to the FNC1 character */ - return 0; + /* the character '[' in the reduced string refers to the FNC1 character */ + return 0; } -int ugs1_verify(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len, unsigned char reduced[]) -{ - /* Only to keep the compiler happy */ +int ugs1_verify(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len, unsigned char reduced[]) { + /* Only to keep the compiler happy */ #ifndef _MSC_VER - char temp[src_len + 5]; + char temp[src_len + 5]; #else - char* temp = (char*)_alloca(src_len + 5); + char* temp = (char*) _alloca(src_len + 5); #endif - int error_number; + int error_number; - error_number = gs1_verify(symbol, source, src_len, temp); - if(error_number != 0) { return error_number; } + error_number = gs1_verify(symbol, source, src_len, temp); + if (error_number != 0) { + return error_number; + } - if (strlen(temp) < src_len + 5) { - ustrcpy(reduced, (unsigned char*)temp); - return 0; - } - strcpy(symbol->errtxt, "ugs1_verify overflow"); - return ZINT_ERROR_INVALID_DATA; + if (strlen(temp) < src_len + 5) { + ustrcpy(reduced, (unsigned char*) temp); + return 0; + } + strcpy(symbol->errtxt, "ugs1_verify overflow"); + return ZINT_ERROR_INVALID_DATA; } diff --git a/backend/gs1.h b/backend/gs1.h index 449559a4..6c62409d 100644 --- a/backend/gs1.h +++ b/backend/gs1.h @@ -2,20 +2,20 @@ /* libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart + Copyright (C) 2009-2016 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. + documentation and/or other materials provided with the distribution. 3. Neither the name of the project nor the names of its contributors may be used to endorse or promote products derived from this software - without specific prior written permission. + without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -26,9 +26,9 @@ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + */ #ifndef __GS1_H #define __GS1_H @@ -36,8 +36,8 @@ extern "C" { #endif /* __cplusplus */ -extern int gs1_verify(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len, char reduced[]); -extern int ugs1_verify(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len, unsigned char reduced[]); + extern int gs1_verify(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len, char reduced[]); + extern int ugs1_verify(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len, unsigned char reduced[]); #ifdef __cplusplus }