├── src ├── libbase64.pro ├── base64_encode_alloc.c ├── CMakeLists.txt ├── base64_decode_alloc.c ├── base64_byteorder_p.h ├── base64_encode.c ├── base64_encode_p.h ├── base64_cpuid.c ├── base64_encode_avx2.c ├── base64_encode_ssse3.c ├── base64_encode_plain.c ├── base64_decode.c ├── base64.h └── base64_encode_alphabet.c ├── .gitignore └── CMakeLists.txt /src/libbase64.pro: -------------------------------------------------------------------------------- 1 | QT -= core gui 2 | CONFIG += use_c_linker 3 | 4 | TARGET = base64 5 | TEMPLATE = lib 6 | 7 | SOURCES += \ 8 | base64_encode_alphabet.c \ 9 | base64_cpuid.c \ 10 | base64_decode.c \ 11 | base64_decode_alloc.c \ 12 | base64_encode.c \ 13 | base64_encode_alloc.c \ 14 | base64_encode_plain.c 15 | 16 | ssse3 { 17 | DEFINES += HAVE_SSSE3 18 | SOURCES += base64_encode_ssse3.c 19 | } 20 | avx2 { 21 | DEFINES += HAVE_AVX2 22 | SOURCES += base64_encode_avx2.c 23 | } 24 | 25 | HEADERS += base64.h base64_encode_p.h base64_byteorder_p.h 26 | QMAKE_CFLAGS += -std=c11 27 | 28 | unix { 29 | target.path = /usr/lib 30 | INSTALLS += target 31 | gcc { 32 | DEFINES += HAVE_IFUNC 33 | !mac: QMAKE_LFLAGS += -Wl,--no-undefined -Wl,-nostdlib 34 | QMAKE_CFLAGS += -fno-asynchronous-unwind-tables -fno-dwarf2-cfi-asm 35 | CONFIG -= force_debug_info 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Frequent generated files 2 | callgrind.out.* 3 | pcviewer.cfg 4 | *~ 5 | *.a 6 | *.la 7 | *.core 8 | *.d 9 | *.dylib 10 | *.moc 11 | *.o 12 | *.obj 13 | *.orig 14 | *.swp 15 | *.rej 16 | *.so 17 | *.so.* 18 | *.pbxuser 19 | *.mode1 20 | *.mode1v3 21 | *_pch.h.cpp 22 | *_resource.rc 23 | .#* 24 | *.*# 25 | core 26 | .qmake.cache 27 | .qmake.vars 28 | .device.vars 29 | tags 30 | .DS_Store 31 | *.debug 32 | Makefile* 33 | *.prl 34 | *.app 35 | *.pro.user* 36 | *.qmlproject.user* 37 | *.gcov 38 | *.gcda 39 | *.gcno 40 | *.flc 41 | .*.swp 42 | CMakeLists.txt.user 43 | 44 | # Visual Studio generated files 45 | *.ib_pdb_index 46 | *.idb 47 | *.ilk 48 | *.pdb 49 | *.sln 50 | *.suo 51 | *.vcproj 52 | *vcproj.*.*.user 53 | *.ncb 54 | *.vcxproj 55 | *.vcxproj.filters 56 | *.vcxproj.user 57 | *.exe.embed.manifest 58 | *.exe_manifest.rc 59 | *.exe_manifest.res 60 | 61 | # MinGW generated files 62 | *.Debug 63 | *.Release 64 | 65 | # INTEGRITY generated files 66 | *.gpj 67 | *.int 68 | *.ael 69 | *.dla 70 | *.dnm 71 | *.dep 72 | *.map 73 | -------------------------------------------------------------------------------- /src/base64_encode_alloc.c: -------------------------------------------------------------------------------- 1 | /**************************************************************************** 2 | ** 3 | ** Copyright (C) 2015 Intel Corporation 4 | ** 5 | ** Permission is hereby granted, free of charge, to any person obtaining a copy 6 | ** of this software and associated documentation files (the "Software"), to deal 7 | ** in the Software without restriction, including without limitation the rights 8 | ** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | ** copies of the Software, and to permit persons to whom the Software is 10 | ** furnished to do so, subject to the following conditions: 11 | ** 12 | ** The above copyright notice and this permission notice shall be included in 13 | ** all copies or substantial portions of the Software. 14 | ** 15 | ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | ** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | ** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | ** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | ** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | ** THE SOFTWARE. 22 | ** 23 | ****************************************************************************/ 24 | 25 | #include "base64.h" 26 | #include 27 | 28 | char *base64_encode_alloc(const unsigned char *in, size_t len, int options) 29 | { 30 | char *result = malloc(base64_encode_buffer_size(len, options)); 31 | if (result) 32 | return base64_encode(result, in, len, options); 33 | return NULL; 34 | } 35 | -------------------------------------------------------------------------------- /src/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_library(base64 2 | base64_cpuid.c 3 | base64_decode.c 4 | base64_decode_alloc.c 5 | base64_encode.c 6 | base64_encode_alloc.c 7 | base64_encode_alphabet.c 8 | base64_encode_plain.c 9 | 10 | base64_encode_p.h 11 | base64_byteorder_p.h 12 | ) 13 | set_property(TARGET base64 PROPERTY PUBLIC_HEADER 14 | base64.h 15 | ) 16 | 17 | set_target_properties(base64 PROPERTIES 18 | C_STANDARD 11 19 | C_STANDARD_REQUIRED 99 20 | C_EXTENSIONS OFF 21 | C_VISIBILITY_PRESET hidden 22 | FRAMEWORK OFF 23 | SOVERSION 0 24 | VERSION 0.1.0) 25 | 26 | if(IFUNC_SUPPORTED) 27 | add_definitions(-DHAVE_IFUNC) 28 | endif() 29 | if(ATOMICS_SUPPORTED) 30 | add_definitions(-DHAVE_ATOMICS) 31 | endif() 32 | if(SSSE3_SUPPORTED) 33 | add_definitions(-DHAVE_SSSE3) 34 | set_source_files_properties(base64_encode_ssse3.c PROPERTIES COMPILE_FLAGS ${SSSE3_CFLAG}) 35 | target_sources(base64 PRIVATE base64_encode_ssse3.c) 36 | endif() 37 | if(AVX2_SUPPORTED) 38 | add_definitions(-DHAVE_AVX2) 39 | set_source_files_properties(base64_encode_avx2.c PROPERTIES COMPILE_FLAGS ${AVX2_CFLAG}) 40 | target_sources(base64 PRIVATE base64_encode_avx2.c) 41 | endif() 42 | 43 | if(BUILD_SHARED_LIBS) 44 | if(LFLAG_NO_UNDEFINED_SUPPORTED) 45 | set_property(TARGET base64 APPEND_STRING PROPERTY LINK_FLAGS "-Wl,-z,defs ") 46 | endif() 47 | if(LFLAG_O1) 48 | set_property(TARGET base64 APPEND_STRING PROPERTY LINK_FLAGS "-Wl,-O1 ") 49 | endif() 50 | else() 51 | add_definitions(-DLIBBASE64_API=) 52 | endif() 53 | 54 | install(TARGETS base64 RUNTIME DESTINATION bin 55 | LIBRARY DESTINATION lib 56 | ARCHIVE DESTINATION lib 57 | PUBLIC_HEADER DESTINATION include 58 | INCLUDES DESTINATION include) 59 | -------------------------------------------------------------------------------- /src/base64_decode_alloc.c: -------------------------------------------------------------------------------- 1 | /**************************************************************************** 2 | ** 3 | ** Copyright (C) 2015 Intel Corporation 4 | ** 5 | ** Permission is hereby granted, free of charge, to any person obtaining a copy 6 | ** of this software and associated documentation files (the "Software"), to deal 7 | ** in the Software without restriction, including without limitation the rights 8 | ** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | ** copies of the Software, and to permit persons to whom the Software is 10 | ** furnished to do so, subject to the following conditions: 11 | ** 12 | ** The above copyright notice and this permission notice shall be included in 13 | ** all copies or substantial portions of the Software. 14 | ** 15 | ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | ** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | ** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | ** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | ** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | ** THE SOFTWARE. 22 | ** 23 | ****************************************************************************/ 24 | 25 | #include "base64.h" 26 | #include 27 | 28 | size_t base64_decode_alloc(unsigned char **out, const char *in, size_t len, int options) 29 | { 30 | unsigned char *result = malloc(len); /* We're lazy */ 31 | if (result) { 32 | len = base64_decode(result, in, len, options); 33 | *out = result; 34 | if (len + 1 != 0) 35 | return len; 36 | free(result); 37 | } 38 | *out = NULL; 39 | return ~(size_t)0; 40 | 41 | } 42 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | project(libbase64 C) 2 | cmake_minimum_required(VERSION 3.0) 3 | cmake_policy(SET CMP0054 NEW) 4 | cmake_policy(SET CMP0063 NEW) 5 | 6 | # Check some features we need from the compiler 7 | include(CheckCCompilerFlag) 8 | include(CheckCSourceCompiles) 9 | include(CMakePushCheckState) 10 | 11 | macro(check_simd_support NAME cflag cflag_msvc snippet) 12 | if("${cflag}" STREQUAL "") 13 | set(${NAME}_CFLAG_SUPPORTED 1) 14 | set(${NAME}_CFLAG "") 15 | else() 16 | if (MSVC) 17 | set(${NAME}_CFLAG ${cflag_msvc}) 18 | else() 19 | set(${NAME}_CFLAG ${cflag}) 20 | endif() 21 | check_c_compiler_flag(${${NAME}_CFLAG} ${NAME}_CFLAG_SUPPORTED) 22 | endif() 23 | if (${NAME}_CFLAG_SUPPORTED) 24 | cmake_push_check_state(RESET) 25 | set(CMAKE_REQUIRED_FLAGS ${${NAME}_CFLAG}) 26 | check_c_source_compiles("${snippet}" ${NAME}_SUPPORTED) 27 | cmake_pop_check_state() 28 | endif() 29 | endmacro() 30 | check_simd_support(AVX2 "-mavx2" "-arch:AVX2" 31 | "#include \n\ 32 | void f(void *ptr) { _mm256_broadcastsi128_si256(* (const __m128i *)ptr); } int main() {}") 33 | check_simd_support(SSSE3 "-mssse3" "" 34 | "#include \n\ 35 | __m128i f(__m128i a, __m128i b) { return _mm_alignr_epi8(a, b, 8); } int main() {}") 36 | 37 | check_c_source_compiles([=[ 38 | void f() __attribute__((ifunc("resolve_f"))); 39 | void f1() {} 40 | void resolve_f() { return f1; } 41 | int main() { f(); } 42 | ]=] IFUNC_SUPPORTED) 43 | 44 | check_c_source_compiles([=[#include 45 | typedef void (*fptr)(); 46 | static _Atomic fptr f = ATOMIC_VAR_INIT((fptr)0); 47 | int main() { f = (fptr)0; } 48 | ]=] ATOMICS_SUPPORTED) 49 | 50 | cmake_push_check_state(RESET) 51 | set(CMAKE_REQUIRED_FLAGS "-shared -Wl,-z,defs") 52 | check_c_source_compiles("void f() {}" LFLAG_NO_UNDEFINED_SUPPORTED) 53 | 54 | set(CMAKE_REQUIRED_FLAGS "-shared -Wl,-O1") 55 | check_c_source_compiles("void f() {}" LFLAG_O1) 56 | cmake_pop_check_state() 57 | 58 | add_subdirectory(src) 59 | -------------------------------------------------------------------------------- /src/base64_byteorder_p.h: -------------------------------------------------------------------------------- 1 | /**************************************************************************** 2 | ** 3 | ** Copyright (C) 2015 Intel Corporation 4 | ** 5 | ** Permission is hereby granted, free of charge, to any person obtaining a copy 6 | ** of this software and associated documentation files (the "Software"), to deal 7 | ** in the Software without restriction, including without limitation the rights 8 | ** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | ** copies of the Software, and to permit persons to whom the Software is 10 | ** furnished to do so, subject to the following conditions: 11 | ** 12 | ** The above copyright notice and this permission notice shall be included in 13 | ** all copies or substantial portions of the Software. 14 | ** 15 | ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | ** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | ** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | ** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | ** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | ** THE SOFTWARE. 22 | ** 23 | ****************************************************************************/ 24 | 25 | #ifndef BASE64_BYTEORDER_P_H 26 | #define BASE64_BYTEORDER_P_H 27 | 28 | #include 29 | #include 30 | 31 | #ifndef __has_builtin 32 | # define __has_builtin(x) 0 33 | #endif 34 | 35 | #if (defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 403)) || \ 36 | __has_builtin(__builtin_bswap32) 37 | # if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ 38 | # define _base64_ntohl __builtin_bswap32 39 | # define _base64_htonl __builtin_bswap32 40 | # else 41 | # define _base64_ntohl 42 | # define _base64_htonl 43 | # endif 44 | #elif defined(_MSC_VER) 45 | /* MSVC, which implies Windows, which implies little-endian */ 46 | # define _base64_ntohl _byteswap_ulong 47 | # define _base64_htonl _byteswap_ulong 48 | #endif 49 | #ifndef _base64_ntohl 50 | # include 51 | # define _base64_ntohl ntohl 52 | # define _base64_htonl htonl 53 | #endif 54 | 55 | static inline uint32_t _base64_ntohl_unaligned(unsigned const char *ptr) 56 | { 57 | uint32_t val; 58 | memcpy(&val, ptr, sizeof(val)); 59 | return _base64_ntohl(val); 60 | } 61 | 62 | #endif 63 | -------------------------------------------------------------------------------- /src/base64_encode.c: -------------------------------------------------------------------------------- 1 | /**************************************************************************** 2 | ** 3 | ** Copyright (C) 2015 Intel Corporation 4 | ** 5 | ** Permission is hereby granted, free of charge, to any person obtaining a copy 6 | ** of this software and associated documentation files (the "Software"), to deal 7 | ** in the Software without restriction, including without limitation the rights 8 | ** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | ** copies of the Software, and to permit persons to whom the Software is 10 | ** furnished to do so, subject to the following conditions: 11 | ** 12 | ** The above copyright notice and this permission notice shall be included in 13 | ** all copies or substantial portions of the Software. 14 | ** 15 | ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | ** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | ** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | ** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | ** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | ** THE SOFTWARE. 22 | ** 23 | ****************************************************************************/ 24 | 25 | #include "base64.h" 26 | #include "base64_encode_p.h" 27 | 28 | #ifdef HAVE_ATOMICS 29 | # include 30 | #endif 31 | 32 | #ifdef HAVE_IFUNC 33 | /* Let the linker figure it out */ 34 | encode_function base64_encode __attribute__((ifunc("_base64_resolve_encode"))); 35 | #else 36 | static encode_function *_base64_resolve_encode(); 37 | char *base64_encode(char *out, const unsigned char *in, size_t len, int options) 38 | { 39 | typedef encode_function *encode_function_ptr; 40 | #ifdef HAVE_ATOMICS 41 | static _Atomic encode_function_ptr f = ATOMIC_VAR_INIT((encode_function_ptr)0); 42 | #else 43 | static encode_function_ptr f = (encode_function_ptr)0; 44 | #endif 45 | if (!f) 46 | f = _base64_resolve_encode(); 47 | return f(out, in, len, options); 48 | } 49 | #endif 50 | 51 | 52 | __private_extern__ encode_function *_base64_resolve_encode() 53 | { 54 | #ifdef HAVE_AVX2 55 | if (cpu_supports_AVX2) 56 | return &_base64_encode_avx2; 57 | #endif 58 | #ifdef HAVE_SSSE3 59 | if (cpu_supports_SSSE3) 60 | return &_base64_encode_ssse3; 61 | #endif 62 | return _base64_encode_plain; 63 | } 64 | -------------------------------------------------------------------------------- /src/base64_encode_p.h: -------------------------------------------------------------------------------- 1 | /**************************************************************************** 2 | ** 3 | ** Copyright (C) 2015 Intel Corporation 4 | ** 5 | ** Permission is hereby granted, free of charge, to any person obtaining a copy 6 | ** of this software and associated documentation files (the "Software"), to deal 7 | ** in the Software without restriction, including without limitation the rights 8 | ** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | ** copies of the Software, and to permit persons to whom the Software is 10 | ** furnished to do so, subject to the following conditions: 11 | ** 12 | ** The above copyright notice and this permission notice shall be included in 13 | ** all copies or substantial portions of the Software. 14 | ** 15 | ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | ** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | ** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | ** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | ** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | ** THE SOFTWARE. 22 | ** 23 | ****************************************************************************/ 24 | 25 | #include "base64.h" 26 | 27 | #if defined(__APPLE__) 28 | /* nothing */ 29 | #elif defined(__GNUC__) && !defined(_WIN32) 30 | # define __private_extern__ __attribute__((visibility("hidden"))) 31 | #else 32 | # define __private_extern__ 33 | #endif 34 | 35 | #define CPUID_SSSE3 1 36 | #define CPUID_AVX2 2 37 | #ifdef __SSSE3__ 38 | # define cpu_supports_SSSE3 1 39 | #elif defined(HAVE_BUILTIN_CPU_SUPPORTS) 40 | # define cpu_supports_SSSE3 __builtin_cpu_supports("ssse3") 41 | #else 42 | # define cpu_supports_SSSE3 _base64_cpuid() & CPUID_SSSE3 43 | #endif 44 | 45 | #ifdef __AVX2__ 46 | # define cpu_supports_AVX2 1 47 | #elif defined(HAVE_BUILTIN_CPU_SUPPORTS) 48 | # define cpu_supports_AVX2 __builtin_cpu_supports("avx2") 49 | #else 50 | # define cpu_supports_AVX2 _base64_cpuid() & CPUID_AVX2 51 | #endif 52 | 53 | __private_extern__ extern const char _base64_alphabet[64]; 54 | __private_extern__ extern const char _base64url_alphabet[64]; 55 | __private_extern__ extern const char _base64_alphabet_precombined[64*64][2]; 56 | __private_extern__ extern const char _base64url_alphabet_precombined[64*64][2]; 57 | 58 | __private_extern__ extern int _base64_cpuid(); 59 | 60 | __private_extern__ char * 61 | _base64_encode_tail(char *out, size_t offset, const unsigned char * in, size_t len, int options); 62 | 63 | typedef char *(encode_function)(char *, const unsigned char *, size_t, int); 64 | __private_extern__ extern encode_function _base64_encode_plain; 65 | __private_extern__ extern encode_function _base64_encode_ssse3; 66 | __private_extern__ extern encode_function _base64_encode_avx2; 67 | 68 | #define ALIGN_PROLOGUE(out, in, len, N) \ 69 | TBD 70 | -------------------------------------------------------------------------------- /src/base64_cpuid.c: -------------------------------------------------------------------------------- 1 | /**************************************************************************** 2 | ** 3 | ** Copyright (C) 2015 Intel Corporation 4 | ** 5 | ** Permission is hereby granted, free of charge, to any person obtaining a copy 6 | ** of this software and associated documentation files (the "Software"), to deal 7 | ** in the Software without restriction, including without limitation the rights 8 | ** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | ** copies of the Software, and to permit persons to whom the Software is 10 | ** furnished to do so, subject to the following conditions: 11 | ** 12 | ** The above copyright notice and this permission notice shall be included in 13 | ** all copies or substantial portions of the Software. 14 | ** 15 | ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | ** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | ** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | ** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | ** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | ** THE SOFTWARE. 22 | ** 23 | ****************************************************************************/ 24 | 25 | #include "base64_encode_p.h" 26 | 27 | #if (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__) || defined(__iamcu__))) || \ 28 | (defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))) 29 | # ifdef __GNUC__ 30 | # include 31 | # define __cpuidex(array, function, subfunction) \ 32 | __cpuid_count(function, subfunction, array[0], array[1], array[2], array[3]) 33 | static unsigned long _xgetbv(unsigned int n) 34 | { 35 | unsigned long eax, edx; 36 | __asm__ (".byte 0x0F, 0x01, 0xD0" /* xgetbv instruction */ 37 | : "=a" (eax), "=d" (edx) 38 | : "c" (n)); 39 | return edx << 32 | eax; 40 | } 41 | # else 42 | static unsigned int __get_cpuid_max(unsigned int __ext, unsigned int *__sig) 43 | { 44 | int array[4]; 45 | __cpuid(array, 0); 46 | return array[0] 47 | } 48 | # endif 49 | 50 | # ifndef bit_SSSE3 51 | # define bit_SSSE3 (1 << 9) 52 | # endif 53 | # ifndef bit_AVX2 54 | # define bit_AVX2 (1 << 5) 55 | # endif 56 | 57 | int _base64_cpuid() 58 | { 59 | enum { eax = 0, ebx = 1, ecx = 2, edx = 3 }; 60 | 61 | int array[4]; 62 | unsigned max = __get_cpuid_max(0, NULL); 63 | if (sizeof(void *) > 4) { 64 | if (max < 1) 65 | return 0; 66 | } 67 | 68 | __cpuidex(array, 1, 0); 69 | int result = !!(array[ecx] & bit_SSSE3) * CPUID_SSSE3; 70 | 71 | /* check AVX2 */ 72 | if (max < 7 || (array[ecx] & bit_OSXSAVE) == 0) 73 | return result; 74 | 75 | __cpuidex(array, 7, 0); 76 | if (array[ebx] & bit_AVX2) { 77 | /* CPU supports AVX2; check if the OS enabled it */ 78 | unsigned long v = _xgetbv(0); 79 | if (v & 6) 80 | result |= CPUID_AVX2; 81 | } 82 | return result; 83 | } 84 | #else 85 | int _base64_cpuid() { return 0; } 86 | #endif 87 | -------------------------------------------------------------------------------- /src/base64_encode_avx2.c: -------------------------------------------------------------------------------- 1 | /**************************************************************************** 2 | ** 3 | ** Copyright (C) 2015 Intel Corporation 4 | ** 5 | ** Permission is hereby granted, free of charge, to any person obtaining a copy 6 | ** of this software and associated documentation files (the "Software"), to deal 7 | ** in the Software without restriction, including without limitation the rights 8 | ** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | ** copies of the Software, and to permit persons to whom the Software is 10 | ** furnished to do so, subject to the following conditions: 11 | ** 12 | ** The above copyright notice and this permission notice shall be included in 13 | ** all copies or substantial portions of the Software. 14 | ** 15 | ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | ** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | ** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | ** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | ** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | ** THE SOFTWARE. 22 | ** 23 | ****************************************************************************/ 24 | 25 | #include "base64_encode_p.h" 26 | #include "base64_byteorder_p.h" 27 | #include 28 | #include 29 | #include 30 | #include 31 | 32 | static inline void do_encode_6bytes(const char (*alphabet)[2], char *out, __m128i chunk) 33 | { 34 | uint32_t v0, v1, v2, v3; 35 | v0 = _mm_extract_epi32(chunk, 0); 36 | v1 = _mm_extract_epi32(chunk, 1); 37 | v2 = _mm_extract_epi32(chunk, 2); 38 | v3 = _mm_extract_epi32(chunk, 3); 39 | memcpy(out + 0, alphabet[v0], 2); 40 | memcpy(out + 2, alphabet[v1], 2); 41 | memcpy(out + 4, alphabet[v2], 2); 42 | memcpy(out + 6, alphabet[v3], 2); 43 | } 44 | 45 | static inline void do_encode_12bytes(const char (*alphabet)[2], char *out, __m256i chunk) 46 | { 47 | const __m256i shufflemask = _mm256_set_epi8( 48 | -1, 9, 10, 11, 49 | -1, 9, 10, 11, 50 | -1, 6, 7, 8, 51 | -1, 6, 7, 8, 52 | -1, 3, 4, 5, 53 | -1, 3, 4, 5, 54 | -1, 0, 1, 2, 55 | -1, 0, 1, 2 56 | ); 57 | const __m256i shifts = _mm256_set_epi32(0, 12, 0, 12, 0, 12, 0, 12); 58 | const __m256i masks = _mm256_set1_epi32(4095); 59 | 60 | // convert from big endian and rearrange the bytes 61 | chunk = _mm256_shuffle_epi8(chunk, shufflemask); 62 | chunk = _mm256_srlv_epi32(chunk, shifts); 63 | chunk = _mm256_and_si256(chunk, masks); 64 | 65 | // write the two halves to memory 66 | do_encode_6bytes(alphabet, out + 0, _mm256_extracti128_si256(chunk, 0)); 67 | do_encode_6bytes(alphabet, out + 8, _mm256_extracti128_si256(chunk, 1)); 68 | } 69 | 70 | char *_base64_encode_avx2(char *out, const unsigned char *in, size_t n, int options) 71 | { 72 | size_t i; 73 | size_t o = 0; 74 | 75 | const char (*alphabet)[2] = _base64_alphabet_precombined; 76 | if (options & Base64UseUrlAlphabet) 77 | alphabet = _base64url_alphabet_precombined; 78 | 79 | for (i = 0; n - i >= 48; i += 48) { 80 | // read 48 bytes and duplicate each 16-byte chunk in the high part of the register 81 | __m256i chunk1 = _mm256_broadcastsi128_si256(* (const __m128i *)&in[i+0]); 82 | __m256i chunk2 = _mm256_broadcastsi128_si256(* (const __m128i *)&in[i+16]); 83 | __m256i chunk3 = _mm256_broadcastsi128_si256(* (const __m128i *)&in[i+32]); 84 | 85 | // first chunk of 12 bytes 86 | do_encode_12bytes(alphabet, out + o, chunk1); 87 | o += 16; 88 | 89 | // second chunk: 4 bytes left in chunk1 90 | do_encode_12bytes(alphabet, out + o, _mm256_alignr_epi8(chunk2, chunk1, 12)); 91 | o += 16; 92 | 93 | // third chunk: 8 bytes left in chunk2 94 | do_encode_12bytes(alphabet, out + o, _mm256_alignr_epi8(chunk3, chunk2, 8)); 95 | o += 16; 96 | 97 | // fourth chunk: 12 final bytes in chunk3 98 | do_encode_12bytes(alphabet, out + o, _mm256_srli_si256(chunk3, 4)); 99 | o += 16; 100 | 101 | if (options & Base64InsertLineBreaks) 102 | out[o++] = '\n'; 103 | } 104 | 105 | return _base64_encode_tail(out, o, in, n, options); 106 | } 107 | -------------------------------------------------------------------------------- /src/base64_encode_ssse3.c: -------------------------------------------------------------------------------- 1 | /**************************************************************************** 2 | ** 3 | ** Copyright (C) 2015 Intel Corporation 4 | ** 5 | ** Permission is hereby granted, free of charge, to any person obtaining a copy 6 | ** of this software and associated documentation files (the "Software"), to deal 7 | ** in the Software without restriction, including without limitation the rights 8 | ** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | ** copies of the Software, and to permit persons to whom the Software is 10 | ** furnished to do so, subject to the following conditions: 11 | ** 12 | ** The above copyright notice and this permission notice shall be included in 13 | ** all copies or substantial portions of the Software. 14 | ** 15 | ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | ** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | ** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | ** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | ** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | ** THE SOFTWARE. 22 | ** 23 | ****************************************************************************/ 24 | 25 | #include "base64_encode_p.h" 26 | #include "base64_byteorder_p.h" 27 | #include 28 | #include 29 | #include 30 | #include 31 | 32 | #ifdef __SSE4_1__ 33 | # include 34 | #endif 35 | 36 | static inline void do_encode_3bytes(const char (*alphabet)[2], char *out, uint_least32_t val) 37 | { 38 | // write 4 chars x 6 bits = 24 bits 39 | memcpy(out, alphabet[(val >> 12) & 4095], 2); 40 | memcpy(out + 2, alphabet[val & 4095], 2); 41 | } 42 | 43 | static inline void do_encode_12bytes(const char (*alphabet)[2], char *out, __m128i chunk) 44 | { 45 | // this shuffle mask converts the input data from 4x24 bits (12 bytes) to 46 | // 4x32 bits (16 bytes), while at the same time converting from big to 47 | // little endian 48 | const __m128i shufflemask = _mm_set_epi8( 49 | -1, 9, 10, 11, 50 | -1, 6, 7, 8, 51 | -1, 3, 4, 5, 52 | -1, 0, 1, 2 53 | ); 54 | 55 | chunk = _mm_shuffle_epi8(chunk, shufflemask); 56 | 57 | // extract the 4x32-bit onto regular registers 58 | uint32_t v0, v1, v2, v3; 59 | { 60 | #ifdef __SSE4_1__ 61 | v0 = _mm_extract_epi32(chunk, 0); 62 | v1 = _mm_extract_epi32(chunk, 1); 63 | v2 = _mm_extract_epi32(chunk, 2); 64 | v3 = _mm_extract_epi32(chunk, 3); 65 | #elif defined(__x86_64__) || defined(_M_X64) 66 | uint64_t half = _mm_cvtsi128_si64(chunk); 67 | v0 = half; 68 | v1 = half >> 32; 69 | chunk = _mm_srli_si128(chunk, 8); 70 | half = _mm_cvtsi128_si64(chunk); 71 | v2 = half; 72 | v3 = half >> 32; 73 | #else 74 | v0 = _mm_cvtsi128_si32(chunk); 75 | v1 = _mm_cvtsi128_si32(_mm_shuffle_epi32(chunk, 1)); 76 | v2 = _mm_cvtsi128_si32(_mm_shuffle_epi32(chunk, 2)); 77 | v3 = _mm_cvtsi128_si32(_mm_shuffle_epi32(chunk, 3)); 78 | #endif 79 | } 80 | 81 | 82 | do_encode_3bytes(alphabet, out, v0); 83 | do_encode_3bytes(alphabet, out + 4, v1); 84 | do_encode_3bytes(alphabet, out + 8, v2); 85 | do_encode_3bytes(alphabet, out + 12, v3); 86 | } 87 | 88 | char *_base64_encode_ssse3(char *out, const unsigned char *in, size_t n, int options) 89 | { 90 | size_t i; 91 | size_t o = 0; 92 | 93 | const char (*alphabet)[2] = _base64_alphabet_precombined; 94 | if (options & Base64UseUrlAlphabet) 95 | alphabet = _base64url_alphabet_precombined; 96 | 97 | for (i = 0; n - i >= 48; i += 48) { 98 | // read 48 bytes 99 | __m128i chunk1 = _mm_loadu_si128((const __m128i*)&in[i+0]); 100 | __m128i chunk2 = _mm_loadu_si128((const __m128i*)&in[i+16]); 101 | __m128i chunk3 = _mm_loadu_si128((const __m128i*)&in[i+32]); 102 | 103 | // first chunk of 12 bytes 104 | do_encode_12bytes(alphabet, out + o, chunk1); 105 | o += 16; 106 | 107 | // second chunk: 4 bytes left in chunk1 108 | do_encode_12bytes(alphabet, out + o, _mm_alignr_epi8(chunk2, chunk1, 12)); 109 | o += 16; 110 | 111 | // third chunk: 8 bytes left in chunk2 112 | do_encode_12bytes(alphabet, out + o, _mm_alignr_epi8(chunk3, chunk2, 8)); 113 | o += 16; 114 | 115 | // fourth chunk: 12 final bytes in chunk3 116 | do_encode_12bytes(alphabet, out + o, _mm_srli_si128(chunk3, 4)); 117 | o += 16; 118 | 119 | if (options & Base64InsertLineBreaks) 120 | out[o++] = '\n'; 121 | } 122 | 123 | return _base64_encode_tail(out, o, in, n, options); 124 | } 125 | -------------------------------------------------------------------------------- /src/base64_encode_plain.c: -------------------------------------------------------------------------------- 1 | /**************************************************************************** 2 | ** 3 | ** Copyright (C) 2015 Intel Corporation 4 | ** 5 | ** Permission is hereby granted, free of charge, to any person obtaining a copy 6 | ** of this software and associated documentation files (the "Software"), to deal 7 | ** in the Software without restriction, including without limitation the rights 8 | ** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | ** copies of the Software, and to permit persons to whom the Software is 10 | ** furnished to do so, subject to the following conditions: 11 | ** 12 | ** The above copyright notice and this permission notice shall be included in 13 | ** all copies or substantial portions of the Software. 14 | ** 15 | ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | ** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | ** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | ** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | ** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | ** THE SOFTWARE. 22 | ** 23 | ****************************************************************************/ 24 | 25 | #include "base64_encode_p.h" 26 | #include "base64_byteorder_p.h" 27 | #include 28 | #include 29 | #include 30 | 31 | char *_base64_encode_tail(char *out, size_t o, const unsigned char *in, size_t n, int options) 32 | { 33 | size_t i = 0; 34 | const char *alphabet = options & Base64UseUrlAlphabet ? _base64url_alphabet : _base64_alphabet; 35 | 36 | // main loop: 37 | if (n >= 3) { 38 | // read 3 bytes x 8 bits = 24 bits 39 | uint_least32_t val = (in[0] << 16) | (in[1] << 8) | in[2]; 40 | i = 3; 41 | 42 | #if !defined(__OPTIMIZE_SIZE__) 43 | // raw speed, use the precombined alphabet and split the code on whether 44 | // we're inserting line breaks 45 | const char (*alphabet2)[2] = _base64_alphabet_precombined; 46 | if (options & Base64UseUrlAlphabet) 47 | alphabet2 = _base64url_alphabet_precombined; 48 | 49 | if ((options & Base64InsertLineBreaks) == 0) { 50 | while (true) { 51 | // write 4 chars x 6 bits = 24 bits 52 | memcpy(out + o + 2, alphabet2[(val >> 12) & 4095], 2); 53 | memcpy(out + o + 2, alphabet2[val & 4095], 2); 54 | o += 4; 55 | 56 | if (i >= n) 57 | break; 58 | val = _base64_ntohl_unaligned(in + i - 1); 59 | i += 3; 60 | } 61 | } else { 62 | while (true) { 63 | // write 4 chars x 6 bits = 24 bits 64 | memcpy(out + o + 2, alphabet2[(val >> 12) & 4095], 2); 65 | memcpy(out + o + 2, alphabet2[val & 4095], 2); 66 | o += 4; 67 | 68 | if (options & Base64InsertLineBreaks && o % 64 == 0) 69 | out[o++] = '\n'; 70 | 71 | if (i >= n) 72 | break; 73 | val = _base64_ntohl_unaligned(in + i - 1); 74 | i += 3; 75 | } 76 | } 77 | #else 78 | // optimizing for size, don't use the precombined alphabet 79 | while (true) { 80 | for (i = 0; n - i >= 3; i += 3) { 81 | // write 4 chars x 6 bits = 24 bits 82 | out[o++] = alphabet[(val >> 18) & 0x3f]; 83 | out[o++] = alphabet[(val >> 12) & 0x3f]; 84 | out[o++] = alphabet[(val >> 6) & 0x3f]; 85 | out]o++] = alphabet[val & 0x3f]; 86 | 87 | if (options & Base64InsertLineBreaks && o % 64 == 0) 88 | out[o++] = '\n'; 89 | 90 | if (i >= n) 91 | break; 92 | val = _base64_ntohl_unaligned(in + i - 1); 93 | i += 3; 94 | } 95 | } 96 | #endif 97 | } 98 | 99 | if (n - i) { 100 | char filler = options & Base64OmitPadding ? '\0' : '='; 101 | uint_least32_t val = (in[i] << 8); 102 | 103 | out[o + 4] = '\0'; 104 | out[o + 3] = filler; 105 | if (n - i == 2) { 106 | // write the third char in 3 chars x 6 bits = 18 bits 107 | val |= in[i + 1]; 108 | out[o + 2] = alphabet[(val >> 6) & 0x3f]; 109 | } else { 110 | out[o + 2] = filler; 111 | } 112 | out[o + 1] = alphabet[(val >> 12) & 0x3f]; 113 | out[o + 0] = alphabet[(val >> 18) & 0x3f]; 114 | } else { 115 | out[o + 0] = '\0'; 116 | } 117 | return out; 118 | } 119 | 120 | char *_base64_encode_plain(char *out, const unsigned char *in, size_t len, int options) 121 | { 122 | return _base64_encode_tail(out, 0, in, len, options); 123 | } 124 | -------------------------------------------------------------------------------- /src/base64_decode.c: -------------------------------------------------------------------------------- 1 | /**************************************************************************** 2 | ** 3 | ** Copyright (C) 2015 Intel Corporation 4 | ** 5 | ** Permission is hereby granted, free of charge, to any person obtaining a copy 6 | ** of this software and associated documentation files (the "Software"), to deal 7 | ** in the Software without restriction, including without limitation the rights 8 | ** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | ** copies of the Software, and to permit persons to whom the Software is 10 | ** furnished to do so, subject to the following conditions: 11 | ** 12 | ** The above copyright notice and this permission notice shall be included in 13 | ** all copies or substantial portions of the Software. 14 | ** 15 | ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | ** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | ** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | ** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | ** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | ** THE SOFTWARE. 22 | ** 23 | ****************************************************************************/ 24 | 25 | #include "base64.h" 26 | #include 27 | #include 28 | #include 29 | #include 30 | 31 | static const int8_t base64_reverse_alphabet[256] = { 32 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 34 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 35 | 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, 36 | -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 37 | 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, 38 | -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 39 | 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, 40 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 41 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 42 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 43 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 45 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 46 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 47 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 48 | }; 49 | 50 | static const int8_t base64url_reverse_alphabet[256] = { 51 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 52 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 53 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, 54 | 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, 55 | -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 56 | 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, 63, 57 | -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 58 | 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, 59 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 60 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 61 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 63 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 64 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 66 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 67 | }; 68 | 69 | size_t base64_decode(unsigned char *buffer, const char *string, size_t len, int options) 70 | { 71 | if (len + 1 == 0) 72 | len = strlen(string); 73 | 74 | uint8_t *out = buffer; 75 | const uint8_t *in = (const uint8_t *)string; 76 | const uint8_t *end = in + len; 77 | const int8_t *reverse_alphabet = options & Base64UseUrlAlphabet ? 78 | base64url_reverse_alphabet : 79 | base64_reverse_alphabet; 80 | bool done = false; 81 | while (!done && in < end) { 82 | if (reverse_alphabet[in[0]] < 0 || reverse_alphabet[in[1]] < 0) { 83 | if (in[0] == '\0') 84 | done = true; 85 | break; 86 | } 87 | 88 | uint32_t val = reverse_alphabet[in[0]] << 18; 89 | val |= reverse_alphabet[in[1]] << 12; 90 | if (in[2] == '=' || in[2] == '\0') { 91 | if (in[2] == '=' && (in[3] != '=' || in[4] != '\0')) 92 | break; 93 | val >>= 12; 94 | done = true; 95 | } else if (in[3] == '=' || in[3] == '\0') { 96 | if (in[3] == '=' && in[4] != '\0') 97 | break; 98 | val >>= 6; 99 | val |= reverse_alphabet[in[2]]; 100 | done = true; 101 | } else { 102 | val |= reverse_alphabet[in[2]] << 6; 103 | val |= reverse_alphabet[in[3]]; 104 | } 105 | 106 | *out++ = val >> 16; 107 | *out++ = val >> 8; 108 | *out++ = val; 109 | in += 4; 110 | } 111 | 112 | return out - buffer; 113 | } 114 | -------------------------------------------------------------------------------- /src/base64.h: -------------------------------------------------------------------------------- 1 | /**************************************************************************** 2 | ** 3 | ** Copyright (C) 2015 Intel Corporation 4 | ** 5 | ** Permission is hereby granted, free of charge, to any person obtaining a copy 6 | ** of this software and associated documentation files (the "Software"), to deal 7 | ** in the Software without restriction, including without limitation the rights 8 | ** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | ** copies of the Software, and to permit persons to whom the Software is 10 | ** furnished to do so, subject to the following conditions: 11 | ** 12 | ** The above copyright notice and this permission notice shall be included in 13 | ** all copies or substantial portions of the Software. 14 | ** 15 | ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | ** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | ** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | ** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | ** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | ** THE SOFTWARE. 22 | ** 23 | ****************************************************************************/ 24 | 25 | #ifndef LIBBASE64_BASE64_H 26 | #define LIBBASE64_BASE64_H 27 | 28 | #include 29 | 30 | #ifndef LIBBASE64_API 31 | # ifdef base64_EXPORTS 32 | # ifdef _WIN32 33 | # define LIBBASE64_API __declspec(dllexport) 34 | # elif defined(__ELF__) 35 | # define LIBBASE64_API __attribute__((visibility("protected"))) 36 | # else 37 | # define LIBBASE64_API __attribute__((visibility("default"))) 38 | # endif 39 | # else 40 | # ifdef _WIN32 41 | # define LIBBASE64_API __declspec(dllimport) 42 | # else 43 | # define LIBBASE64_API __attribute__((visibility("default"))) 44 | # endif 45 | # endif 46 | #endif 47 | 48 | #ifdef __cplusplus 49 | # define LIBBASE64_INLINE_API inline 50 | extern "C" { 51 | #else 52 | # define LIBBASE64_INLINE_API static inline 53 | #endif 54 | 55 | typedef enum Base64Options { 56 | /* used in both encoding and decoding: */ 57 | Base64UseOriginalAlphabet = 0, 58 | Base64UseUrlAlphabet = 1, 59 | Base64EmitPadding = 0, 60 | Base64OmitPadding = 2, 61 | 62 | /* used in encoding */ 63 | Base64InsertLineBreaks = 0x10, 64 | 65 | /* used in decoding: */ 66 | Base64SkipLineBreaks = 0x10, 67 | Base64SkipBlanks = 0x20 | Base64SkipLineBreaks, 68 | Base64SkipUnknown = 0x40, 69 | 70 | /* variant selection */ 71 | Base64Variant = Base64UseOriginalAlphabet | Base64EmitPadding, 72 | Base64UrlVariant = Base64UseUrlAlphabet | Base64OmitPadding 73 | } Base64Options; 74 | 75 | /*! 76 | * Returns the minimum size of the buffer that can hold the encoded version of 77 | * an input data of size \a len, plus the terminating NUL. 78 | */ 79 | #ifdef __GNUC__ 80 | __attribute__((pure)) 81 | #endif 82 | LIBBASE64_INLINE_API size_t 83 | base64_encode_buffer_size(size_t len, int options) 84 | { 85 | len = (len + 5) / 3 * 4; 86 | if (options & Base64InsertLineBreaks) { 87 | /* libbase64 inserts one line break for every 64 output characters */ 88 | len += (len + 63) / 64; 89 | } 90 | return len; 91 | } 92 | 93 | /*! 94 | * Encodes \a len bytes from the \a in buffer to the \a out buffer, using the 95 | * encoding options specified in \a options. The \a out buffer must be big 96 | * enough to accommodate the entire encoded data, plus a terminating NUL (see 97 | * base64_encode_buffer_size()). 98 | * 99 | * This function returns \a out. 100 | * 101 | * The \a in and \a out buffers may overlap, provided that \a out starts no 102 | * earlier than \c{base64_encode_buffer_size(len, options) - len} bytes from \a 103 | * in. 104 | */ 105 | LIBBASE64_API char * 106 | base64_encode(char *out, const unsigned char *in, size_t len, int options); 107 | 108 | /*! 109 | * Allocates a buffer and encodes \a len bytes from the \a in buffer to it, 110 | * using \a options. This function returns the allocated buffer, which is NUL 111 | * terminated. The returned buffer should be freed with free() when no longer 112 | * needed. 113 | */ 114 | #ifdef __GNUC__ 115 | __attribute__((malloc)) 116 | #endif 117 | LIBBASE64_API char * 118 | base64_encode_alloc(const unsigned char *in, size_t len, int options); 119 | 120 | /*! 121 | * Decodes \a len Base64-encoded bytes from the \a in buffer to the \a out 122 | * buffer, using the decoding options specified in \a options. The \a out 123 | * buffer must be big enough to accommodate the entire decoded data. The \a in 124 | * and \a out pointers may be the same, in which case this function will 125 | * perform in-place decoding. 126 | * 127 | * If \a len is SIZE_MAX, this function decodes up until the NUL-terminating 128 | * character. Otherwise, it will process the NUL characters like any other. 129 | * 130 | * If there was an error during decoding, this function returns SIZE_MAX and 131 | * the contents of the \a out buffer are undefined. Otherwise, it returns the 132 | * number of bytes decoded. 133 | */ 134 | LIBBASE64_API size_t 135 | base64_decode(unsigned char *out, const char *in, size_t len, int options); 136 | 137 | /*! 138 | * Allocates a buffer and decodes \a len Base64-encoded bytes from the \a in 139 | * buffer to it, using the decoding options specified in \a options. The buffer 140 | * is returned in \a out and should be freed with free() when no longer needed. 141 | * 142 | * If \a len is SIZE_MAX, this function decodes up until the NUL-terminating 143 | * character. Otherwise, it will process the NUL characters like any other. 144 | * 145 | * If there was an error during decoding, this function returns SIZE_MAX and \a 146 | * out will be set to NULL. Otherwise, it returns the number of bytes decoded. 147 | */ 148 | LIBBASE64_API size_t base64_decode_alloc(unsigned char **out, const char *in, size_t len, int options); 149 | 150 | #ifdef __cplusplus 151 | } 152 | #endif 153 | 154 | #endif // LIBBASE64_BASE64_H 155 | -------------------------------------------------------------------------------- /src/base64_encode_alphabet.c: -------------------------------------------------------------------------------- 1 | /**************************************************************************** 2 | ** 3 | ** Copyright (C) 2015 Intel Corporation 4 | ** 5 | ** Permission is hereby granted, free of charge, to any person obtaining a copy 6 | ** of this software and associated documentation files (the "Software"), to deal 7 | ** in the Software without restriction, including without limitation the rights 8 | ** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | ** copies of the Software, and to permit persons to whom the Software is 10 | ** furnished to do so, subject to the following conditions: 11 | ** 12 | ** The above copyright notice and this permission notice shall be included in 13 | ** all copies or substantial portions of the Software. 14 | ** 15 | ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | ** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | ** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | ** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | ** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | ** THE SOFTWARE. 22 | ** 23 | ****************************************************************************/ 24 | 25 | #include "base64_encode_p.h" 26 | 27 | #if defined(__GNUC__) && !defined(__OPTIMIZE_SIZE__) 28 | # define ALIGNED(n) __attribute__((aligned(n))) 29 | #elif defined(_MSC_VER) 30 | # define ALIGNED(n) __declspec(aligned(n)) 31 | #else 32 | # define ALIGNED(n) 33 | #endif 34 | 35 | #ifdef __GNUC__ 36 | # ifdef __ELF__ 37 | __attribute__((section(".rodata.base64_alphabet2"))) 38 | # endif 39 | #endif 40 | ALIGNED(4096) const char _base64_alphabet_precombined[64*64][2] = { 41 | // 0 42 | {'A','A'},{'A','B'},{'A','C'},{'A','D'},{'A','E'},{'A','F'},{'A','G'},{'A','H'},{'A','I'},{'A','J'},{'A','K'},{'A','L'},{'A','M'},{'A','N'},{'A','O'},{'A','P'}, 43 | {'A','Q'},{'A','R'},{'A','S'},{'A','T'},{'A','U'},{'A','V'},{'A','W'},{'A','X'},{'A','Y'},{'A','Z'},{'A','a'},{'A','b'},{'A','c'},{'A','d'},{'A','e'},{'A','f'}, 44 | {'A','g'},{'A','h'},{'A','i'},{'A','j'},{'A','k'},{'A','l'},{'A','m'},{'A','n'},{'A','o'},{'A','p'},{'A','q'},{'A','r'},{'A','s'},{'A','t'},{'A','u'},{'A','v'}, 45 | {'A','w'},{'A','x'},{'A','y'},{'A','z'},{'A','0'},{'A','1'},{'A','2'},{'A','3'},{'A','4'},{'A','5'},{'A','6'},{'A','7'},{'A','8'},{'A','9'},{'A','+'},{'A','/'}, 46 | // 1 47 | {'B','A'},{'B','B'},{'B','C'},{'B','D'},{'B','E'},{'B','F'},{'B','G'},{'B','H'},{'B','I'},{'B','J'},{'B','K'},{'B','L'},{'B','M'},{'B','N'},{'B','O'},{'B','P'}, 48 | {'B','Q'},{'B','R'},{'B','S'},{'B','T'},{'B','U'},{'B','V'},{'B','W'},{'B','X'},{'B','Y'},{'B','Z'},{'B','a'},{'B','b'},{'B','c'},{'B','d'},{'B','e'},{'B','f'}, 49 | {'B','g'},{'B','h'},{'B','i'},{'B','j'},{'B','k'},{'B','l'},{'B','m'},{'B','n'},{'B','o'},{'B','p'},{'B','q'},{'B','r'},{'B','s'},{'B','t'},{'B','u'},{'B','v'}, 50 | {'B','w'},{'B','x'},{'B','y'},{'B','z'},{'B','0'},{'B','1'},{'B','2'},{'B','3'},{'B','4'},{'B','5'},{'B','6'},{'B','7'},{'B','8'},{'B','9'},{'B','+'},{'B','/'}, 51 | // 2 52 | {'C','A'},{'C','B'},{'C','C'},{'C','D'},{'C','E'},{'C','F'},{'C','G'},{'C','H'},{'C','I'},{'C','J'},{'C','K'},{'C','L'},{'C','M'},{'C','N'},{'C','O'},{'C','P'}, 53 | {'C','Q'},{'C','R'},{'C','S'},{'C','T'},{'C','U'},{'C','V'},{'C','W'},{'C','X'},{'C','Y'},{'C','Z'},{'C','a'},{'C','b'},{'C','c'},{'C','d'},{'C','e'},{'C','f'}, 54 | {'C','g'},{'C','h'},{'C','i'},{'C','j'},{'C','k'},{'C','l'},{'C','m'},{'C','n'},{'C','o'},{'C','p'},{'C','q'},{'C','r'},{'C','s'},{'C','t'},{'C','u'},{'C','v'}, 55 | {'C','w'},{'C','x'},{'C','y'},{'C','z'},{'C','0'},{'C','1'},{'C','2'},{'C','3'},{'C','4'},{'C','5'},{'C','6'},{'C','7'},{'C','8'},{'C','9'},{'C','+'},{'C','/'}, 56 | // 3 57 | {'D','A'},{'D','B'},{'D','C'},{'D','D'},{'D','E'},{'D','F'},{'D','G'},{'D','H'},{'D','I'},{'D','J'},{'D','K'},{'D','L'},{'D','M'},{'D','N'},{'D','O'},{'D','P'}, 58 | {'D','Q'},{'D','R'},{'D','S'},{'D','T'},{'D','U'},{'D','V'},{'D','W'},{'D','X'},{'D','Y'},{'D','Z'},{'D','a'},{'D','b'},{'D','c'},{'D','d'},{'D','e'},{'D','f'}, 59 | {'D','g'},{'D','h'},{'D','i'},{'D','j'},{'D','k'},{'D','l'},{'D','m'},{'D','n'},{'D','o'},{'D','p'},{'D','q'},{'D','r'},{'D','s'},{'D','t'},{'D','u'},{'D','v'}, 60 | {'D','w'},{'D','x'},{'D','y'},{'D','z'},{'D','0'},{'D','1'},{'D','2'},{'D','3'},{'D','4'},{'D','5'},{'D','6'},{'D','7'},{'D','8'},{'D','9'},{'D','+'},{'D','/'}, 61 | // 4 62 | {'E','A'},{'E','B'},{'E','C'},{'E','D'},{'E','E'},{'E','F'},{'E','G'},{'E','H'},{'E','I'},{'E','J'},{'E','K'},{'E','L'},{'E','M'},{'E','N'},{'E','O'},{'E','P'}, 63 | {'E','Q'},{'E','R'},{'E','S'},{'E','T'},{'E','U'},{'E','V'},{'E','W'},{'E','X'},{'E','Y'},{'E','Z'},{'E','a'},{'E','b'},{'E','c'},{'E','d'},{'E','e'},{'E','f'}, 64 | {'E','g'},{'E','h'},{'E','i'},{'E','j'},{'E','k'},{'E','l'},{'E','m'},{'E','n'},{'E','o'},{'E','p'},{'E','q'},{'E','r'},{'E','s'},{'E','t'},{'E','u'},{'E','v'}, 65 | {'E','w'},{'E','x'},{'E','y'},{'E','z'},{'E','0'},{'E','1'},{'E','2'},{'E','3'},{'E','4'},{'E','5'},{'E','6'},{'E','7'},{'E','8'},{'E','9'},{'E','+'},{'E','/'}, 66 | // 5 67 | {'F','A'},{'F','B'},{'F','C'},{'F','D'},{'F','E'},{'F','F'},{'F','G'},{'F','H'},{'F','I'},{'F','J'},{'F','K'},{'F','L'},{'F','M'},{'F','N'},{'F','O'},{'F','P'}, 68 | {'F','Q'},{'F','R'},{'F','S'},{'F','T'},{'F','U'},{'F','V'},{'F','W'},{'F','X'},{'F','Y'},{'F','Z'},{'F','a'},{'F','b'},{'F','c'},{'F','d'},{'F','e'},{'F','f'}, 69 | {'F','g'},{'F','h'},{'F','i'},{'F','j'},{'F','k'},{'F','l'},{'F','m'},{'F','n'},{'F','o'},{'F','p'},{'F','q'},{'F','r'},{'F','s'},{'F','t'},{'F','u'},{'F','v'}, 70 | {'F','w'},{'F','x'},{'F','y'},{'F','z'},{'F','0'},{'F','1'},{'F','2'},{'F','3'},{'F','4'},{'F','5'},{'F','6'},{'F','7'},{'F','8'},{'F','9'},{'F','+'},{'F','/'}, 71 | // 6 72 | {'G','A'},{'G','B'},{'G','C'},{'G','D'},{'G','E'},{'G','F'},{'G','G'},{'G','H'},{'G','I'},{'G','J'},{'G','K'},{'G','L'},{'G','M'},{'G','N'},{'G','O'},{'G','P'}, 73 | {'G','Q'},{'G','R'},{'G','S'},{'G','T'},{'G','U'},{'G','V'},{'G','W'},{'G','X'},{'G','Y'},{'G','Z'},{'G','a'},{'G','b'},{'G','c'},{'G','d'},{'G','e'},{'G','f'}, 74 | {'G','g'},{'G','h'},{'G','i'},{'G','j'},{'G','k'},{'G','l'},{'G','m'},{'G','n'},{'G','o'},{'G','p'},{'G','q'},{'G','r'},{'G','s'},{'G','t'},{'G','u'},{'G','v'}, 75 | {'G','w'},{'G','x'},{'G','y'},{'G','z'},{'G','0'},{'G','1'},{'G','2'},{'G','3'},{'G','4'},{'G','5'},{'G','6'},{'G','7'},{'G','8'},{'G','9'},{'G','+'},{'G','/'}, 76 | // 7 77 | {'H','A'},{'H','B'},{'H','C'},{'H','D'},{'H','E'},{'H','F'},{'H','G'},{'H','H'},{'H','I'},{'H','J'},{'H','K'},{'H','L'},{'H','M'},{'H','N'},{'H','O'},{'H','P'}, 78 | {'H','Q'},{'H','R'},{'H','S'},{'H','T'},{'H','U'},{'H','V'},{'H','W'},{'H','X'},{'H','Y'},{'H','Z'},{'H','a'},{'H','b'},{'H','c'},{'H','d'},{'H','e'},{'H','f'}, 79 | {'H','g'},{'H','h'},{'H','i'},{'H','j'},{'H','k'},{'H','l'},{'H','m'},{'H','n'},{'H','o'},{'H','p'},{'H','q'},{'H','r'},{'H','s'},{'H','t'},{'H','u'},{'H','v'}, 80 | {'H','w'},{'H','x'},{'H','y'},{'H','z'},{'H','0'},{'H','1'},{'H','2'},{'H','3'},{'H','4'},{'H','5'},{'H','6'},{'H','7'},{'H','8'},{'H','9'},{'H','+'},{'H','/'}, 81 | // 8 82 | {'I','A'},{'I','B'},{'I','C'},{'I','D'},{'I','E'},{'I','F'},{'I','G'},{'I','H'},{'I','I'},{'I','J'},{'I','K'},{'I','L'},{'I','M'},{'I','N'},{'I','O'},{'I','P'}, 83 | {'I','Q'},{'I','R'},{'I','S'},{'I','T'},{'I','U'},{'I','V'},{'I','W'},{'I','X'},{'I','Y'},{'I','Z'},{'I','a'},{'I','b'},{'I','c'},{'I','d'},{'I','e'},{'I','f'}, 84 | {'I','g'},{'I','h'},{'I','i'},{'I','j'},{'I','k'},{'I','l'},{'I','m'},{'I','n'},{'I','o'},{'I','p'},{'I','q'},{'I','r'},{'I','s'},{'I','t'},{'I','u'},{'I','v'}, 85 | {'I','w'},{'I','x'},{'I','y'},{'I','z'},{'I','0'},{'I','1'},{'I','2'},{'I','3'},{'I','4'},{'I','5'},{'I','6'},{'I','7'},{'I','8'},{'I','9'},{'I','+'},{'I','/'}, 86 | // 9 87 | {'J','A'},{'J','B'},{'J','C'},{'J','D'},{'J','E'},{'J','F'},{'J','G'},{'J','H'},{'J','I'},{'J','J'},{'J','K'},{'J','L'},{'J','M'},{'J','N'},{'J','O'},{'J','P'}, 88 | {'J','Q'},{'J','R'},{'J','S'},{'J','T'},{'J','U'},{'J','V'},{'J','W'},{'J','X'},{'J','Y'},{'J','Z'},{'J','a'},{'J','b'},{'J','c'},{'J','d'},{'J','e'},{'J','f'}, 89 | {'J','g'},{'J','h'},{'J','i'},{'J','j'},{'J','k'},{'J','l'},{'J','m'},{'J','n'},{'J','o'},{'J','p'},{'J','q'},{'J','r'},{'J','s'},{'J','t'},{'J','u'},{'J','v'}, 90 | {'J','w'},{'J','x'},{'J','y'},{'J','z'},{'J','0'},{'J','1'},{'J','2'},{'J','3'},{'J','4'},{'J','5'},{'J','6'},{'J','7'},{'J','8'},{'J','9'},{'J','+'},{'J','/'}, 91 | // 10 92 | {'K','A'},{'K','B'},{'K','C'},{'K','D'},{'K','E'},{'K','F'},{'K','G'},{'K','H'},{'K','I'},{'K','J'},{'K','K'},{'K','L'},{'K','M'},{'K','N'},{'K','O'},{'K','P'}, 93 | {'K','Q'},{'K','R'},{'K','S'},{'K','T'},{'K','U'},{'K','V'},{'K','W'},{'K','X'},{'K','Y'},{'K','Z'},{'K','a'},{'K','b'},{'K','c'},{'K','d'},{'K','e'},{'K','f'}, 94 | {'K','g'},{'K','h'},{'K','i'},{'K','j'},{'K','k'},{'K','l'},{'K','m'},{'K','n'},{'K','o'},{'K','p'},{'K','q'},{'K','r'},{'K','s'},{'K','t'},{'K','u'},{'K','v'}, 95 | {'K','w'},{'K','x'},{'K','y'},{'K','z'},{'K','0'},{'K','1'},{'K','2'},{'K','3'},{'K','4'},{'K','5'},{'K','6'},{'K','7'},{'K','8'},{'K','9'},{'K','+'},{'K','/'}, 96 | // 11 97 | {'L','A'},{'L','B'},{'L','C'},{'L','D'},{'L','E'},{'L','F'},{'L','G'},{'L','H'},{'L','I'},{'L','J'},{'L','K'},{'L','L'},{'L','M'},{'L','N'},{'L','O'},{'L','P'}, 98 | {'L','Q'},{'L','R'},{'L','S'},{'L','T'},{'L','U'},{'L','V'},{'L','W'},{'L','X'},{'L','Y'},{'L','Z'},{'L','a'},{'L','b'},{'L','c'},{'L','d'},{'L','e'},{'L','f'}, 99 | {'L','g'},{'L','h'},{'L','i'},{'L','j'},{'L','k'},{'L','l'},{'L','m'},{'L','n'},{'L','o'},{'L','p'},{'L','q'},{'L','r'},{'L','s'},{'L','t'},{'L','u'},{'L','v'}, 100 | {'L','w'},{'L','x'},{'L','y'},{'L','z'},{'L','0'},{'L','1'},{'L','2'},{'L','3'},{'L','4'},{'L','5'},{'L','6'},{'L','7'},{'L','8'},{'L','9'},{'L','+'},{'L','/'}, 101 | // 12 102 | {'M','A'},{'M','B'},{'M','C'},{'M','D'},{'M','E'},{'M','F'},{'M','G'},{'M','H'},{'M','I'},{'M','J'},{'M','K'},{'M','L'},{'M','M'},{'M','N'},{'M','O'},{'M','P'}, 103 | {'M','Q'},{'M','R'},{'M','S'},{'M','T'},{'M','U'},{'M','V'},{'M','W'},{'M','X'},{'M','Y'},{'M','Z'},{'M','a'},{'M','b'},{'M','c'},{'M','d'},{'M','e'},{'M','f'}, 104 | {'M','g'},{'M','h'},{'M','i'},{'M','j'},{'M','k'},{'M','l'},{'M','m'},{'M','n'},{'M','o'},{'M','p'},{'M','q'},{'M','r'},{'M','s'},{'M','t'},{'M','u'},{'M','v'}, 105 | {'M','w'},{'M','x'},{'M','y'},{'M','z'},{'M','0'},{'M','1'},{'M','2'},{'M','3'},{'M','4'},{'M','5'},{'M','6'},{'M','7'},{'M','8'},{'M','9'},{'M','+'},{'M','/'}, 106 | // 13 107 | {'N','A'},{'N','B'},{'N','C'},{'N','D'},{'N','E'},{'N','F'},{'N','G'},{'N','H'},{'N','I'},{'N','J'},{'N','K'},{'N','L'},{'N','M'},{'N','N'},{'N','O'},{'N','P'}, 108 | {'N','Q'},{'N','R'},{'N','S'},{'N','T'},{'N','U'},{'N','V'},{'N','W'},{'N','X'},{'N','Y'},{'N','Z'},{'N','a'},{'N','b'},{'N','c'},{'N','d'},{'N','e'},{'N','f'}, 109 | {'N','g'},{'N','h'},{'N','i'},{'N','j'},{'N','k'},{'N','l'},{'N','m'},{'N','n'},{'N','o'},{'N','p'},{'N','q'},{'N','r'},{'N','s'},{'N','t'},{'N','u'},{'N','v'}, 110 | {'N','w'},{'N','x'},{'N','y'},{'N','z'},{'N','0'},{'N','1'},{'N','2'},{'N','3'},{'N','4'},{'N','5'},{'N','6'},{'N','7'},{'N','8'},{'N','9'},{'N','+'},{'N','/'}, 111 | // 14 112 | {'O','A'},{'O','B'},{'O','C'},{'O','D'},{'O','E'},{'O','F'},{'O','G'},{'O','H'},{'O','I'},{'O','J'},{'O','K'},{'O','L'},{'O','M'},{'O','N'},{'O','O'},{'O','P'}, 113 | {'O','Q'},{'O','R'},{'O','S'},{'O','T'},{'O','U'},{'O','V'},{'O','W'},{'O','X'},{'O','Y'},{'O','Z'},{'O','a'},{'O','b'},{'O','c'},{'O','d'},{'O','e'},{'O','f'}, 114 | {'O','g'},{'O','h'},{'O','i'},{'O','j'},{'O','k'},{'O','l'},{'O','m'},{'O','n'},{'O','o'},{'O','p'},{'O','q'},{'O','r'},{'O','s'},{'O','t'},{'O','u'},{'O','v'}, 115 | {'O','w'},{'O','x'},{'O','y'},{'O','z'},{'O','0'},{'O','1'},{'O','2'},{'O','3'},{'O','4'},{'O','5'},{'O','6'},{'O','7'},{'O','8'},{'O','9'},{'O','+'},{'O','/'}, 116 | // 15 117 | {'P','A'},{'P','B'},{'P','C'},{'P','D'},{'P','E'},{'P','F'},{'P','G'},{'P','H'},{'P','I'},{'P','J'},{'P','K'},{'P','L'},{'P','M'},{'P','N'},{'P','O'},{'P','P'}, 118 | {'P','Q'},{'P','R'},{'P','S'},{'P','T'},{'P','U'},{'P','V'},{'P','W'},{'P','X'},{'P','Y'},{'P','Z'},{'P','a'},{'P','b'},{'P','c'},{'P','d'},{'P','e'},{'P','f'}, 119 | {'P','g'},{'P','h'},{'P','i'},{'P','j'},{'P','k'},{'P','l'},{'P','m'},{'P','n'},{'P','o'},{'P','p'},{'P','q'},{'P','r'},{'P','s'},{'P','t'},{'P','u'},{'P','v'}, 120 | {'P','w'},{'P','x'},{'P','y'},{'P','z'},{'P','0'},{'P','1'},{'P','2'},{'P','3'},{'P','4'},{'P','5'},{'P','6'},{'P','7'},{'P','8'},{'P','9'},{'P','+'},{'P','/'}, 121 | // 16 122 | {'Q','A'},{'Q','B'},{'Q','C'},{'Q','D'},{'Q','E'},{'Q','F'},{'Q','G'},{'Q','H'},{'Q','I'},{'Q','J'},{'Q','K'},{'Q','L'},{'Q','M'},{'Q','N'},{'Q','O'},{'Q','P'}, 123 | {'Q','Q'},{'Q','R'},{'Q','S'},{'Q','T'},{'Q','U'},{'Q','V'},{'Q','W'},{'Q','X'},{'Q','Y'},{'Q','Z'},{'Q','a'},{'Q','b'},{'Q','c'},{'Q','d'},{'Q','e'},{'Q','f'}, 124 | {'Q','g'},{'Q','h'},{'Q','i'},{'Q','j'},{'Q','k'},{'Q','l'},{'Q','m'},{'Q','n'},{'Q','o'},{'Q','p'},{'Q','q'},{'Q','r'},{'Q','s'},{'Q','t'},{'Q','u'},{'Q','v'}, 125 | {'Q','w'},{'Q','x'},{'Q','y'},{'Q','z'},{'Q','0'},{'Q','1'},{'Q','2'},{'Q','3'},{'Q','4'},{'Q','5'},{'Q','6'},{'Q','7'},{'Q','8'},{'Q','9'},{'Q','+'},{'Q','/'}, 126 | // 17 127 | {'R','A'},{'R','B'},{'R','C'},{'R','D'},{'R','E'},{'R','F'},{'R','G'},{'R','H'},{'R','I'},{'R','J'},{'R','K'},{'R','L'},{'R','M'},{'R','N'},{'R','O'},{'R','P'}, 128 | {'R','Q'},{'R','R'},{'R','S'},{'R','T'},{'R','U'},{'R','V'},{'R','W'},{'R','X'},{'R','Y'},{'R','Z'},{'R','a'},{'R','b'},{'R','c'},{'R','d'},{'R','e'},{'R','f'}, 129 | {'R','g'},{'R','h'},{'R','i'},{'R','j'},{'R','k'},{'R','l'},{'R','m'},{'R','n'},{'R','o'},{'R','p'},{'R','q'},{'R','r'},{'R','s'},{'R','t'},{'R','u'},{'R','v'}, 130 | {'R','w'},{'R','x'},{'R','y'},{'R','z'},{'R','0'},{'R','1'},{'R','2'},{'R','3'},{'R','4'},{'R','5'},{'R','6'},{'R','7'},{'R','8'},{'R','9'},{'R','+'},{'R','/'}, 131 | // 18 132 | {'S','A'},{'S','B'},{'S','C'},{'S','D'},{'S','E'},{'S','F'},{'S','G'},{'S','H'},{'S','I'},{'S','J'},{'S','K'},{'S','L'},{'S','M'},{'S','N'},{'S','O'},{'S','P'}, 133 | {'S','Q'},{'S','R'},{'S','S'},{'S','T'},{'S','U'},{'S','V'},{'S','W'},{'S','X'},{'S','Y'},{'S','Z'},{'S','a'},{'S','b'},{'S','c'},{'S','d'},{'S','e'},{'S','f'}, 134 | {'S','g'},{'S','h'},{'S','i'},{'S','j'},{'S','k'},{'S','l'},{'S','m'},{'S','n'},{'S','o'},{'S','p'},{'S','q'},{'S','r'},{'S','s'},{'S','t'},{'S','u'},{'S','v'}, 135 | {'S','w'},{'S','x'},{'S','y'},{'S','z'},{'S','0'},{'S','1'},{'S','2'},{'S','3'},{'S','4'},{'S','5'},{'S','6'},{'S','7'},{'S','8'},{'S','9'},{'S','+'},{'S','/'}, 136 | // 19 137 | {'T','A'},{'T','B'},{'T','C'},{'T','D'},{'T','E'},{'T','F'},{'T','G'},{'T','H'},{'T','I'},{'T','J'},{'T','K'},{'T','L'},{'T','M'},{'T','N'},{'T','O'},{'T','P'}, 138 | {'T','Q'},{'T','R'},{'T','S'},{'T','T'},{'T','U'},{'T','V'},{'T','W'},{'T','X'},{'T','Y'},{'T','Z'},{'T','a'},{'T','b'},{'T','c'},{'T','d'},{'T','e'},{'T','f'}, 139 | {'T','g'},{'T','h'},{'T','i'},{'T','j'},{'T','k'},{'T','l'},{'T','m'},{'T','n'},{'T','o'},{'T','p'},{'T','q'},{'T','r'},{'T','s'},{'T','t'},{'T','u'},{'T','v'}, 140 | {'T','w'},{'T','x'},{'T','y'},{'T','z'},{'T','0'},{'T','1'},{'T','2'},{'T','3'},{'T','4'},{'T','5'},{'T','6'},{'T','7'},{'T','8'},{'T','9'},{'T','+'},{'T','/'}, 141 | // 20 142 | {'U','A'},{'U','B'},{'U','C'},{'U','D'},{'U','E'},{'U','F'},{'U','G'},{'U','H'},{'U','I'},{'U','J'},{'U','K'},{'U','L'},{'U','M'},{'U','N'},{'U','O'},{'U','P'}, 143 | {'U','Q'},{'U','R'},{'U','S'},{'U','T'},{'U','U'},{'U','V'},{'U','W'},{'U','X'},{'U','Y'},{'U','Z'},{'U','a'},{'U','b'},{'U','c'},{'U','d'},{'U','e'},{'U','f'}, 144 | {'U','g'},{'U','h'},{'U','i'},{'U','j'},{'U','k'},{'U','l'},{'U','m'},{'U','n'},{'U','o'},{'U','p'},{'U','q'},{'U','r'},{'U','s'},{'U','t'},{'U','u'},{'U','v'}, 145 | {'U','w'},{'U','x'},{'U','y'},{'U','z'},{'U','0'},{'U','1'},{'U','2'},{'U','3'},{'U','4'},{'U','5'},{'U','6'},{'U','7'},{'U','8'},{'U','9'},{'U','+'},{'U','/'}, 146 | // 21 147 | {'V','A'},{'V','B'},{'V','C'},{'V','D'},{'V','E'},{'V','F'},{'V','G'},{'V','H'},{'V','I'},{'V','J'},{'V','K'},{'V','L'},{'V','M'},{'V','N'},{'V','O'},{'V','P'}, 148 | {'V','Q'},{'V','R'},{'V','S'},{'V','T'},{'V','U'},{'V','V'},{'V','W'},{'V','X'},{'V','Y'},{'V','Z'},{'V','a'},{'V','b'},{'V','c'},{'V','d'},{'V','e'},{'V','f'}, 149 | {'V','g'},{'V','h'},{'V','i'},{'V','j'},{'V','k'},{'V','l'},{'V','m'},{'V','n'},{'V','o'},{'V','p'},{'V','q'},{'V','r'},{'V','s'},{'V','t'},{'V','u'},{'V','v'}, 150 | {'V','w'},{'V','x'},{'V','y'},{'V','z'},{'V','0'},{'V','1'},{'V','2'},{'V','3'},{'V','4'},{'V','5'},{'V','6'},{'V','7'},{'V','8'},{'V','9'},{'V','+'},{'V','/'}, 151 | // 22 152 | {'W','A'},{'W','B'},{'W','C'},{'W','D'},{'W','E'},{'W','F'},{'W','G'},{'W','H'},{'W','I'},{'W','J'},{'W','K'},{'W','L'},{'W','M'},{'W','N'},{'W','O'},{'W','P'}, 153 | {'W','Q'},{'W','R'},{'W','S'},{'W','T'},{'W','U'},{'W','V'},{'W','W'},{'W','X'},{'W','Y'},{'W','Z'},{'W','a'},{'W','b'},{'W','c'},{'W','d'},{'W','e'},{'W','f'}, 154 | {'W','g'},{'W','h'},{'W','i'},{'W','j'},{'W','k'},{'W','l'},{'W','m'},{'W','n'},{'W','o'},{'W','p'},{'W','q'},{'W','r'},{'W','s'},{'W','t'},{'W','u'},{'W','v'}, 155 | {'W','w'},{'W','x'},{'W','y'},{'W','z'},{'W','0'},{'W','1'},{'W','2'},{'W','3'},{'W','4'},{'W','5'},{'W','6'},{'W','7'},{'W','8'},{'W','9'},{'W','+'},{'W','/'}, 156 | // 23 157 | {'X','A'},{'X','B'},{'X','C'},{'X','D'},{'X','E'},{'X','F'},{'X','G'},{'X','H'},{'X','I'},{'X','J'},{'X','K'},{'X','L'},{'X','M'},{'X','N'},{'X','O'},{'X','P'}, 158 | {'X','Q'},{'X','R'},{'X','S'},{'X','T'},{'X','U'},{'X','V'},{'X','W'},{'X','X'},{'X','Y'},{'X','Z'},{'X','a'},{'X','b'},{'X','c'},{'X','d'},{'X','e'},{'X','f'}, 159 | {'X','g'},{'X','h'},{'X','i'},{'X','j'},{'X','k'},{'X','l'},{'X','m'},{'X','n'},{'X','o'},{'X','p'},{'X','q'},{'X','r'},{'X','s'},{'X','t'},{'X','u'},{'X','v'}, 160 | {'X','w'},{'X','x'},{'X','y'},{'X','z'},{'X','0'},{'X','1'},{'X','2'},{'X','3'},{'X','4'},{'X','5'},{'X','6'},{'X','7'},{'X','8'},{'X','9'},{'X','+'},{'X','/'}, 161 | // 24 162 | {'Y','A'},{'Y','B'},{'Y','C'},{'Y','D'},{'Y','E'},{'Y','F'},{'Y','G'},{'Y','H'},{'Y','I'},{'Y','J'},{'Y','K'},{'Y','L'},{'Y','M'},{'Y','N'},{'Y','O'},{'Y','P'}, 163 | {'Y','Q'},{'Y','R'},{'Y','S'},{'Y','T'},{'Y','U'},{'Y','V'},{'Y','W'},{'Y','X'},{'Y','Y'},{'Y','Z'},{'Y','a'},{'Y','b'},{'Y','c'},{'Y','d'},{'Y','e'},{'Y','f'}, 164 | {'Y','g'},{'Y','h'},{'Y','i'},{'Y','j'},{'Y','k'},{'Y','l'},{'Y','m'},{'Y','n'},{'Y','o'},{'Y','p'},{'Y','q'},{'Y','r'},{'Y','s'},{'Y','t'},{'Y','u'},{'Y','v'}, 165 | {'Y','w'},{'Y','x'},{'Y','y'},{'Y','z'},{'Y','0'},{'Y','1'},{'Y','2'},{'Y','3'},{'Y','4'},{'Y','5'},{'Y','6'},{'Y','7'},{'Y','8'},{'Y','9'},{'Y','+'},{'Y','/'}, 166 | // 25 167 | {'Z','A'},{'Z','B'},{'Z','C'},{'Z','D'},{'Z','E'},{'Z','F'},{'Z','G'},{'Z','H'},{'Z','I'},{'Z','J'},{'Z','K'},{'Z','L'},{'Z','M'},{'Z','N'},{'Z','O'},{'Z','P'}, 168 | {'Z','Q'},{'Z','R'},{'Z','S'},{'Z','T'},{'Z','U'},{'Z','V'},{'Z','W'},{'Z','X'},{'Z','Y'},{'Z','Z'},{'Z','a'},{'Z','b'},{'Z','c'},{'Z','d'},{'Z','e'},{'Z','f'}, 169 | {'Z','g'},{'Z','h'},{'Z','i'},{'Z','j'},{'Z','k'},{'Z','l'},{'Z','m'},{'Z','n'},{'Z','o'},{'Z','p'},{'Z','q'},{'Z','r'},{'Z','s'},{'Z','t'},{'Z','u'},{'Z','v'}, 170 | {'Z','w'},{'Z','x'},{'Z','y'},{'Z','z'},{'Z','0'},{'Z','1'},{'Z','2'},{'Z','3'},{'Z','4'},{'Z','5'},{'Z','6'},{'Z','7'},{'Z','8'},{'Z','9'},{'Z','+'},{'Z','/'}, 171 | // 26 172 | {'a','A'},{'a','B'},{'a','C'},{'a','D'},{'a','E'},{'a','F'},{'a','G'},{'a','H'},{'a','I'},{'a','J'},{'a','K'},{'a','L'},{'a','M'},{'a','N'},{'a','O'},{'a','P'}, 173 | {'a','Q'},{'a','R'},{'a','S'},{'a','T'},{'a','U'},{'a','V'},{'a','W'},{'a','X'},{'a','Y'},{'a','Z'},{'a','a'},{'a','b'},{'a','c'},{'a','d'},{'a','e'},{'a','f'}, 174 | {'a','g'},{'a','h'},{'a','i'},{'a','j'},{'a','k'},{'a','l'},{'a','m'},{'a','n'},{'a','o'},{'a','p'},{'a','q'},{'a','r'},{'a','s'},{'a','t'},{'a','u'},{'a','v'}, 175 | {'a','w'},{'a','x'},{'a','y'},{'a','z'},{'a','0'},{'a','1'},{'a','2'},{'a','3'},{'a','4'},{'a','5'},{'a','6'},{'a','7'},{'a','8'},{'a','9'},{'a','+'},{'a','/'}, 176 | // 27 177 | {'b','A'},{'b','B'},{'b','C'},{'b','D'},{'b','E'},{'b','F'},{'b','G'},{'b','H'},{'b','I'},{'b','J'},{'b','K'},{'b','L'},{'b','M'},{'b','N'},{'b','O'},{'b','P'}, 178 | {'b','Q'},{'b','R'},{'b','S'},{'b','T'},{'b','U'},{'b','V'},{'b','W'},{'b','X'},{'b','Y'},{'b','Z'},{'b','a'},{'b','b'},{'b','c'},{'b','d'},{'b','e'},{'b','f'}, 179 | {'b','g'},{'b','h'},{'b','i'},{'b','j'},{'b','k'},{'b','l'},{'b','m'},{'b','n'},{'b','o'},{'b','p'},{'b','q'},{'b','r'},{'b','s'},{'b','t'},{'b','u'},{'b','v'}, 180 | {'b','w'},{'b','x'},{'b','y'},{'b','z'},{'b','0'},{'b','1'},{'b','2'},{'b','3'},{'b','4'},{'b','5'},{'b','6'},{'b','7'},{'b','8'},{'b','9'},{'b','+'},{'b','/'}, 181 | // 28 182 | {'c','A'},{'c','B'},{'c','C'},{'c','D'},{'c','E'},{'c','F'},{'c','G'},{'c','H'},{'c','I'},{'c','J'},{'c','K'},{'c','L'},{'c','M'},{'c','N'},{'c','O'},{'c','P'}, 183 | {'c','Q'},{'c','R'},{'c','S'},{'c','T'},{'c','U'},{'c','V'},{'c','W'},{'c','X'},{'c','Y'},{'c','Z'},{'c','a'},{'c','b'},{'c','c'},{'c','d'},{'c','e'},{'c','f'}, 184 | {'c','g'},{'c','h'},{'c','i'},{'c','j'},{'c','k'},{'c','l'},{'c','m'},{'c','n'},{'c','o'},{'c','p'},{'c','q'},{'c','r'},{'c','s'},{'c','t'},{'c','u'},{'c','v'}, 185 | {'c','w'},{'c','x'},{'c','y'},{'c','z'},{'c','0'},{'c','1'},{'c','2'},{'c','3'},{'c','4'},{'c','5'},{'c','6'},{'c','7'},{'c','8'},{'c','9'},{'c','+'},{'c','/'}, 186 | // 29 187 | {'d','A'},{'d','B'},{'d','C'},{'d','D'},{'d','E'},{'d','F'},{'d','G'},{'d','H'},{'d','I'},{'d','J'},{'d','K'},{'d','L'},{'d','M'},{'d','N'},{'d','O'},{'d','P'}, 188 | {'d','Q'},{'d','R'},{'d','S'},{'d','T'},{'d','U'},{'d','V'},{'d','W'},{'d','X'},{'d','Y'},{'d','Z'},{'d','a'},{'d','b'},{'d','c'},{'d','d'},{'d','e'},{'d','f'}, 189 | {'d','g'},{'d','h'},{'d','i'},{'d','j'},{'d','k'},{'d','l'},{'d','m'},{'d','n'},{'d','o'},{'d','p'},{'d','q'},{'d','r'},{'d','s'},{'d','t'},{'d','u'},{'d','v'}, 190 | {'d','w'},{'d','x'},{'d','y'},{'d','z'},{'d','0'},{'d','1'},{'d','2'},{'d','3'},{'d','4'},{'d','5'},{'d','6'},{'d','7'},{'d','8'},{'d','9'},{'d','+'},{'d','/'}, 191 | // 30 192 | {'e','A'},{'e','B'},{'e','C'},{'e','D'},{'e','E'},{'e','F'},{'e','G'},{'e','H'},{'e','I'},{'e','J'},{'e','K'},{'e','L'},{'e','M'},{'e','N'},{'e','O'},{'e','P'}, 193 | {'e','Q'},{'e','R'},{'e','S'},{'e','T'},{'e','U'},{'e','V'},{'e','W'},{'e','X'},{'e','Y'},{'e','Z'},{'e','a'},{'e','b'},{'e','c'},{'e','d'},{'e','e'},{'e','f'}, 194 | {'e','g'},{'e','h'},{'e','i'},{'e','j'},{'e','k'},{'e','l'},{'e','m'},{'e','n'},{'e','o'},{'e','p'},{'e','q'},{'e','r'},{'e','s'},{'e','t'},{'e','u'},{'e','v'}, 195 | {'e','w'},{'e','x'},{'e','y'},{'e','z'},{'e','0'},{'e','1'},{'e','2'},{'e','3'},{'e','4'},{'e','5'},{'e','6'},{'e','7'},{'e','8'},{'e','9'},{'e','+'},{'e','/'}, 196 | // 31 197 | {'f','A'},{'f','B'},{'f','C'},{'f','D'},{'f','E'},{'f','F'},{'f','G'},{'f','H'},{'f','I'},{'f','J'},{'f','K'},{'f','L'},{'f','M'},{'f','N'},{'f','O'},{'f','P'}, 198 | {'f','Q'},{'f','R'},{'f','S'},{'f','T'},{'f','U'},{'f','V'},{'f','W'},{'f','X'},{'f','Y'},{'f','Z'},{'f','a'},{'f','b'},{'f','c'},{'f','d'},{'f','e'},{'f','f'}, 199 | {'f','g'},{'f','h'},{'f','i'},{'f','j'},{'f','k'},{'f','l'},{'f','m'},{'f','n'},{'f','o'},{'f','p'},{'f','q'},{'f','r'},{'f','s'},{'f','t'},{'f','u'},{'f','v'}, 200 | {'f','w'},{'f','x'},{'f','y'},{'f','z'},{'f','0'},{'f','1'},{'f','2'},{'f','3'},{'f','4'},{'f','5'},{'f','6'},{'f','7'},{'f','8'},{'f','9'},{'f','+'},{'f','/'}, 201 | // 32 202 | {'g','A'},{'g','B'},{'g','C'},{'g','D'},{'g','E'},{'g','F'},{'g','G'},{'g','H'},{'g','I'},{'g','J'},{'g','K'},{'g','L'},{'g','M'},{'g','N'},{'g','O'},{'g','P'}, 203 | {'g','Q'},{'g','R'},{'g','S'},{'g','T'},{'g','U'},{'g','V'},{'g','W'},{'g','X'},{'g','Y'},{'g','Z'},{'g','a'},{'g','b'},{'g','c'},{'g','d'},{'g','e'},{'g','f'}, 204 | {'g','g'},{'g','h'},{'g','i'},{'g','j'},{'g','k'},{'g','l'},{'g','m'},{'g','n'},{'g','o'},{'g','p'},{'g','q'},{'g','r'},{'g','s'},{'g','t'},{'g','u'},{'g','v'}, 205 | {'g','w'},{'g','x'},{'g','y'},{'g','z'},{'g','0'},{'g','1'},{'g','2'},{'g','3'},{'g','4'},{'g','5'},{'g','6'},{'g','7'},{'g','8'},{'g','9'},{'g','+'},{'g','/'}, 206 | // 33 207 | {'h','A'},{'h','B'},{'h','C'},{'h','D'},{'h','E'},{'h','F'},{'h','G'},{'h','H'},{'h','I'},{'h','J'},{'h','K'},{'h','L'},{'h','M'},{'h','N'},{'h','O'},{'h','P'}, 208 | {'h','Q'},{'h','R'},{'h','S'},{'h','T'},{'h','U'},{'h','V'},{'h','W'},{'h','X'},{'h','Y'},{'h','Z'},{'h','a'},{'h','b'},{'h','c'},{'h','d'},{'h','e'},{'h','f'}, 209 | {'h','g'},{'h','h'},{'h','i'},{'h','j'},{'h','k'},{'h','l'},{'h','m'},{'h','n'},{'h','o'},{'h','p'},{'h','q'},{'h','r'},{'h','s'},{'h','t'},{'h','u'},{'h','v'}, 210 | {'h','w'},{'h','x'},{'h','y'},{'h','z'},{'h','0'},{'h','1'},{'h','2'},{'h','3'},{'h','4'},{'h','5'},{'h','6'},{'h','7'},{'h','8'},{'h','9'},{'h','+'},{'h','/'}, 211 | // 34 212 | {'i','A'},{'i','B'},{'i','C'},{'i','D'},{'i','E'},{'i','F'},{'i','G'},{'i','H'},{'i','I'},{'i','J'},{'i','K'},{'i','L'},{'i','M'},{'i','N'},{'i','O'},{'i','P'}, 213 | {'i','Q'},{'i','R'},{'i','S'},{'i','T'},{'i','U'},{'i','V'},{'i','W'},{'i','X'},{'i','Y'},{'i','Z'},{'i','a'},{'i','b'},{'i','c'},{'i','d'},{'i','e'},{'i','f'}, 214 | {'i','g'},{'i','h'},{'i','i'},{'i','j'},{'i','k'},{'i','l'},{'i','m'},{'i','n'},{'i','o'},{'i','p'},{'i','q'},{'i','r'},{'i','s'},{'i','t'},{'i','u'},{'i','v'}, 215 | {'i','w'},{'i','x'},{'i','y'},{'i','z'},{'i','0'},{'i','1'},{'i','2'},{'i','3'},{'i','4'},{'i','5'},{'i','6'},{'i','7'},{'i','8'},{'i','9'},{'i','+'},{'i','/'}, 216 | // 35 217 | {'j','A'},{'j','B'},{'j','C'},{'j','D'},{'j','E'},{'j','F'},{'j','G'},{'j','H'},{'j','I'},{'j','J'},{'j','K'},{'j','L'},{'j','M'},{'j','N'},{'j','O'},{'j','P'}, 218 | {'j','Q'},{'j','R'},{'j','S'},{'j','T'},{'j','U'},{'j','V'},{'j','W'},{'j','X'},{'j','Y'},{'j','Z'},{'j','a'},{'j','b'},{'j','c'},{'j','d'},{'j','e'},{'j','f'}, 219 | {'j','g'},{'j','h'},{'j','i'},{'j','j'},{'j','k'},{'j','l'},{'j','m'},{'j','n'},{'j','o'},{'j','p'},{'j','q'},{'j','r'},{'j','s'},{'j','t'},{'j','u'},{'j','v'}, 220 | {'j','w'},{'j','x'},{'j','y'},{'j','z'},{'j','0'},{'j','1'},{'j','2'},{'j','3'},{'j','4'},{'j','5'},{'j','6'},{'j','7'},{'j','8'},{'j','9'},{'j','+'},{'j','/'}, 221 | // 36 222 | {'k','A'},{'k','B'},{'k','C'},{'k','D'},{'k','E'},{'k','F'},{'k','G'},{'k','H'},{'k','I'},{'k','J'},{'k','K'},{'k','L'},{'k','M'},{'k','N'},{'k','O'},{'k','P'}, 223 | {'k','Q'},{'k','R'},{'k','S'},{'k','T'},{'k','U'},{'k','V'},{'k','W'},{'k','X'},{'k','Y'},{'k','Z'},{'k','a'},{'k','b'},{'k','c'},{'k','d'},{'k','e'},{'k','f'}, 224 | {'k','g'},{'k','h'},{'k','i'},{'k','j'},{'k','k'},{'k','l'},{'k','m'},{'k','n'},{'k','o'},{'k','p'},{'k','q'},{'k','r'},{'k','s'},{'k','t'},{'k','u'},{'k','v'}, 225 | {'k','w'},{'k','x'},{'k','y'},{'k','z'},{'k','0'},{'k','1'},{'k','2'},{'k','3'},{'k','4'},{'k','5'},{'k','6'},{'k','7'},{'k','8'},{'k','9'},{'k','+'},{'k','/'}, 226 | // 37 227 | {'l','A'},{'l','B'},{'l','C'},{'l','D'},{'l','E'},{'l','F'},{'l','G'},{'l','H'},{'l','I'},{'l','J'},{'l','K'},{'l','L'},{'l','M'},{'l','N'},{'l','O'},{'l','P'}, 228 | {'l','Q'},{'l','R'},{'l','S'},{'l','T'},{'l','U'},{'l','V'},{'l','W'},{'l','X'},{'l','Y'},{'l','Z'},{'l','a'},{'l','b'},{'l','c'},{'l','d'},{'l','e'},{'l','f'}, 229 | {'l','g'},{'l','h'},{'l','i'},{'l','j'},{'l','k'},{'l','l'},{'l','m'},{'l','n'},{'l','o'},{'l','p'},{'l','q'},{'l','r'},{'l','s'},{'l','t'},{'l','u'},{'l','v'}, 230 | {'l','w'},{'l','x'},{'l','y'},{'l','z'},{'l','0'},{'l','1'},{'l','2'},{'l','3'},{'l','4'},{'l','5'},{'l','6'},{'l','7'},{'l','8'},{'l','9'},{'l','+'},{'l','/'}, 231 | // 38 232 | {'m','A'},{'m','B'},{'m','C'},{'m','D'},{'m','E'},{'m','F'},{'m','G'},{'m','H'},{'m','I'},{'m','J'},{'m','K'},{'m','L'},{'m','M'},{'m','N'},{'m','O'},{'m','P'}, 233 | {'m','Q'},{'m','R'},{'m','S'},{'m','T'},{'m','U'},{'m','V'},{'m','W'},{'m','X'},{'m','Y'},{'m','Z'},{'m','a'},{'m','b'},{'m','c'},{'m','d'},{'m','e'},{'m','f'}, 234 | {'m','g'},{'m','h'},{'m','i'},{'m','j'},{'m','k'},{'m','l'},{'m','m'},{'m','n'},{'m','o'},{'m','p'},{'m','q'},{'m','r'},{'m','s'},{'m','t'},{'m','u'},{'m','v'}, 235 | {'m','w'},{'m','x'},{'m','y'},{'m','z'},{'m','0'},{'m','1'},{'m','2'},{'m','3'},{'m','4'},{'m','5'},{'m','6'},{'m','7'},{'m','8'},{'m','9'},{'m','+'},{'m','/'}, 236 | // 39 237 | {'n','A'},{'n','B'},{'n','C'},{'n','D'},{'n','E'},{'n','F'},{'n','G'},{'n','H'},{'n','I'},{'n','J'},{'n','K'},{'n','L'},{'n','M'},{'n','N'},{'n','O'},{'n','P'}, 238 | {'n','Q'},{'n','R'},{'n','S'},{'n','T'},{'n','U'},{'n','V'},{'n','W'},{'n','X'},{'n','Y'},{'n','Z'},{'n','a'},{'n','b'},{'n','c'},{'n','d'},{'n','e'},{'n','f'}, 239 | {'n','g'},{'n','h'},{'n','i'},{'n','j'},{'n','k'},{'n','l'},{'n','m'},{'n','n'},{'n','o'},{'n','p'},{'n','q'},{'n','r'},{'n','s'},{'n','t'},{'n','u'},{'n','v'}, 240 | {'n','w'},{'n','x'},{'n','y'},{'n','z'},{'n','0'},{'n','1'},{'n','2'},{'n','3'},{'n','4'},{'n','5'},{'n','6'},{'n','7'},{'n','8'},{'n','9'},{'n','+'},{'n','/'}, 241 | // 40 242 | {'o','A'},{'o','B'},{'o','C'},{'o','D'},{'o','E'},{'o','F'},{'o','G'},{'o','H'},{'o','I'},{'o','J'},{'o','K'},{'o','L'},{'o','M'},{'o','N'},{'o','O'},{'o','P'}, 243 | {'o','Q'},{'o','R'},{'o','S'},{'o','T'},{'o','U'},{'o','V'},{'o','W'},{'o','X'},{'o','Y'},{'o','Z'},{'o','a'},{'o','b'},{'o','c'},{'o','d'},{'o','e'},{'o','f'}, 244 | {'o','g'},{'o','h'},{'o','i'},{'o','j'},{'o','k'},{'o','l'},{'o','m'},{'o','n'},{'o','o'},{'o','p'},{'o','q'},{'o','r'},{'o','s'},{'o','t'},{'o','u'},{'o','v'}, 245 | {'o','w'},{'o','x'},{'o','y'},{'o','z'},{'o','0'},{'o','1'},{'o','2'},{'o','3'},{'o','4'},{'o','5'},{'o','6'},{'o','7'},{'o','8'},{'o','9'},{'o','+'},{'o','/'}, 246 | // 41 247 | {'p','A'},{'p','B'},{'p','C'},{'p','D'},{'p','E'},{'p','F'},{'p','G'},{'p','H'},{'p','I'},{'p','J'},{'p','K'},{'p','L'},{'p','M'},{'p','N'},{'p','O'},{'p','P'}, 248 | {'p','Q'},{'p','R'},{'p','S'},{'p','T'},{'p','U'},{'p','V'},{'p','W'},{'p','X'},{'p','Y'},{'p','Z'},{'p','a'},{'p','b'},{'p','c'},{'p','d'},{'p','e'},{'p','f'}, 249 | {'p','g'},{'p','h'},{'p','i'},{'p','j'},{'p','k'},{'p','l'},{'p','m'},{'p','n'},{'p','o'},{'p','p'},{'p','q'},{'p','r'},{'p','s'},{'p','t'},{'p','u'},{'p','v'}, 250 | {'p','w'},{'p','x'},{'p','y'},{'p','z'},{'p','0'},{'p','1'},{'p','2'},{'p','3'},{'p','4'},{'p','5'},{'p','6'},{'p','7'},{'p','8'},{'p','9'},{'p','+'},{'p','/'}, 251 | // 42 252 | {'q','A'},{'q','B'},{'q','C'},{'q','D'},{'q','E'},{'q','F'},{'q','G'},{'q','H'},{'q','I'},{'q','J'},{'q','K'},{'q','L'},{'q','M'},{'q','N'},{'q','O'},{'q','P'}, 253 | {'q','Q'},{'q','R'},{'q','S'},{'q','T'},{'q','U'},{'q','V'},{'q','W'},{'q','X'},{'q','Y'},{'q','Z'},{'q','a'},{'q','b'},{'q','c'},{'q','d'},{'q','e'},{'q','f'}, 254 | {'q','g'},{'q','h'},{'q','i'},{'q','j'},{'q','k'},{'q','l'},{'q','m'},{'q','n'},{'q','o'},{'q','p'},{'q','q'},{'q','r'},{'q','s'},{'q','t'},{'q','u'},{'q','v'}, 255 | {'q','w'},{'q','x'},{'q','y'},{'q','z'},{'q','0'},{'q','1'},{'q','2'},{'q','3'},{'q','4'},{'q','5'},{'q','6'},{'q','7'},{'q','8'},{'q','9'},{'q','+'},{'q','/'}, 256 | // 43 257 | {'r','A'},{'r','B'},{'r','C'},{'r','D'},{'r','E'},{'r','F'},{'r','G'},{'r','H'},{'r','I'},{'r','J'},{'r','K'},{'r','L'},{'r','M'},{'r','N'},{'r','O'},{'r','P'}, 258 | {'r','Q'},{'r','R'},{'r','S'},{'r','T'},{'r','U'},{'r','V'},{'r','W'},{'r','X'},{'r','Y'},{'r','Z'},{'r','a'},{'r','b'},{'r','c'},{'r','d'},{'r','e'},{'r','f'}, 259 | {'r','g'},{'r','h'},{'r','i'},{'r','j'},{'r','k'},{'r','l'},{'r','m'},{'r','n'},{'r','o'},{'r','p'},{'r','q'},{'r','r'},{'r','s'},{'r','t'},{'r','u'},{'r','v'}, 260 | {'r','w'},{'r','x'},{'r','y'},{'r','z'},{'r','0'},{'r','1'},{'r','2'},{'r','3'},{'r','4'},{'r','5'},{'r','6'},{'r','7'},{'r','8'},{'r','9'},{'r','+'},{'r','/'}, 261 | // 44 262 | {'s','A'},{'s','B'},{'s','C'},{'s','D'},{'s','E'},{'s','F'},{'s','G'},{'s','H'},{'s','I'},{'s','J'},{'s','K'},{'s','L'},{'s','M'},{'s','N'},{'s','O'},{'s','P'}, 263 | {'s','Q'},{'s','R'},{'s','S'},{'s','T'},{'s','U'},{'s','V'},{'s','W'},{'s','X'},{'s','Y'},{'s','Z'},{'s','a'},{'s','b'},{'s','c'},{'s','d'},{'s','e'},{'s','f'}, 264 | {'s','g'},{'s','h'},{'s','i'},{'s','j'},{'s','k'},{'s','l'},{'s','m'},{'s','n'},{'s','o'},{'s','p'},{'s','q'},{'s','r'},{'s','s'},{'s','t'},{'s','u'},{'s','v'}, 265 | {'s','w'},{'s','x'},{'s','y'},{'s','z'},{'s','0'},{'s','1'},{'s','2'},{'s','3'},{'s','4'},{'s','5'},{'s','6'},{'s','7'},{'s','8'},{'s','9'},{'s','+'},{'s','/'}, 266 | // 45 267 | {'t','A'},{'t','B'},{'t','C'},{'t','D'},{'t','E'},{'t','F'},{'t','G'},{'t','H'},{'t','I'},{'t','J'},{'t','K'},{'t','L'},{'t','M'},{'t','N'},{'t','O'},{'t','P'}, 268 | {'t','Q'},{'t','R'},{'t','S'},{'t','T'},{'t','U'},{'t','V'},{'t','W'},{'t','X'},{'t','Y'},{'t','Z'},{'t','a'},{'t','b'},{'t','c'},{'t','d'},{'t','e'},{'t','f'}, 269 | {'t','g'},{'t','h'},{'t','i'},{'t','j'},{'t','k'},{'t','l'},{'t','m'},{'t','n'},{'t','o'},{'t','p'},{'t','q'},{'t','r'},{'t','s'},{'t','t'},{'t','u'},{'t','v'}, 270 | {'t','w'},{'t','x'},{'t','y'},{'t','z'},{'t','0'},{'t','1'},{'t','2'},{'t','3'},{'t','4'},{'t','5'},{'t','6'},{'t','7'},{'t','8'},{'t','9'},{'t','+'},{'t','/'}, 271 | // 46 272 | {'u','A'},{'u','B'},{'u','C'},{'u','D'},{'u','E'},{'u','F'},{'u','G'},{'u','H'},{'u','I'},{'u','J'},{'u','K'},{'u','L'},{'u','M'},{'u','N'},{'u','O'},{'u','P'}, 273 | {'u','Q'},{'u','R'},{'u','S'},{'u','T'},{'u','U'},{'u','V'},{'u','W'},{'u','X'},{'u','Y'},{'u','Z'},{'u','a'},{'u','b'},{'u','c'},{'u','d'},{'u','e'},{'u','f'}, 274 | {'u','g'},{'u','h'},{'u','i'},{'u','j'},{'u','k'},{'u','l'},{'u','m'},{'u','n'},{'u','o'},{'u','p'},{'u','q'},{'u','r'},{'u','s'},{'u','t'},{'u','u'},{'u','v'}, 275 | {'u','w'},{'u','x'},{'u','y'},{'u','z'},{'u','0'},{'u','1'},{'u','2'},{'u','3'},{'u','4'},{'u','5'},{'u','6'},{'u','7'},{'u','8'},{'u','9'},{'u','+'},{'u','/'}, 276 | // 47 277 | {'v','A'},{'v','B'},{'v','C'},{'v','D'},{'v','E'},{'v','F'},{'v','G'},{'v','H'},{'v','I'},{'v','J'},{'v','K'},{'v','L'},{'v','M'},{'v','N'},{'v','O'},{'v','P'}, 278 | {'v','Q'},{'v','R'},{'v','S'},{'v','T'},{'v','U'},{'v','V'},{'v','W'},{'v','X'},{'v','Y'},{'v','Z'},{'v','a'},{'v','b'},{'v','c'},{'v','d'},{'v','e'},{'v','f'}, 279 | {'v','g'},{'v','h'},{'v','i'},{'v','j'},{'v','k'},{'v','l'},{'v','m'},{'v','n'},{'v','o'},{'v','p'},{'v','q'},{'v','r'},{'v','s'},{'v','t'},{'v','u'},{'v','v'}, 280 | {'v','w'},{'v','x'},{'v','y'},{'v','z'},{'v','0'},{'v','1'},{'v','2'},{'v','3'},{'v','4'},{'v','5'},{'v','6'},{'v','7'},{'v','8'},{'v','9'},{'v','+'},{'v','/'}, 281 | // 48 282 | {'w','A'},{'w','B'},{'w','C'},{'w','D'},{'w','E'},{'w','F'},{'w','G'},{'w','H'},{'w','I'},{'w','J'},{'w','K'},{'w','L'},{'w','M'},{'w','N'},{'w','O'},{'w','P'}, 283 | {'w','Q'},{'w','R'},{'w','S'},{'w','T'},{'w','U'},{'w','V'},{'w','W'},{'w','X'},{'w','Y'},{'w','Z'},{'w','a'},{'w','b'},{'w','c'},{'w','d'},{'w','e'},{'w','f'}, 284 | {'w','g'},{'w','h'},{'w','i'},{'w','j'},{'w','k'},{'w','l'},{'w','m'},{'w','n'},{'w','o'},{'w','p'},{'w','q'},{'w','r'},{'w','s'},{'w','t'},{'w','u'},{'w','v'}, 285 | {'w','w'},{'w','x'},{'w','y'},{'w','z'},{'w','0'},{'w','1'},{'w','2'},{'w','3'},{'w','4'},{'w','5'},{'w','6'},{'w','7'},{'w','8'},{'w','9'},{'w','+'},{'w','/'}, 286 | // 49 287 | {'x','A'},{'x','B'},{'x','C'},{'x','D'},{'x','E'},{'x','F'},{'x','G'},{'x','H'},{'x','I'},{'x','J'},{'x','K'},{'x','L'},{'x','M'},{'x','N'},{'x','O'},{'x','P'}, 288 | {'x','Q'},{'x','R'},{'x','S'},{'x','T'},{'x','U'},{'x','V'},{'x','W'},{'x','X'},{'x','Y'},{'x','Z'},{'x','a'},{'x','b'},{'x','c'},{'x','d'},{'x','e'},{'x','f'}, 289 | {'x','g'},{'x','h'},{'x','i'},{'x','j'},{'x','k'},{'x','l'},{'x','m'},{'x','n'},{'x','o'},{'x','p'},{'x','q'},{'x','r'},{'x','s'},{'x','t'},{'x','u'},{'x','v'}, 290 | {'x','w'},{'x','x'},{'x','y'},{'x','z'},{'x','0'},{'x','1'},{'x','2'},{'x','3'},{'x','4'},{'x','5'},{'x','6'},{'x','7'},{'x','8'},{'x','9'},{'x','+'},{'x','/'}, 291 | // 50 292 | {'y','A'},{'y','B'},{'y','C'},{'y','D'},{'y','E'},{'y','F'},{'y','G'},{'y','H'},{'y','I'},{'y','J'},{'y','K'},{'y','L'},{'y','M'},{'y','N'},{'y','O'},{'y','P'}, 293 | {'y','Q'},{'y','R'},{'y','S'},{'y','T'},{'y','U'},{'y','V'},{'y','W'},{'y','X'},{'y','Y'},{'y','Z'},{'y','a'},{'y','b'},{'y','c'},{'y','d'},{'y','e'},{'y','f'}, 294 | {'y','g'},{'y','h'},{'y','i'},{'y','j'},{'y','k'},{'y','l'},{'y','m'},{'y','n'},{'y','o'},{'y','p'},{'y','q'},{'y','r'},{'y','s'},{'y','t'},{'y','u'},{'y','v'}, 295 | {'y','w'},{'y','x'},{'y','y'},{'y','z'},{'y','0'},{'y','1'},{'y','2'},{'y','3'},{'y','4'},{'y','5'},{'y','6'},{'y','7'},{'y','8'},{'y','9'},{'y','+'},{'y','/'}, 296 | // 51 297 | {'z','A'},{'z','B'},{'z','C'},{'z','D'},{'z','E'},{'z','F'},{'z','G'},{'z','H'},{'z','I'},{'z','J'},{'z','K'},{'z','L'},{'z','M'},{'z','N'},{'z','O'},{'z','P'}, 298 | {'z','Q'},{'z','R'},{'z','S'},{'z','T'},{'z','U'},{'z','V'},{'z','W'},{'z','X'},{'z','Y'},{'z','Z'},{'z','a'},{'z','b'},{'z','c'},{'z','d'},{'z','e'},{'z','f'}, 299 | {'z','g'},{'z','h'},{'z','i'},{'z','j'},{'z','k'},{'z','l'},{'z','m'},{'z','n'},{'z','o'},{'z','p'},{'z','q'},{'z','r'},{'z','s'},{'z','t'},{'z','u'},{'z','v'}, 300 | {'z','w'},{'z','x'},{'z','y'},{'z','z'},{'z','0'},{'z','1'},{'z','2'},{'z','3'},{'z','4'},{'z','5'},{'z','6'},{'z','7'},{'z','8'},{'z','9'},{'z','+'},{'z','/'}, 301 | // 52 302 | {'0','A'},{'0','B'},{'0','C'},{'0','D'},{'0','E'},{'0','F'},{'0','G'},{'0','H'},{'0','I'},{'0','J'},{'0','K'},{'0','L'},{'0','M'},{'0','N'},{'0','O'},{'0','P'}, 303 | {'0','Q'},{'0','R'},{'0','S'},{'0','T'},{'0','U'},{'0','V'},{'0','W'},{'0','X'},{'0','Y'},{'0','Z'},{'0','a'},{'0','b'},{'0','c'},{'0','d'},{'0','e'},{'0','f'}, 304 | {'0','g'},{'0','h'},{'0','i'},{'0','j'},{'0','k'},{'0','l'},{'0','m'},{'0','n'},{'0','o'},{'0','p'},{'0','q'},{'0','r'},{'0','s'},{'0','t'},{'0','u'},{'0','v'}, 305 | {'0','w'},{'0','x'},{'0','y'},{'0','z'},{'0','0'},{'0','1'},{'0','2'},{'0','3'},{'0','4'},{'0','5'},{'0','6'},{'0','7'},{'0','8'},{'0','9'},{'0','+'},{'0','/'}, 306 | // 53 307 | {'1','A'},{'1','B'},{'1','C'},{'1','D'},{'1','E'},{'1','F'},{'1','G'},{'1','H'},{'1','I'},{'1','J'},{'1','K'},{'1','L'},{'1','M'},{'1','N'},{'1','O'},{'1','P'}, 308 | {'1','Q'},{'1','R'},{'1','S'},{'1','T'},{'1','U'},{'1','V'},{'1','W'},{'1','X'},{'1','Y'},{'1','Z'},{'1','a'},{'1','b'},{'1','c'},{'1','d'},{'1','e'},{'1','f'}, 309 | {'1','g'},{'1','h'},{'1','i'},{'1','j'},{'1','k'},{'1','l'},{'1','m'},{'1','n'},{'1','o'},{'1','p'},{'1','q'},{'1','r'},{'1','s'},{'1','t'},{'1','u'},{'1','v'}, 310 | {'1','w'},{'1','x'},{'1','y'},{'1','z'},{'1','0'},{'1','1'},{'1','2'},{'1','3'},{'1','4'},{'1','5'},{'1','6'},{'1','7'},{'1','8'},{'1','9'},{'1','+'},{'1','/'}, 311 | // 54 312 | {'2','A'},{'2','B'},{'2','C'},{'2','D'},{'2','E'},{'2','F'},{'2','G'},{'2','H'},{'2','I'},{'2','J'},{'2','K'},{'2','L'},{'2','M'},{'2','N'},{'2','O'},{'2','P'}, 313 | {'2','Q'},{'2','R'},{'2','S'},{'2','T'},{'2','U'},{'2','V'},{'2','W'},{'2','X'},{'2','Y'},{'2','Z'},{'2','a'},{'2','b'},{'2','c'},{'2','d'},{'2','e'},{'2','f'}, 314 | {'2','g'},{'2','h'},{'2','i'},{'2','j'},{'2','k'},{'2','l'},{'2','m'},{'2','n'},{'2','o'},{'2','p'},{'2','q'},{'2','r'},{'2','s'},{'2','t'},{'2','u'},{'2','v'}, 315 | {'2','w'},{'2','x'},{'2','y'},{'2','z'},{'2','0'},{'2','1'},{'2','2'},{'2','3'},{'2','4'},{'2','5'},{'2','6'},{'2','7'},{'2','8'},{'2','9'},{'2','+'},{'2','/'}, 316 | // 55 317 | {'3','A'},{'3','B'},{'3','C'},{'3','D'},{'3','E'},{'3','F'},{'3','G'},{'3','H'},{'3','I'},{'3','J'},{'3','K'},{'3','L'},{'3','M'},{'3','N'},{'3','O'},{'3','P'}, 318 | {'3','Q'},{'3','R'},{'3','S'},{'3','T'},{'3','U'},{'3','V'},{'3','W'},{'3','X'},{'3','Y'},{'3','Z'},{'3','a'},{'3','b'},{'3','c'},{'3','d'},{'3','e'},{'3','f'}, 319 | {'3','g'},{'3','h'},{'3','i'},{'3','j'},{'3','k'},{'3','l'},{'3','m'},{'3','n'},{'3','o'},{'3','p'},{'3','q'},{'3','r'},{'3','s'},{'3','t'},{'3','u'},{'3','v'}, 320 | {'3','w'},{'3','x'},{'3','y'},{'3','z'},{'3','0'},{'3','1'},{'3','2'},{'3','3'},{'3','4'},{'3','5'},{'3','6'},{'3','7'},{'3','8'},{'3','9'},{'3','+'},{'3','/'}, 321 | // 56 322 | {'4','A'},{'4','B'},{'4','C'},{'4','D'},{'4','E'},{'4','F'},{'4','G'},{'4','H'},{'4','I'},{'4','J'},{'4','K'},{'4','L'},{'4','M'},{'4','N'},{'4','O'},{'4','P'}, 323 | {'4','Q'},{'4','R'},{'4','S'},{'4','T'},{'4','U'},{'4','V'},{'4','W'},{'4','X'},{'4','Y'},{'4','Z'},{'4','a'},{'4','b'},{'4','c'},{'4','d'},{'4','e'},{'4','f'}, 324 | {'4','g'},{'4','h'},{'4','i'},{'4','j'},{'4','k'},{'4','l'},{'4','m'},{'4','n'},{'4','o'},{'4','p'},{'4','q'},{'4','r'},{'4','s'},{'4','t'},{'4','u'},{'4','v'}, 325 | {'4','w'},{'4','x'},{'4','y'},{'4','z'},{'4','0'},{'4','1'},{'4','2'},{'4','3'},{'4','4'},{'4','5'},{'4','6'},{'4','7'},{'4','8'},{'4','9'},{'4','+'},{'4','/'}, 326 | // 57 327 | {'5','A'},{'5','B'},{'5','C'},{'5','D'},{'5','E'},{'5','F'},{'5','G'},{'5','H'},{'5','I'},{'5','J'},{'5','K'},{'5','L'},{'5','M'},{'5','N'},{'5','O'},{'5','P'}, 328 | {'5','Q'},{'5','R'},{'5','S'},{'5','T'},{'5','U'},{'5','V'},{'5','W'},{'5','X'},{'5','Y'},{'5','Z'},{'5','a'},{'5','b'},{'5','c'},{'5','d'},{'5','e'},{'5','f'}, 329 | {'5','g'},{'5','h'},{'5','i'},{'5','j'},{'5','k'},{'5','l'},{'5','m'},{'5','n'},{'5','o'},{'5','p'},{'5','q'},{'5','r'},{'5','s'},{'5','t'},{'5','u'},{'5','v'}, 330 | {'5','w'},{'5','x'},{'5','y'},{'5','z'},{'5','0'},{'5','1'},{'5','2'},{'5','3'},{'5','4'},{'5','5'},{'5','6'},{'5','7'},{'5','8'},{'5','9'},{'5','+'},{'5','/'}, 331 | // 58 332 | {'6','A'},{'6','B'},{'6','C'},{'6','D'},{'6','E'},{'6','F'},{'6','G'},{'6','H'},{'6','I'},{'6','J'},{'6','K'},{'6','L'},{'6','M'},{'6','N'},{'6','O'},{'6','P'}, 333 | {'6','Q'},{'6','R'},{'6','S'},{'6','T'},{'6','U'},{'6','V'},{'6','W'},{'6','X'},{'6','Y'},{'6','Z'},{'6','a'},{'6','b'},{'6','c'},{'6','d'},{'6','e'},{'6','f'}, 334 | {'6','g'},{'6','h'},{'6','i'},{'6','j'},{'6','k'},{'6','l'},{'6','m'},{'6','n'},{'6','o'},{'6','p'},{'6','q'},{'6','r'},{'6','s'},{'6','t'},{'6','u'},{'6','v'}, 335 | {'6','w'},{'6','x'},{'6','y'},{'6','z'},{'6','0'},{'6','1'},{'6','2'},{'6','3'},{'6','4'},{'6','5'},{'6','6'},{'6','7'},{'6','8'},{'6','9'},{'6','+'},{'6','/'}, 336 | // 59 337 | {'7','A'},{'7','B'},{'7','C'},{'7','D'},{'7','E'},{'7','F'},{'7','G'},{'7','H'},{'7','I'},{'7','J'},{'7','K'},{'7','L'},{'7','M'},{'7','N'},{'7','O'},{'7','P'}, 338 | {'7','Q'},{'7','R'},{'7','S'},{'7','T'},{'7','U'},{'7','V'},{'7','W'},{'7','X'},{'7','Y'},{'7','Z'},{'7','a'},{'7','b'},{'7','c'},{'7','d'},{'7','e'},{'7','f'}, 339 | {'7','g'},{'7','h'},{'7','i'},{'7','j'},{'7','k'},{'7','l'},{'7','m'},{'7','n'},{'7','o'},{'7','p'},{'7','q'},{'7','r'},{'7','s'},{'7','t'},{'7','u'},{'7','v'}, 340 | {'7','w'},{'7','x'},{'7','y'},{'7','z'},{'7','0'},{'7','1'},{'7','2'},{'7','3'},{'7','4'},{'7','5'},{'7','6'},{'7','7'},{'7','8'},{'7','9'},{'7','+'},{'7','/'}, 341 | // 60 342 | {'8','A'},{'8','B'},{'8','C'},{'8','D'},{'8','E'},{'8','F'},{'8','G'},{'8','H'},{'8','I'},{'8','J'},{'8','K'},{'8','L'},{'8','M'},{'8','N'},{'8','O'},{'8','P'}, 343 | {'8','Q'},{'8','R'},{'8','S'},{'8','T'},{'8','U'},{'8','V'},{'8','W'},{'8','X'},{'8','Y'},{'8','Z'},{'8','a'},{'8','b'},{'8','c'},{'8','d'},{'8','e'},{'8','f'}, 344 | {'8','g'},{'8','h'},{'8','i'},{'8','j'},{'8','k'},{'8','l'},{'8','m'},{'8','n'},{'8','o'},{'8','p'},{'8','q'},{'8','r'},{'8','s'},{'8','t'},{'8','u'},{'8','v'}, 345 | {'8','w'},{'8','x'},{'8','y'},{'8','z'},{'8','0'},{'8','1'},{'8','2'},{'8','3'},{'8','4'},{'8','5'},{'8','6'},{'8','7'},{'8','8'},{'8','9'},{'8','+'},{'8','/'}, 346 | // 61 347 | {'9','A'},{'9','B'},{'9','C'},{'9','D'},{'9','E'},{'9','F'},{'9','G'},{'9','H'},{'9','I'},{'9','J'},{'9','K'},{'9','L'},{'9','M'},{'9','N'},{'9','O'},{'9','P'}, 348 | {'9','Q'},{'9','R'},{'9','S'},{'9','T'},{'9','U'},{'9','V'},{'9','W'},{'9','X'},{'9','Y'},{'9','Z'},{'9','a'},{'9','b'},{'9','c'},{'9','d'},{'9','e'},{'9','f'}, 349 | {'9','g'},{'9','h'},{'9','i'},{'9','j'},{'9','k'},{'9','l'},{'9','m'},{'9','n'},{'9','o'},{'9','p'},{'9','q'},{'9','r'},{'9','s'},{'9','t'},{'9','u'},{'9','v'}, 350 | {'9','w'},{'9','x'},{'9','y'},{'9','z'},{'9','0'},{'9','1'},{'9','2'},{'9','3'},{'9','4'},{'9','5'},{'9','6'},{'9','7'},{'9','8'},{'9','9'},{'9','+'},{'9','/'}, 351 | // 62 352 | {'+','A'},{'+','B'},{'+','C'},{'+','D'},{'+','E'},{'+','F'},{'+','G'},{'+','H'},{'+','I'},{'+','J'},{'+','K'},{'+','L'},{'+','M'},{'+','N'},{'+','O'},{'+','P'}, 353 | {'+','Q'},{'+','R'},{'+','S'},{'+','T'},{'+','U'},{'+','V'},{'+','W'},{'+','X'},{'+','Y'},{'+','Z'},{'+','a'},{'+','b'},{'+','c'},{'+','d'},{'+','e'},{'+','f'}, 354 | {'+','g'},{'+','h'},{'+','i'},{'+','j'},{'+','k'},{'+','l'},{'+','m'},{'+','n'},{'+','o'},{'+','p'},{'+','q'},{'+','r'},{'+','s'},{'+','t'},{'+','u'},{'+','v'}, 355 | {'+','w'},{'+','x'},{'+','y'},{'+','z'},{'+','0'},{'+','1'},{'+','2'},{'+','3'},{'+','4'},{'+','5'},{'+','6'},{'+','7'},{'+','8'},{'+','9'},{'+','+'},{'+','/'}, 356 | // 63 357 | {'/','A'},{'/','B'},{'/','C'},{'/','D'},{'/','E'},{'/','F'},{'/','G'},{'/','H'},{'/','I'},{'/','J'},{'/','K'},{'/','L'},{'/','M'},{'/','N'},{'/','O'},{'/','P'}, 358 | {'/','Q'},{'/','R'},{'/','S'},{'/','T'},{'/','U'},{'/','V'},{'/','W'},{'/','X'},{'/','Y'},{'/','Z'},{'/','a'},{'/','b'},{'/','c'},{'/','d'},{'/','e'},{'/','f'}, 359 | {'/','g'},{'/','h'},{'/','i'},{'/','j'},{'/','k'},{'/','l'},{'/','m'},{'/','n'},{'/','o'},{'/','p'},{'/','q'},{'/','r'},{'/','s'},{'/','t'},{'/','u'},{'/','v'}, 360 | {'/','w'},{'/','x'},{'/','y'},{'/','z'},{'/','0'},{'/','1'},{'/','2'},{'/','3'},{'/','4'},{'/','5'},{'/','6'},{'/','7'},{'/','8'},{'/','9'},{'/','+'},{'/','/'} 361 | }; 362 | 363 | #ifdef __GNUC__ 364 | # ifdef __ELF__ 365 | __attribute__((section(".rodata.base64url_alphabet2"))) 366 | # endif 367 | #endif 368 | ALIGNED(4096) const char _base64url_alphabet_precombined[64*64][2] = { 369 | // 0 370 | {'A','A'},{'A','B'},{'A','C'},{'A','D'},{'A','E'},{'A','F'},{'A','G'},{'A','H'},{'A','I'},{'A','J'},{'A','K'},{'A','L'},{'A','M'},{'A','N'},{'A','O'},{'A','P'}, 371 | {'A','Q'},{'A','R'},{'A','S'},{'A','T'},{'A','U'},{'A','V'},{'A','W'},{'A','X'},{'A','Y'},{'A','Z'},{'A','a'},{'A','b'},{'A','c'},{'A','d'},{'A','e'},{'A','f'}, 372 | {'A','g'},{'A','h'},{'A','i'},{'A','j'},{'A','k'},{'A','l'},{'A','m'},{'A','n'},{'A','o'},{'A','p'},{'A','q'},{'A','r'},{'A','s'},{'A','t'},{'A','u'},{'A','v'}, 373 | {'A','w'},{'A','x'},{'A','y'},{'A','z'},{'A','0'},{'A','1'},{'A','2'},{'A','3'},{'A','4'},{'A','5'},{'A','6'},{'A','7'},{'A','8'},{'A','9'},{'A','-'},{'A','_'}, 374 | // 1 375 | {'B','A'},{'B','B'},{'B','C'},{'B','D'},{'B','E'},{'B','F'},{'B','G'},{'B','H'},{'B','I'},{'B','J'},{'B','K'},{'B','L'},{'B','M'},{'B','N'},{'B','O'},{'B','P'}, 376 | {'B','Q'},{'B','R'},{'B','S'},{'B','T'},{'B','U'},{'B','V'},{'B','W'},{'B','X'},{'B','Y'},{'B','Z'},{'B','a'},{'B','b'},{'B','c'},{'B','d'},{'B','e'},{'B','f'}, 377 | {'B','g'},{'B','h'},{'B','i'},{'B','j'},{'B','k'},{'B','l'},{'B','m'},{'B','n'},{'B','o'},{'B','p'},{'B','q'},{'B','r'},{'B','s'},{'B','t'},{'B','u'},{'B','v'}, 378 | {'B','w'},{'B','x'},{'B','y'},{'B','z'},{'B','0'},{'B','1'},{'B','2'},{'B','3'},{'B','4'},{'B','5'},{'B','6'},{'B','7'},{'B','8'},{'B','9'},{'B','-'},{'B','_'}, 379 | // 2 380 | {'C','A'},{'C','B'},{'C','C'},{'C','D'},{'C','E'},{'C','F'},{'C','G'},{'C','H'},{'C','I'},{'C','J'},{'C','K'},{'C','L'},{'C','M'},{'C','N'},{'C','O'},{'C','P'}, 381 | {'C','Q'},{'C','R'},{'C','S'},{'C','T'},{'C','U'},{'C','V'},{'C','W'},{'C','X'},{'C','Y'},{'C','Z'},{'C','a'},{'C','b'},{'C','c'},{'C','d'},{'C','e'},{'C','f'}, 382 | {'C','g'},{'C','h'},{'C','i'},{'C','j'},{'C','k'},{'C','l'},{'C','m'},{'C','n'},{'C','o'},{'C','p'},{'C','q'},{'C','r'},{'C','s'},{'C','t'},{'C','u'},{'C','v'}, 383 | {'C','w'},{'C','x'},{'C','y'},{'C','z'},{'C','0'},{'C','1'},{'C','2'},{'C','3'},{'C','4'},{'C','5'},{'C','6'},{'C','7'},{'C','8'},{'C','9'},{'C','-'},{'C','_'}, 384 | // 3 385 | {'D','A'},{'D','B'},{'D','C'},{'D','D'},{'D','E'},{'D','F'},{'D','G'},{'D','H'},{'D','I'},{'D','J'},{'D','K'},{'D','L'},{'D','M'},{'D','N'},{'D','O'},{'D','P'}, 386 | {'D','Q'},{'D','R'},{'D','S'},{'D','T'},{'D','U'},{'D','V'},{'D','W'},{'D','X'},{'D','Y'},{'D','Z'},{'D','a'},{'D','b'},{'D','c'},{'D','d'},{'D','e'},{'D','f'}, 387 | {'D','g'},{'D','h'},{'D','i'},{'D','j'},{'D','k'},{'D','l'},{'D','m'},{'D','n'},{'D','o'},{'D','p'},{'D','q'},{'D','r'},{'D','s'},{'D','t'},{'D','u'},{'D','v'}, 388 | {'D','w'},{'D','x'},{'D','y'},{'D','z'},{'D','0'},{'D','1'},{'D','2'},{'D','3'},{'D','4'},{'D','5'},{'D','6'},{'D','7'},{'D','8'},{'D','9'},{'D','-'},{'D','_'}, 389 | // 4 390 | {'E','A'},{'E','B'},{'E','C'},{'E','D'},{'E','E'},{'E','F'},{'E','G'},{'E','H'},{'E','I'},{'E','J'},{'E','K'},{'E','L'},{'E','M'},{'E','N'},{'E','O'},{'E','P'}, 391 | {'E','Q'},{'E','R'},{'E','S'},{'E','T'},{'E','U'},{'E','V'},{'E','W'},{'E','X'},{'E','Y'},{'E','Z'},{'E','a'},{'E','b'},{'E','c'},{'E','d'},{'E','e'},{'E','f'}, 392 | {'E','g'},{'E','h'},{'E','i'},{'E','j'},{'E','k'},{'E','l'},{'E','m'},{'E','n'},{'E','o'},{'E','p'},{'E','q'},{'E','r'},{'E','s'},{'E','t'},{'E','u'},{'E','v'}, 393 | {'E','w'},{'E','x'},{'E','y'},{'E','z'},{'E','0'},{'E','1'},{'E','2'},{'E','3'},{'E','4'},{'E','5'},{'E','6'},{'E','7'},{'E','8'},{'E','9'},{'E','-'},{'E','_'}, 394 | // 5 395 | {'F','A'},{'F','B'},{'F','C'},{'F','D'},{'F','E'},{'F','F'},{'F','G'},{'F','H'},{'F','I'},{'F','J'},{'F','K'},{'F','L'},{'F','M'},{'F','N'},{'F','O'},{'F','P'}, 396 | {'F','Q'},{'F','R'},{'F','S'},{'F','T'},{'F','U'},{'F','V'},{'F','W'},{'F','X'},{'F','Y'},{'F','Z'},{'F','a'},{'F','b'},{'F','c'},{'F','d'},{'F','e'},{'F','f'}, 397 | {'F','g'},{'F','h'},{'F','i'},{'F','j'},{'F','k'},{'F','l'},{'F','m'},{'F','n'},{'F','o'},{'F','p'},{'F','q'},{'F','r'},{'F','s'},{'F','t'},{'F','u'},{'F','v'}, 398 | {'F','w'},{'F','x'},{'F','y'},{'F','z'},{'F','0'},{'F','1'},{'F','2'},{'F','3'},{'F','4'},{'F','5'},{'F','6'},{'F','7'},{'F','8'},{'F','9'},{'F','-'},{'F','_'}, 399 | // 6 400 | {'G','A'},{'G','B'},{'G','C'},{'G','D'},{'G','E'},{'G','F'},{'G','G'},{'G','H'},{'G','I'},{'G','J'},{'G','K'},{'G','L'},{'G','M'},{'G','N'},{'G','O'},{'G','P'}, 401 | {'G','Q'},{'G','R'},{'G','S'},{'G','T'},{'G','U'},{'G','V'},{'G','W'},{'G','X'},{'G','Y'},{'G','Z'},{'G','a'},{'G','b'},{'G','c'},{'G','d'},{'G','e'},{'G','f'}, 402 | {'G','g'},{'G','h'},{'G','i'},{'G','j'},{'G','k'},{'G','l'},{'G','m'},{'G','n'},{'G','o'},{'G','p'},{'G','q'},{'G','r'},{'G','s'},{'G','t'},{'G','u'},{'G','v'}, 403 | {'G','w'},{'G','x'},{'G','y'},{'G','z'},{'G','0'},{'G','1'},{'G','2'},{'G','3'},{'G','4'},{'G','5'},{'G','6'},{'G','7'},{'G','8'},{'G','9'},{'G','-'},{'G','_'}, 404 | // 7 405 | {'H','A'},{'H','B'},{'H','C'},{'H','D'},{'H','E'},{'H','F'},{'H','G'},{'H','H'},{'H','I'},{'H','J'},{'H','K'},{'H','L'},{'H','M'},{'H','N'},{'H','O'},{'H','P'}, 406 | {'H','Q'},{'H','R'},{'H','S'},{'H','T'},{'H','U'},{'H','V'},{'H','W'},{'H','X'},{'H','Y'},{'H','Z'},{'H','a'},{'H','b'},{'H','c'},{'H','d'},{'H','e'},{'H','f'}, 407 | {'H','g'},{'H','h'},{'H','i'},{'H','j'},{'H','k'},{'H','l'},{'H','m'},{'H','n'},{'H','o'},{'H','p'},{'H','q'},{'H','r'},{'H','s'},{'H','t'},{'H','u'},{'H','v'}, 408 | {'H','w'},{'H','x'},{'H','y'},{'H','z'},{'H','0'},{'H','1'},{'H','2'},{'H','3'},{'H','4'},{'H','5'},{'H','6'},{'H','7'},{'H','8'},{'H','9'},{'H','-'},{'H','_'}, 409 | // 8 410 | {'I','A'},{'I','B'},{'I','C'},{'I','D'},{'I','E'},{'I','F'},{'I','G'},{'I','H'},{'I','I'},{'I','J'},{'I','K'},{'I','L'},{'I','M'},{'I','N'},{'I','O'},{'I','P'}, 411 | {'I','Q'},{'I','R'},{'I','S'},{'I','T'},{'I','U'},{'I','V'},{'I','W'},{'I','X'},{'I','Y'},{'I','Z'},{'I','a'},{'I','b'},{'I','c'},{'I','d'},{'I','e'},{'I','f'}, 412 | {'I','g'},{'I','h'},{'I','i'},{'I','j'},{'I','k'},{'I','l'},{'I','m'},{'I','n'},{'I','o'},{'I','p'},{'I','q'},{'I','r'},{'I','s'},{'I','t'},{'I','u'},{'I','v'}, 413 | {'I','w'},{'I','x'},{'I','y'},{'I','z'},{'I','0'},{'I','1'},{'I','2'},{'I','3'},{'I','4'},{'I','5'},{'I','6'},{'I','7'},{'I','8'},{'I','9'},{'I','-'},{'I','_'}, 414 | // 9 415 | {'J','A'},{'J','B'},{'J','C'},{'J','D'},{'J','E'},{'J','F'},{'J','G'},{'J','H'},{'J','I'},{'J','J'},{'J','K'},{'J','L'},{'J','M'},{'J','N'},{'J','O'},{'J','P'}, 416 | {'J','Q'},{'J','R'},{'J','S'},{'J','T'},{'J','U'},{'J','V'},{'J','W'},{'J','X'},{'J','Y'},{'J','Z'},{'J','a'},{'J','b'},{'J','c'},{'J','d'},{'J','e'},{'J','f'}, 417 | {'J','g'},{'J','h'},{'J','i'},{'J','j'},{'J','k'},{'J','l'},{'J','m'},{'J','n'},{'J','o'},{'J','p'},{'J','q'},{'J','r'},{'J','s'},{'J','t'},{'J','u'},{'J','v'}, 418 | {'J','w'},{'J','x'},{'J','y'},{'J','z'},{'J','0'},{'J','1'},{'J','2'},{'J','3'},{'J','4'},{'J','5'},{'J','6'},{'J','7'},{'J','8'},{'J','9'},{'J','-'},{'J','_'}, 419 | // 10 420 | {'K','A'},{'K','B'},{'K','C'},{'K','D'},{'K','E'},{'K','F'},{'K','G'},{'K','H'},{'K','I'},{'K','J'},{'K','K'},{'K','L'},{'K','M'},{'K','N'},{'K','O'},{'K','P'}, 421 | {'K','Q'},{'K','R'},{'K','S'},{'K','T'},{'K','U'},{'K','V'},{'K','W'},{'K','X'},{'K','Y'},{'K','Z'},{'K','a'},{'K','b'},{'K','c'},{'K','d'},{'K','e'},{'K','f'}, 422 | {'K','g'},{'K','h'},{'K','i'},{'K','j'},{'K','k'},{'K','l'},{'K','m'},{'K','n'},{'K','o'},{'K','p'},{'K','q'},{'K','r'},{'K','s'},{'K','t'},{'K','u'},{'K','v'}, 423 | {'K','w'},{'K','x'},{'K','y'},{'K','z'},{'K','0'},{'K','1'},{'K','2'},{'K','3'},{'K','4'},{'K','5'},{'K','6'},{'K','7'},{'K','8'},{'K','9'},{'K','-'},{'K','_'}, 424 | // 11 425 | {'L','A'},{'L','B'},{'L','C'},{'L','D'},{'L','E'},{'L','F'},{'L','G'},{'L','H'},{'L','I'},{'L','J'},{'L','K'},{'L','L'},{'L','M'},{'L','N'},{'L','O'},{'L','P'}, 426 | {'L','Q'},{'L','R'},{'L','S'},{'L','T'},{'L','U'},{'L','V'},{'L','W'},{'L','X'},{'L','Y'},{'L','Z'},{'L','a'},{'L','b'},{'L','c'},{'L','d'},{'L','e'},{'L','f'}, 427 | {'L','g'},{'L','h'},{'L','i'},{'L','j'},{'L','k'},{'L','l'},{'L','m'},{'L','n'},{'L','o'},{'L','p'},{'L','q'},{'L','r'},{'L','s'},{'L','t'},{'L','u'},{'L','v'}, 428 | {'L','w'},{'L','x'},{'L','y'},{'L','z'},{'L','0'},{'L','1'},{'L','2'},{'L','3'},{'L','4'},{'L','5'},{'L','6'},{'L','7'},{'L','8'},{'L','9'},{'L','-'},{'L','_'}, 429 | // 12 430 | {'M','A'},{'M','B'},{'M','C'},{'M','D'},{'M','E'},{'M','F'},{'M','G'},{'M','H'},{'M','I'},{'M','J'},{'M','K'},{'M','L'},{'M','M'},{'M','N'},{'M','O'},{'M','P'}, 431 | {'M','Q'},{'M','R'},{'M','S'},{'M','T'},{'M','U'},{'M','V'},{'M','W'},{'M','X'},{'M','Y'},{'M','Z'},{'M','a'},{'M','b'},{'M','c'},{'M','d'},{'M','e'},{'M','f'}, 432 | {'M','g'},{'M','h'},{'M','i'},{'M','j'},{'M','k'},{'M','l'},{'M','m'},{'M','n'},{'M','o'},{'M','p'},{'M','q'},{'M','r'},{'M','s'},{'M','t'},{'M','u'},{'M','v'}, 433 | {'M','w'},{'M','x'},{'M','y'},{'M','z'},{'M','0'},{'M','1'},{'M','2'},{'M','3'},{'M','4'},{'M','5'},{'M','6'},{'M','7'},{'M','8'},{'M','9'},{'M','-'},{'M','_'}, 434 | // 13 435 | {'N','A'},{'N','B'},{'N','C'},{'N','D'},{'N','E'},{'N','F'},{'N','G'},{'N','H'},{'N','I'},{'N','J'},{'N','K'},{'N','L'},{'N','M'},{'N','N'},{'N','O'},{'N','P'}, 436 | {'N','Q'},{'N','R'},{'N','S'},{'N','T'},{'N','U'},{'N','V'},{'N','W'},{'N','X'},{'N','Y'},{'N','Z'},{'N','a'},{'N','b'},{'N','c'},{'N','d'},{'N','e'},{'N','f'}, 437 | {'N','g'},{'N','h'},{'N','i'},{'N','j'},{'N','k'},{'N','l'},{'N','m'},{'N','n'},{'N','o'},{'N','p'},{'N','q'},{'N','r'},{'N','s'},{'N','t'},{'N','u'},{'N','v'}, 438 | {'N','w'},{'N','x'},{'N','y'},{'N','z'},{'N','0'},{'N','1'},{'N','2'},{'N','3'},{'N','4'},{'N','5'},{'N','6'},{'N','7'},{'N','8'},{'N','9'},{'N','-'},{'N','_'}, 439 | // 14 440 | {'O','A'},{'O','B'},{'O','C'},{'O','D'},{'O','E'},{'O','F'},{'O','G'},{'O','H'},{'O','I'},{'O','J'},{'O','K'},{'O','L'},{'O','M'},{'O','N'},{'O','O'},{'O','P'}, 441 | {'O','Q'},{'O','R'},{'O','S'},{'O','T'},{'O','U'},{'O','V'},{'O','W'},{'O','X'},{'O','Y'},{'O','Z'},{'O','a'},{'O','b'},{'O','c'},{'O','d'},{'O','e'},{'O','f'}, 442 | {'O','g'},{'O','h'},{'O','i'},{'O','j'},{'O','k'},{'O','l'},{'O','m'},{'O','n'},{'O','o'},{'O','p'},{'O','q'},{'O','r'},{'O','s'},{'O','t'},{'O','u'},{'O','v'}, 443 | {'O','w'},{'O','x'},{'O','y'},{'O','z'},{'O','0'},{'O','1'},{'O','2'},{'O','3'},{'O','4'},{'O','5'},{'O','6'},{'O','7'},{'O','8'},{'O','9'},{'O','-'},{'O','_'}, 444 | // 15 445 | {'P','A'},{'P','B'},{'P','C'},{'P','D'},{'P','E'},{'P','F'},{'P','G'},{'P','H'},{'P','I'},{'P','J'},{'P','K'},{'P','L'},{'P','M'},{'P','N'},{'P','O'},{'P','P'}, 446 | {'P','Q'},{'P','R'},{'P','S'},{'P','T'},{'P','U'},{'P','V'},{'P','W'},{'P','X'},{'P','Y'},{'P','Z'},{'P','a'},{'P','b'},{'P','c'},{'P','d'},{'P','e'},{'P','f'}, 447 | {'P','g'},{'P','h'},{'P','i'},{'P','j'},{'P','k'},{'P','l'},{'P','m'},{'P','n'},{'P','o'},{'P','p'},{'P','q'},{'P','r'},{'P','s'},{'P','t'},{'P','u'},{'P','v'}, 448 | {'P','w'},{'P','x'},{'P','y'},{'P','z'},{'P','0'},{'P','1'},{'P','2'},{'P','3'},{'P','4'},{'P','5'},{'P','6'},{'P','7'},{'P','8'},{'P','9'},{'P','-'},{'P','_'}, 449 | // 16 450 | {'Q','A'},{'Q','B'},{'Q','C'},{'Q','D'},{'Q','E'},{'Q','F'},{'Q','G'},{'Q','H'},{'Q','I'},{'Q','J'},{'Q','K'},{'Q','L'},{'Q','M'},{'Q','N'},{'Q','O'},{'Q','P'}, 451 | {'Q','Q'},{'Q','R'},{'Q','S'},{'Q','T'},{'Q','U'},{'Q','V'},{'Q','W'},{'Q','X'},{'Q','Y'},{'Q','Z'},{'Q','a'},{'Q','b'},{'Q','c'},{'Q','d'},{'Q','e'},{'Q','f'}, 452 | {'Q','g'},{'Q','h'},{'Q','i'},{'Q','j'},{'Q','k'},{'Q','l'},{'Q','m'},{'Q','n'},{'Q','o'},{'Q','p'},{'Q','q'},{'Q','r'},{'Q','s'},{'Q','t'},{'Q','u'},{'Q','v'}, 453 | {'Q','w'},{'Q','x'},{'Q','y'},{'Q','z'},{'Q','0'},{'Q','1'},{'Q','2'},{'Q','3'},{'Q','4'},{'Q','5'},{'Q','6'},{'Q','7'},{'Q','8'},{'Q','9'},{'Q','-'},{'Q','_'}, 454 | // 17 455 | {'R','A'},{'R','B'},{'R','C'},{'R','D'},{'R','E'},{'R','F'},{'R','G'},{'R','H'},{'R','I'},{'R','J'},{'R','K'},{'R','L'},{'R','M'},{'R','N'},{'R','O'},{'R','P'}, 456 | {'R','Q'},{'R','R'},{'R','S'},{'R','T'},{'R','U'},{'R','V'},{'R','W'},{'R','X'},{'R','Y'},{'R','Z'},{'R','a'},{'R','b'},{'R','c'},{'R','d'},{'R','e'},{'R','f'}, 457 | {'R','g'},{'R','h'},{'R','i'},{'R','j'},{'R','k'},{'R','l'},{'R','m'},{'R','n'},{'R','o'},{'R','p'},{'R','q'},{'R','r'},{'R','s'},{'R','t'},{'R','u'},{'R','v'}, 458 | {'R','w'},{'R','x'},{'R','y'},{'R','z'},{'R','0'},{'R','1'},{'R','2'},{'R','3'},{'R','4'},{'R','5'},{'R','6'},{'R','7'},{'R','8'},{'R','9'},{'R','-'},{'R','_'}, 459 | // 18 460 | {'S','A'},{'S','B'},{'S','C'},{'S','D'},{'S','E'},{'S','F'},{'S','G'},{'S','H'},{'S','I'},{'S','J'},{'S','K'},{'S','L'},{'S','M'},{'S','N'},{'S','O'},{'S','P'}, 461 | {'S','Q'},{'S','R'},{'S','S'},{'S','T'},{'S','U'},{'S','V'},{'S','W'},{'S','X'},{'S','Y'},{'S','Z'},{'S','a'},{'S','b'},{'S','c'},{'S','d'},{'S','e'},{'S','f'}, 462 | {'S','g'},{'S','h'},{'S','i'},{'S','j'},{'S','k'},{'S','l'},{'S','m'},{'S','n'},{'S','o'},{'S','p'},{'S','q'},{'S','r'},{'S','s'},{'S','t'},{'S','u'},{'S','v'}, 463 | {'S','w'},{'S','x'},{'S','y'},{'S','z'},{'S','0'},{'S','1'},{'S','2'},{'S','3'},{'S','4'},{'S','5'},{'S','6'},{'S','7'},{'S','8'},{'S','9'},{'S','-'},{'S','_'}, 464 | // 19 465 | {'T','A'},{'T','B'},{'T','C'},{'T','D'},{'T','E'},{'T','F'},{'T','G'},{'T','H'},{'T','I'},{'T','J'},{'T','K'},{'T','L'},{'T','M'},{'T','N'},{'T','O'},{'T','P'}, 466 | {'T','Q'},{'T','R'},{'T','S'},{'T','T'},{'T','U'},{'T','V'},{'T','W'},{'T','X'},{'T','Y'},{'T','Z'},{'T','a'},{'T','b'},{'T','c'},{'T','d'},{'T','e'},{'T','f'}, 467 | {'T','g'},{'T','h'},{'T','i'},{'T','j'},{'T','k'},{'T','l'},{'T','m'},{'T','n'},{'T','o'},{'T','p'},{'T','q'},{'T','r'},{'T','s'},{'T','t'},{'T','u'},{'T','v'}, 468 | {'T','w'},{'T','x'},{'T','y'},{'T','z'},{'T','0'},{'T','1'},{'T','2'},{'T','3'},{'T','4'},{'T','5'},{'T','6'},{'T','7'},{'T','8'},{'T','9'},{'T','-'},{'T','_'}, 469 | // 20 470 | {'U','A'},{'U','B'},{'U','C'},{'U','D'},{'U','E'},{'U','F'},{'U','G'},{'U','H'},{'U','I'},{'U','J'},{'U','K'},{'U','L'},{'U','M'},{'U','N'},{'U','O'},{'U','P'}, 471 | {'U','Q'},{'U','R'},{'U','S'},{'U','T'},{'U','U'},{'U','V'},{'U','W'},{'U','X'},{'U','Y'},{'U','Z'},{'U','a'},{'U','b'},{'U','c'},{'U','d'},{'U','e'},{'U','f'}, 472 | {'U','g'},{'U','h'},{'U','i'},{'U','j'},{'U','k'},{'U','l'},{'U','m'},{'U','n'},{'U','o'},{'U','p'},{'U','q'},{'U','r'},{'U','s'},{'U','t'},{'U','u'},{'U','v'}, 473 | {'U','w'},{'U','x'},{'U','y'},{'U','z'},{'U','0'},{'U','1'},{'U','2'},{'U','3'},{'U','4'},{'U','5'},{'U','6'},{'U','7'},{'U','8'},{'U','9'},{'U','-'},{'U','_'}, 474 | // 21 475 | {'V','A'},{'V','B'},{'V','C'},{'V','D'},{'V','E'},{'V','F'},{'V','G'},{'V','H'},{'V','I'},{'V','J'},{'V','K'},{'V','L'},{'V','M'},{'V','N'},{'V','O'},{'V','P'}, 476 | {'V','Q'},{'V','R'},{'V','S'},{'V','T'},{'V','U'},{'V','V'},{'V','W'},{'V','X'},{'V','Y'},{'V','Z'},{'V','a'},{'V','b'},{'V','c'},{'V','d'},{'V','e'},{'V','f'}, 477 | {'V','g'},{'V','h'},{'V','i'},{'V','j'},{'V','k'},{'V','l'},{'V','m'},{'V','n'},{'V','o'},{'V','p'},{'V','q'},{'V','r'},{'V','s'},{'V','t'},{'V','u'},{'V','v'}, 478 | {'V','w'},{'V','x'},{'V','y'},{'V','z'},{'V','0'},{'V','1'},{'V','2'},{'V','3'},{'V','4'},{'V','5'},{'V','6'},{'V','7'},{'V','8'},{'V','9'},{'V','-'},{'V','_'}, 479 | // 22 480 | {'W','A'},{'W','B'},{'W','C'},{'W','D'},{'W','E'},{'W','F'},{'W','G'},{'W','H'},{'W','I'},{'W','J'},{'W','K'},{'W','L'},{'W','M'},{'W','N'},{'W','O'},{'W','P'}, 481 | {'W','Q'},{'W','R'},{'W','S'},{'W','T'},{'W','U'},{'W','V'},{'W','W'},{'W','X'},{'W','Y'},{'W','Z'},{'W','a'},{'W','b'},{'W','c'},{'W','d'},{'W','e'},{'W','f'}, 482 | {'W','g'},{'W','h'},{'W','i'},{'W','j'},{'W','k'},{'W','l'},{'W','m'},{'W','n'},{'W','o'},{'W','p'},{'W','q'},{'W','r'},{'W','s'},{'W','t'},{'W','u'},{'W','v'}, 483 | {'W','w'},{'W','x'},{'W','y'},{'W','z'},{'W','0'},{'W','1'},{'W','2'},{'W','3'},{'W','4'},{'W','5'},{'W','6'},{'W','7'},{'W','8'},{'W','9'},{'W','-'},{'W','_'}, 484 | // 23 485 | {'X','A'},{'X','B'},{'X','C'},{'X','D'},{'X','E'},{'X','F'},{'X','G'},{'X','H'},{'X','I'},{'X','J'},{'X','K'},{'X','L'},{'X','M'},{'X','N'},{'X','O'},{'X','P'}, 486 | {'X','Q'},{'X','R'},{'X','S'},{'X','T'},{'X','U'},{'X','V'},{'X','W'},{'X','X'},{'X','Y'},{'X','Z'},{'X','a'},{'X','b'},{'X','c'},{'X','d'},{'X','e'},{'X','f'}, 487 | {'X','g'},{'X','h'},{'X','i'},{'X','j'},{'X','k'},{'X','l'},{'X','m'},{'X','n'},{'X','o'},{'X','p'},{'X','q'},{'X','r'},{'X','s'},{'X','t'},{'X','u'},{'X','v'}, 488 | {'X','w'},{'X','x'},{'X','y'},{'X','z'},{'X','0'},{'X','1'},{'X','2'},{'X','3'},{'X','4'},{'X','5'},{'X','6'},{'X','7'},{'X','8'},{'X','9'},{'X','-'},{'X','_'}, 489 | // 24 490 | {'Y','A'},{'Y','B'},{'Y','C'},{'Y','D'},{'Y','E'},{'Y','F'},{'Y','G'},{'Y','H'},{'Y','I'},{'Y','J'},{'Y','K'},{'Y','L'},{'Y','M'},{'Y','N'},{'Y','O'},{'Y','P'}, 491 | {'Y','Q'},{'Y','R'},{'Y','S'},{'Y','T'},{'Y','U'},{'Y','V'},{'Y','W'},{'Y','X'},{'Y','Y'},{'Y','Z'},{'Y','a'},{'Y','b'},{'Y','c'},{'Y','d'},{'Y','e'},{'Y','f'}, 492 | {'Y','g'},{'Y','h'},{'Y','i'},{'Y','j'},{'Y','k'},{'Y','l'},{'Y','m'},{'Y','n'},{'Y','o'},{'Y','p'},{'Y','q'},{'Y','r'},{'Y','s'},{'Y','t'},{'Y','u'},{'Y','v'}, 493 | {'Y','w'},{'Y','x'},{'Y','y'},{'Y','z'},{'Y','0'},{'Y','1'},{'Y','2'},{'Y','3'},{'Y','4'},{'Y','5'},{'Y','6'},{'Y','7'},{'Y','8'},{'Y','9'},{'Y','-'},{'Y','_'}, 494 | // 25 495 | {'Z','A'},{'Z','B'},{'Z','C'},{'Z','D'},{'Z','E'},{'Z','F'},{'Z','G'},{'Z','H'},{'Z','I'},{'Z','J'},{'Z','K'},{'Z','L'},{'Z','M'},{'Z','N'},{'Z','O'},{'Z','P'}, 496 | {'Z','Q'},{'Z','R'},{'Z','S'},{'Z','T'},{'Z','U'},{'Z','V'},{'Z','W'},{'Z','X'},{'Z','Y'},{'Z','Z'},{'Z','a'},{'Z','b'},{'Z','c'},{'Z','d'},{'Z','e'},{'Z','f'}, 497 | {'Z','g'},{'Z','h'},{'Z','i'},{'Z','j'},{'Z','k'},{'Z','l'},{'Z','m'},{'Z','n'},{'Z','o'},{'Z','p'},{'Z','q'},{'Z','r'},{'Z','s'},{'Z','t'},{'Z','u'},{'Z','v'}, 498 | {'Z','w'},{'Z','x'},{'Z','y'},{'Z','z'},{'Z','0'},{'Z','1'},{'Z','2'},{'Z','3'},{'Z','4'},{'Z','5'},{'Z','6'},{'Z','7'},{'Z','8'},{'Z','9'},{'Z','-'},{'Z','_'}, 499 | // 26 500 | {'a','A'},{'a','B'},{'a','C'},{'a','D'},{'a','E'},{'a','F'},{'a','G'},{'a','H'},{'a','I'},{'a','J'},{'a','K'},{'a','L'},{'a','M'},{'a','N'},{'a','O'},{'a','P'}, 501 | {'a','Q'},{'a','R'},{'a','S'},{'a','T'},{'a','U'},{'a','V'},{'a','W'},{'a','X'},{'a','Y'},{'a','Z'},{'a','a'},{'a','b'},{'a','c'},{'a','d'},{'a','e'},{'a','f'}, 502 | {'a','g'},{'a','h'},{'a','i'},{'a','j'},{'a','k'},{'a','l'},{'a','m'},{'a','n'},{'a','o'},{'a','p'},{'a','q'},{'a','r'},{'a','s'},{'a','t'},{'a','u'},{'a','v'}, 503 | {'a','w'},{'a','x'},{'a','y'},{'a','z'},{'a','0'},{'a','1'},{'a','2'},{'a','3'},{'a','4'},{'a','5'},{'a','6'},{'a','7'},{'a','8'},{'a','9'},{'a','-'},{'a','_'}, 504 | // 27 505 | {'b','A'},{'b','B'},{'b','C'},{'b','D'},{'b','E'},{'b','F'},{'b','G'},{'b','H'},{'b','I'},{'b','J'},{'b','K'},{'b','L'},{'b','M'},{'b','N'},{'b','O'},{'b','P'}, 506 | {'b','Q'},{'b','R'},{'b','S'},{'b','T'},{'b','U'},{'b','V'},{'b','W'},{'b','X'},{'b','Y'},{'b','Z'},{'b','a'},{'b','b'},{'b','c'},{'b','d'},{'b','e'},{'b','f'}, 507 | {'b','g'},{'b','h'},{'b','i'},{'b','j'},{'b','k'},{'b','l'},{'b','m'},{'b','n'},{'b','o'},{'b','p'},{'b','q'},{'b','r'},{'b','s'},{'b','t'},{'b','u'},{'b','v'}, 508 | {'b','w'},{'b','x'},{'b','y'},{'b','z'},{'b','0'},{'b','1'},{'b','2'},{'b','3'},{'b','4'},{'b','5'},{'b','6'},{'b','7'},{'b','8'},{'b','9'},{'b','-'},{'b','_'}, 509 | // 28 510 | {'c','A'},{'c','B'},{'c','C'},{'c','D'},{'c','E'},{'c','F'},{'c','G'},{'c','H'},{'c','I'},{'c','J'},{'c','K'},{'c','L'},{'c','M'},{'c','N'},{'c','O'},{'c','P'}, 511 | {'c','Q'},{'c','R'},{'c','S'},{'c','T'},{'c','U'},{'c','V'},{'c','W'},{'c','X'},{'c','Y'},{'c','Z'},{'c','a'},{'c','b'},{'c','c'},{'c','d'},{'c','e'},{'c','f'}, 512 | {'c','g'},{'c','h'},{'c','i'},{'c','j'},{'c','k'},{'c','l'},{'c','m'},{'c','n'},{'c','o'},{'c','p'},{'c','q'},{'c','r'},{'c','s'},{'c','t'},{'c','u'},{'c','v'}, 513 | {'c','w'},{'c','x'},{'c','y'},{'c','z'},{'c','0'},{'c','1'},{'c','2'},{'c','3'},{'c','4'},{'c','5'},{'c','6'},{'c','7'},{'c','8'},{'c','9'},{'c','-'},{'c','_'}, 514 | // 29 515 | {'d','A'},{'d','B'},{'d','C'},{'d','D'},{'d','E'},{'d','F'},{'d','G'},{'d','H'},{'d','I'},{'d','J'},{'d','K'},{'d','L'},{'d','M'},{'d','N'},{'d','O'},{'d','P'}, 516 | {'d','Q'},{'d','R'},{'d','S'},{'d','T'},{'d','U'},{'d','V'},{'d','W'},{'d','X'},{'d','Y'},{'d','Z'},{'d','a'},{'d','b'},{'d','c'},{'d','d'},{'d','e'},{'d','f'}, 517 | {'d','g'},{'d','h'},{'d','i'},{'d','j'},{'d','k'},{'d','l'},{'d','m'},{'d','n'},{'d','o'},{'d','p'},{'d','q'},{'d','r'},{'d','s'},{'d','t'},{'d','u'},{'d','v'}, 518 | {'d','w'},{'d','x'},{'d','y'},{'d','z'},{'d','0'},{'d','1'},{'d','2'},{'d','3'},{'d','4'},{'d','5'},{'d','6'},{'d','7'},{'d','8'},{'d','9'},{'d','-'},{'d','_'}, 519 | // 30 520 | {'e','A'},{'e','B'},{'e','C'},{'e','D'},{'e','E'},{'e','F'},{'e','G'},{'e','H'},{'e','I'},{'e','J'},{'e','K'},{'e','L'},{'e','M'},{'e','N'},{'e','O'},{'e','P'}, 521 | {'e','Q'},{'e','R'},{'e','S'},{'e','T'},{'e','U'},{'e','V'},{'e','W'},{'e','X'},{'e','Y'},{'e','Z'},{'e','a'},{'e','b'},{'e','c'},{'e','d'},{'e','e'},{'e','f'}, 522 | {'e','g'},{'e','h'},{'e','i'},{'e','j'},{'e','k'},{'e','l'},{'e','m'},{'e','n'},{'e','o'},{'e','p'},{'e','q'},{'e','r'},{'e','s'},{'e','t'},{'e','u'},{'e','v'}, 523 | {'e','w'},{'e','x'},{'e','y'},{'e','z'},{'e','0'},{'e','1'},{'e','2'},{'e','3'},{'e','4'},{'e','5'},{'e','6'},{'e','7'},{'e','8'},{'e','9'},{'e','-'},{'e','_'}, 524 | // 31 525 | {'f','A'},{'f','B'},{'f','C'},{'f','D'},{'f','E'},{'f','F'},{'f','G'},{'f','H'},{'f','I'},{'f','J'},{'f','K'},{'f','L'},{'f','M'},{'f','N'},{'f','O'},{'f','P'}, 526 | {'f','Q'},{'f','R'},{'f','S'},{'f','T'},{'f','U'},{'f','V'},{'f','W'},{'f','X'},{'f','Y'},{'f','Z'},{'f','a'},{'f','b'},{'f','c'},{'f','d'},{'f','e'},{'f','f'}, 527 | {'f','g'},{'f','h'},{'f','i'},{'f','j'},{'f','k'},{'f','l'},{'f','m'},{'f','n'},{'f','o'},{'f','p'},{'f','q'},{'f','r'},{'f','s'},{'f','t'},{'f','u'},{'f','v'}, 528 | {'f','w'},{'f','x'},{'f','y'},{'f','z'},{'f','0'},{'f','1'},{'f','2'},{'f','3'},{'f','4'},{'f','5'},{'f','6'},{'f','7'},{'f','8'},{'f','9'},{'f','-'},{'f','_'}, 529 | // 32 530 | {'g','A'},{'g','B'},{'g','C'},{'g','D'},{'g','E'},{'g','F'},{'g','G'},{'g','H'},{'g','I'},{'g','J'},{'g','K'},{'g','L'},{'g','M'},{'g','N'},{'g','O'},{'g','P'}, 531 | {'g','Q'},{'g','R'},{'g','S'},{'g','T'},{'g','U'},{'g','V'},{'g','W'},{'g','X'},{'g','Y'},{'g','Z'},{'g','a'},{'g','b'},{'g','c'},{'g','d'},{'g','e'},{'g','f'}, 532 | {'g','g'},{'g','h'},{'g','i'},{'g','j'},{'g','k'},{'g','l'},{'g','m'},{'g','n'},{'g','o'},{'g','p'},{'g','q'},{'g','r'},{'g','s'},{'g','t'},{'g','u'},{'g','v'}, 533 | {'g','w'},{'g','x'},{'g','y'},{'g','z'},{'g','0'},{'g','1'},{'g','2'},{'g','3'},{'g','4'},{'g','5'},{'g','6'},{'g','7'},{'g','8'},{'g','9'},{'g','-'},{'g','_'}, 534 | // 33 535 | {'h','A'},{'h','B'},{'h','C'},{'h','D'},{'h','E'},{'h','F'},{'h','G'},{'h','H'},{'h','I'},{'h','J'},{'h','K'},{'h','L'},{'h','M'},{'h','N'},{'h','O'},{'h','P'}, 536 | {'h','Q'},{'h','R'},{'h','S'},{'h','T'},{'h','U'},{'h','V'},{'h','W'},{'h','X'},{'h','Y'},{'h','Z'},{'h','a'},{'h','b'},{'h','c'},{'h','d'},{'h','e'},{'h','f'}, 537 | {'h','g'},{'h','h'},{'h','i'},{'h','j'},{'h','k'},{'h','l'},{'h','m'},{'h','n'},{'h','o'},{'h','p'},{'h','q'},{'h','r'},{'h','s'},{'h','t'},{'h','u'},{'h','v'}, 538 | {'h','w'},{'h','x'},{'h','y'},{'h','z'},{'h','0'},{'h','1'},{'h','2'},{'h','3'},{'h','4'},{'h','5'},{'h','6'},{'h','7'},{'h','8'},{'h','9'},{'h','-'},{'h','_'}, 539 | // 34 540 | {'i','A'},{'i','B'},{'i','C'},{'i','D'},{'i','E'},{'i','F'},{'i','G'},{'i','H'},{'i','I'},{'i','J'},{'i','K'},{'i','L'},{'i','M'},{'i','N'},{'i','O'},{'i','P'}, 541 | {'i','Q'},{'i','R'},{'i','S'},{'i','T'},{'i','U'},{'i','V'},{'i','W'},{'i','X'},{'i','Y'},{'i','Z'},{'i','a'},{'i','b'},{'i','c'},{'i','d'},{'i','e'},{'i','f'}, 542 | {'i','g'},{'i','h'},{'i','i'},{'i','j'},{'i','k'},{'i','l'},{'i','m'},{'i','n'},{'i','o'},{'i','p'},{'i','q'},{'i','r'},{'i','s'},{'i','t'},{'i','u'},{'i','v'}, 543 | {'i','w'},{'i','x'},{'i','y'},{'i','z'},{'i','0'},{'i','1'},{'i','2'},{'i','3'},{'i','4'},{'i','5'},{'i','6'},{'i','7'},{'i','8'},{'i','9'},{'i','-'},{'i','_'}, 544 | // 35 545 | {'j','A'},{'j','B'},{'j','C'},{'j','D'},{'j','E'},{'j','F'},{'j','G'},{'j','H'},{'j','I'},{'j','J'},{'j','K'},{'j','L'},{'j','M'},{'j','N'},{'j','O'},{'j','P'}, 546 | {'j','Q'},{'j','R'},{'j','S'},{'j','T'},{'j','U'},{'j','V'},{'j','W'},{'j','X'},{'j','Y'},{'j','Z'},{'j','a'},{'j','b'},{'j','c'},{'j','d'},{'j','e'},{'j','f'}, 547 | {'j','g'},{'j','h'},{'j','i'},{'j','j'},{'j','k'},{'j','l'},{'j','m'},{'j','n'},{'j','o'},{'j','p'},{'j','q'},{'j','r'},{'j','s'},{'j','t'},{'j','u'},{'j','v'}, 548 | {'j','w'},{'j','x'},{'j','y'},{'j','z'},{'j','0'},{'j','1'},{'j','2'},{'j','3'},{'j','4'},{'j','5'},{'j','6'},{'j','7'},{'j','8'},{'j','9'},{'j','-'},{'j','_'}, 549 | // 36 550 | {'k','A'},{'k','B'},{'k','C'},{'k','D'},{'k','E'},{'k','F'},{'k','G'},{'k','H'},{'k','I'},{'k','J'},{'k','K'},{'k','L'},{'k','M'},{'k','N'},{'k','O'},{'k','P'}, 551 | {'k','Q'},{'k','R'},{'k','S'},{'k','T'},{'k','U'},{'k','V'},{'k','W'},{'k','X'},{'k','Y'},{'k','Z'},{'k','a'},{'k','b'},{'k','c'},{'k','d'},{'k','e'},{'k','f'}, 552 | {'k','g'},{'k','h'},{'k','i'},{'k','j'},{'k','k'},{'k','l'},{'k','m'},{'k','n'},{'k','o'},{'k','p'},{'k','q'},{'k','r'},{'k','s'},{'k','t'},{'k','u'},{'k','v'}, 553 | {'k','w'},{'k','x'},{'k','y'},{'k','z'},{'k','0'},{'k','1'},{'k','2'},{'k','3'},{'k','4'},{'k','5'},{'k','6'},{'k','7'},{'k','8'},{'k','9'},{'k','-'},{'k','_'}, 554 | // 37 555 | {'l','A'},{'l','B'},{'l','C'},{'l','D'},{'l','E'},{'l','F'},{'l','G'},{'l','H'},{'l','I'},{'l','J'},{'l','K'},{'l','L'},{'l','M'},{'l','N'},{'l','O'},{'l','P'}, 556 | {'l','Q'},{'l','R'},{'l','S'},{'l','T'},{'l','U'},{'l','V'},{'l','W'},{'l','X'},{'l','Y'},{'l','Z'},{'l','a'},{'l','b'},{'l','c'},{'l','d'},{'l','e'},{'l','f'}, 557 | {'l','g'},{'l','h'},{'l','i'},{'l','j'},{'l','k'},{'l','l'},{'l','m'},{'l','n'},{'l','o'},{'l','p'},{'l','q'},{'l','r'},{'l','s'},{'l','t'},{'l','u'},{'l','v'}, 558 | {'l','w'},{'l','x'},{'l','y'},{'l','z'},{'l','0'},{'l','1'},{'l','2'},{'l','3'},{'l','4'},{'l','5'},{'l','6'},{'l','7'},{'l','8'},{'l','9'},{'l','-'},{'l','_'}, 559 | // 38 560 | {'m','A'},{'m','B'},{'m','C'},{'m','D'},{'m','E'},{'m','F'},{'m','G'},{'m','H'},{'m','I'},{'m','J'},{'m','K'},{'m','L'},{'m','M'},{'m','N'},{'m','O'},{'m','P'}, 561 | {'m','Q'},{'m','R'},{'m','S'},{'m','T'},{'m','U'},{'m','V'},{'m','W'},{'m','X'},{'m','Y'},{'m','Z'},{'m','a'},{'m','b'},{'m','c'},{'m','d'},{'m','e'},{'m','f'}, 562 | {'m','g'},{'m','h'},{'m','i'},{'m','j'},{'m','k'},{'m','l'},{'m','m'},{'m','n'},{'m','o'},{'m','p'},{'m','q'},{'m','r'},{'m','s'},{'m','t'},{'m','u'},{'m','v'}, 563 | {'m','w'},{'m','x'},{'m','y'},{'m','z'},{'m','0'},{'m','1'},{'m','2'},{'m','3'},{'m','4'},{'m','5'},{'m','6'},{'m','7'},{'m','8'},{'m','9'},{'m','-'},{'m','_'}, 564 | // 39 565 | {'n','A'},{'n','B'},{'n','C'},{'n','D'},{'n','E'},{'n','F'},{'n','G'},{'n','H'},{'n','I'},{'n','J'},{'n','K'},{'n','L'},{'n','M'},{'n','N'},{'n','O'},{'n','P'}, 566 | {'n','Q'},{'n','R'},{'n','S'},{'n','T'},{'n','U'},{'n','V'},{'n','W'},{'n','X'},{'n','Y'},{'n','Z'},{'n','a'},{'n','b'},{'n','c'},{'n','d'},{'n','e'},{'n','f'}, 567 | {'n','g'},{'n','h'},{'n','i'},{'n','j'},{'n','k'},{'n','l'},{'n','m'},{'n','n'},{'n','o'},{'n','p'},{'n','q'},{'n','r'},{'n','s'},{'n','t'},{'n','u'},{'n','v'}, 568 | {'n','w'},{'n','x'},{'n','y'},{'n','z'},{'n','0'},{'n','1'},{'n','2'},{'n','3'},{'n','4'},{'n','5'},{'n','6'},{'n','7'},{'n','8'},{'n','9'},{'n','-'},{'n','_'}, 569 | // 40 570 | {'o','A'},{'o','B'},{'o','C'},{'o','D'},{'o','E'},{'o','F'},{'o','G'},{'o','H'},{'o','I'},{'o','J'},{'o','K'},{'o','L'},{'o','M'},{'o','N'},{'o','O'},{'o','P'}, 571 | {'o','Q'},{'o','R'},{'o','S'},{'o','T'},{'o','U'},{'o','V'},{'o','W'},{'o','X'},{'o','Y'},{'o','Z'},{'o','a'},{'o','b'},{'o','c'},{'o','d'},{'o','e'},{'o','f'}, 572 | {'o','g'},{'o','h'},{'o','i'},{'o','j'},{'o','k'},{'o','l'},{'o','m'},{'o','n'},{'o','o'},{'o','p'},{'o','q'},{'o','r'},{'o','s'},{'o','t'},{'o','u'},{'o','v'}, 573 | {'o','w'},{'o','x'},{'o','y'},{'o','z'},{'o','0'},{'o','1'},{'o','2'},{'o','3'},{'o','4'},{'o','5'},{'o','6'},{'o','7'},{'o','8'},{'o','9'},{'o','-'},{'o','_'}, 574 | // 41 575 | {'p','A'},{'p','B'},{'p','C'},{'p','D'},{'p','E'},{'p','F'},{'p','G'},{'p','H'},{'p','I'},{'p','J'},{'p','K'},{'p','L'},{'p','M'},{'p','N'},{'p','O'},{'p','P'}, 576 | {'p','Q'},{'p','R'},{'p','S'},{'p','T'},{'p','U'},{'p','V'},{'p','W'},{'p','X'},{'p','Y'},{'p','Z'},{'p','a'},{'p','b'},{'p','c'},{'p','d'},{'p','e'},{'p','f'}, 577 | {'p','g'},{'p','h'},{'p','i'},{'p','j'},{'p','k'},{'p','l'},{'p','m'},{'p','n'},{'p','o'},{'p','p'},{'p','q'},{'p','r'},{'p','s'},{'p','t'},{'p','u'},{'p','v'}, 578 | {'p','w'},{'p','x'},{'p','y'},{'p','z'},{'p','0'},{'p','1'},{'p','2'},{'p','3'},{'p','4'},{'p','5'},{'p','6'},{'p','7'},{'p','8'},{'p','9'},{'p','-'},{'p','_'}, 579 | // 42 580 | {'q','A'},{'q','B'},{'q','C'},{'q','D'},{'q','E'},{'q','F'},{'q','G'},{'q','H'},{'q','I'},{'q','J'},{'q','K'},{'q','L'},{'q','M'},{'q','N'},{'q','O'},{'q','P'}, 581 | {'q','Q'},{'q','R'},{'q','S'},{'q','T'},{'q','U'},{'q','V'},{'q','W'},{'q','X'},{'q','Y'},{'q','Z'},{'q','a'},{'q','b'},{'q','c'},{'q','d'},{'q','e'},{'q','f'}, 582 | {'q','g'},{'q','h'},{'q','i'},{'q','j'},{'q','k'},{'q','l'},{'q','m'},{'q','n'},{'q','o'},{'q','p'},{'q','q'},{'q','r'},{'q','s'},{'q','t'},{'q','u'},{'q','v'}, 583 | {'q','w'},{'q','x'},{'q','y'},{'q','z'},{'q','0'},{'q','1'},{'q','2'},{'q','3'},{'q','4'},{'q','5'},{'q','6'},{'q','7'},{'q','8'},{'q','9'},{'q','-'},{'q','_'}, 584 | // 43 585 | {'r','A'},{'r','B'},{'r','C'},{'r','D'},{'r','E'},{'r','F'},{'r','G'},{'r','H'},{'r','I'},{'r','J'},{'r','K'},{'r','L'},{'r','M'},{'r','N'},{'r','O'},{'r','P'}, 586 | {'r','Q'},{'r','R'},{'r','S'},{'r','T'},{'r','U'},{'r','V'},{'r','W'},{'r','X'},{'r','Y'},{'r','Z'},{'r','a'},{'r','b'},{'r','c'},{'r','d'},{'r','e'},{'r','f'}, 587 | {'r','g'},{'r','h'},{'r','i'},{'r','j'},{'r','k'},{'r','l'},{'r','m'},{'r','n'},{'r','o'},{'r','p'},{'r','q'},{'r','r'},{'r','s'},{'r','t'},{'r','u'},{'r','v'}, 588 | {'r','w'},{'r','x'},{'r','y'},{'r','z'},{'r','0'},{'r','1'},{'r','2'},{'r','3'},{'r','4'},{'r','5'},{'r','6'},{'r','7'},{'r','8'},{'r','9'},{'r','-'},{'r','_'}, 589 | // 44 590 | {'s','A'},{'s','B'},{'s','C'},{'s','D'},{'s','E'},{'s','F'},{'s','G'},{'s','H'},{'s','I'},{'s','J'},{'s','K'},{'s','L'},{'s','M'},{'s','N'},{'s','O'},{'s','P'}, 591 | {'s','Q'},{'s','R'},{'s','S'},{'s','T'},{'s','U'},{'s','V'},{'s','W'},{'s','X'},{'s','Y'},{'s','Z'},{'s','a'},{'s','b'},{'s','c'},{'s','d'},{'s','e'},{'s','f'}, 592 | {'s','g'},{'s','h'},{'s','i'},{'s','j'},{'s','k'},{'s','l'},{'s','m'},{'s','n'},{'s','o'},{'s','p'},{'s','q'},{'s','r'},{'s','s'},{'s','t'},{'s','u'},{'s','v'}, 593 | {'s','w'},{'s','x'},{'s','y'},{'s','z'},{'s','0'},{'s','1'},{'s','2'},{'s','3'},{'s','4'},{'s','5'},{'s','6'},{'s','7'},{'s','8'},{'s','9'},{'s','-'},{'s','_'}, 594 | // 45 595 | {'t','A'},{'t','B'},{'t','C'},{'t','D'},{'t','E'},{'t','F'},{'t','G'},{'t','H'},{'t','I'},{'t','J'},{'t','K'},{'t','L'},{'t','M'},{'t','N'},{'t','O'},{'t','P'}, 596 | {'t','Q'},{'t','R'},{'t','S'},{'t','T'},{'t','U'},{'t','V'},{'t','W'},{'t','X'},{'t','Y'},{'t','Z'},{'t','a'},{'t','b'},{'t','c'},{'t','d'},{'t','e'},{'t','f'}, 597 | {'t','g'},{'t','h'},{'t','i'},{'t','j'},{'t','k'},{'t','l'},{'t','m'},{'t','n'},{'t','o'},{'t','p'},{'t','q'},{'t','r'},{'t','s'},{'t','t'},{'t','u'},{'t','v'}, 598 | {'t','w'},{'t','x'},{'t','y'},{'t','z'},{'t','0'},{'t','1'},{'t','2'},{'t','3'},{'t','4'},{'t','5'},{'t','6'},{'t','7'},{'t','8'},{'t','9'},{'t','-'},{'t','_'}, 599 | // 46 600 | {'u','A'},{'u','B'},{'u','C'},{'u','D'},{'u','E'},{'u','F'},{'u','G'},{'u','H'},{'u','I'},{'u','J'},{'u','K'},{'u','L'},{'u','M'},{'u','N'},{'u','O'},{'u','P'}, 601 | {'u','Q'},{'u','R'},{'u','S'},{'u','T'},{'u','U'},{'u','V'},{'u','W'},{'u','X'},{'u','Y'},{'u','Z'},{'u','a'},{'u','b'},{'u','c'},{'u','d'},{'u','e'},{'u','f'}, 602 | {'u','g'},{'u','h'},{'u','i'},{'u','j'},{'u','k'},{'u','l'},{'u','m'},{'u','n'},{'u','o'},{'u','p'},{'u','q'},{'u','r'},{'u','s'},{'u','t'},{'u','u'},{'u','v'}, 603 | {'u','w'},{'u','x'},{'u','y'},{'u','z'},{'u','0'},{'u','1'},{'u','2'},{'u','3'},{'u','4'},{'u','5'},{'u','6'},{'u','7'},{'u','8'},{'u','9'},{'u','-'},{'u','_'}, 604 | // 47 605 | {'v','A'},{'v','B'},{'v','C'},{'v','D'},{'v','E'},{'v','F'},{'v','G'},{'v','H'},{'v','I'},{'v','J'},{'v','K'},{'v','L'},{'v','M'},{'v','N'},{'v','O'},{'v','P'}, 606 | {'v','Q'},{'v','R'},{'v','S'},{'v','T'},{'v','U'},{'v','V'},{'v','W'},{'v','X'},{'v','Y'},{'v','Z'},{'v','a'},{'v','b'},{'v','c'},{'v','d'},{'v','e'},{'v','f'}, 607 | {'v','g'},{'v','h'},{'v','i'},{'v','j'},{'v','k'},{'v','l'},{'v','m'},{'v','n'},{'v','o'},{'v','p'},{'v','q'},{'v','r'},{'v','s'},{'v','t'},{'v','u'},{'v','v'}, 608 | {'v','w'},{'v','x'},{'v','y'},{'v','z'},{'v','0'},{'v','1'},{'v','2'},{'v','3'},{'v','4'},{'v','5'},{'v','6'},{'v','7'},{'v','8'},{'v','9'},{'v','-'},{'v','_'}, 609 | // 48 610 | {'w','A'},{'w','B'},{'w','C'},{'w','D'},{'w','E'},{'w','F'},{'w','G'},{'w','H'},{'w','I'},{'w','J'},{'w','K'},{'w','L'},{'w','M'},{'w','N'},{'w','O'},{'w','P'}, 611 | {'w','Q'},{'w','R'},{'w','S'},{'w','T'},{'w','U'},{'w','V'},{'w','W'},{'w','X'},{'w','Y'},{'w','Z'},{'w','a'},{'w','b'},{'w','c'},{'w','d'},{'w','e'},{'w','f'}, 612 | {'w','g'},{'w','h'},{'w','i'},{'w','j'},{'w','k'},{'w','l'},{'w','m'},{'w','n'},{'w','o'},{'w','p'},{'w','q'},{'w','r'},{'w','s'},{'w','t'},{'w','u'},{'w','v'}, 613 | {'w','w'},{'w','x'},{'w','y'},{'w','z'},{'w','0'},{'w','1'},{'w','2'},{'w','3'},{'w','4'},{'w','5'},{'w','6'},{'w','7'},{'w','8'},{'w','9'},{'w','-'},{'w','_'}, 614 | // 49 615 | {'x','A'},{'x','B'},{'x','C'},{'x','D'},{'x','E'},{'x','F'},{'x','G'},{'x','H'},{'x','I'},{'x','J'},{'x','K'},{'x','L'},{'x','M'},{'x','N'},{'x','O'},{'x','P'}, 616 | {'x','Q'},{'x','R'},{'x','S'},{'x','T'},{'x','U'},{'x','V'},{'x','W'},{'x','X'},{'x','Y'},{'x','Z'},{'x','a'},{'x','b'},{'x','c'},{'x','d'},{'x','e'},{'x','f'}, 617 | {'x','g'},{'x','h'},{'x','i'},{'x','j'},{'x','k'},{'x','l'},{'x','m'},{'x','n'},{'x','o'},{'x','p'},{'x','q'},{'x','r'},{'x','s'},{'x','t'},{'x','u'},{'x','v'}, 618 | {'x','w'},{'x','x'},{'x','y'},{'x','z'},{'x','0'},{'x','1'},{'x','2'},{'x','3'},{'x','4'},{'x','5'},{'x','6'},{'x','7'},{'x','8'},{'x','9'},{'x','-'},{'x','_'}, 619 | // 50 620 | {'y','A'},{'y','B'},{'y','C'},{'y','D'},{'y','E'},{'y','F'},{'y','G'},{'y','H'},{'y','I'},{'y','J'},{'y','K'},{'y','L'},{'y','M'},{'y','N'},{'y','O'},{'y','P'}, 621 | {'y','Q'},{'y','R'},{'y','S'},{'y','T'},{'y','U'},{'y','V'},{'y','W'},{'y','X'},{'y','Y'},{'y','Z'},{'y','a'},{'y','b'},{'y','c'},{'y','d'},{'y','e'},{'y','f'}, 622 | {'y','g'},{'y','h'},{'y','i'},{'y','j'},{'y','k'},{'y','l'},{'y','m'},{'y','n'},{'y','o'},{'y','p'},{'y','q'},{'y','r'},{'y','s'},{'y','t'},{'y','u'},{'y','v'}, 623 | {'y','w'},{'y','x'},{'y','y'},{'y','z'},{'y','0'},{'y','1'},{'y','2'},{'y','3'},{'y','4'},{'y','5'},{'y','6'},{'y','7'},{'y','8'},{'y','9'},{'y','-'},{'y','_'}, 624 | // 51 625 | {'z','A'},{'z','B'},{'z','C'},{'z','D'},{'z','E'},{'z','F'},{'z','G'},{'z','H'},{'z','I'},{'z','J'},{'z','K'},{'z','L'},{'z','M'},{'z','N'},{'z','O'},{'z','P'}, 626 | {'z','Q'},{'z','R'},{'z','S'},{'z','T'},{'z','U'},{'z','V'},{'z','W'},{'z','X'},{'z','Y'},{'z','Z'},{'z','a'},{'z','b'},{'z','c'},{'z','d'},{'z','e'},{'z','f'}, 627 | {'z','g'},{'z','h'},{'z','i'},{'z','j'},{'z','k'},{'z','l'},{'z','m'},{'z','n'},{'z','o'},{'z','p'},{'z','q'},{'z','r'},{'z','s'},{'z','t'},{'z','u'},{'z','v'}, 628 | {'z','w'},{'z','x'},{'z','y'},{'z','z'},{'z','0'},{'z','1'},{'z','2'},{'z','3'},{'z','4'},{'z','5'},{'z','6'},{'z','7'},{'z','8'},{'z','9'},{'z','-'},{'z','_'}, 629 | // 52 630 | {'0','A'},{'0','B'},{'0','C'},{'0','D'},{'0','E'},{'0','F'},{'0','G'},{'0','H'},{'0','I'},{'0','J'},{'0','K'},{'0','L'},{'0','M'},{'0','N'},{'0','O'},{'0','P'}, 631 | {'0','Q'},{'0','R'},{'0','S'},{'0','T'},{'0','U'},{'0','V'},{'0','W'},{'0','X'},{'0','Y'},{'0','Z'},{'0','a'},{'0','b'},{'0','c'},{'0','d'},{'0','e'},{'0','f'}, 632 | {'0','g'},{'0','h'},{'0','i'},{'0','j'},{'0','k'},{'0','l'},{'0','m'},{'0','n'},{'0','o'},{'0','p'},{'0','q'},{'0','r'},{'0','s'},{'0','t'},{'0','u'},{'0','v'}, 633 | {'0','w'},{'0','x'},{'0','y'},{'0','z'},{'0','0'},{'0','1'},{'0','2'},{'0','3'},{'0','4'},{'0','5'},{'0','6'},{'0','7'},{'0','8'},{'0','9'},{'0','-'},{'0','_'}, 634 | // 53 635 | {'1','A'},{'1','B'},{'1','C'},{'1','D'},{'1','E'},{'1','F'},{'1','G'},{'1','H'},{'1','I'},{'1','J'},{'1','K'},{'1','L'},{'1','M'},{'1','N'},{'1','O'},{'1','P'}, 636 | {'1','Q'},{'1','R'},{'1','S'},{'1','T'},{'1','U'},{'1','V'},{'1','W'},{'1','X'},{'1','Y'},{'1','Z'},{'1','a'},{'1','b'},{'1','c'},{'1','d'},{'1','e'},{'1','f'}, 637 | {'1','g'},{'1','h'},{'1','i'},{'1','j'},{'1','k'},{'1','l'},{'1','m'},{'1','n'},{'1','o'},{'1','p'},{'1','q'},{'1','r'},{'1','s'},{'1','t'},{'1','u'},{'1','v'}, 638 | {'1','w'},{'1','x'},{'1','y'},{'1','z'},{'1','0'},{'1','1'},{'1','2'},{'1','3'},{'1','4'},{'1','5'},{'1','6'},{'1','7'},{'1','8'},{'1','9'},{'1','-'},{'1','_'}, 639 | // 54 640 | {'2','A'},{'2','B'},{'2','C'},{'2','D'},{'2','E'},{'2','F'},{'2','G'},{'2','H'},{'2','I'},{'2','J'},{'2','K'},{'2','L'},{'2','M'},{'2','N'},{'2','O'},{'2','P'}, 641 | {'2','Q'},{'2','R'},{'2','S'},{'2','T'},{'2','U'},{'2','V'},{'2','W'},{'2','X'},{'2','Y'},{'2','Z'},{'2','a'},{'2','b'},{'2','c'},{'2','d'},{'2','e'},{'2','f'}, 642 | {'2','g'},{'2','h'},{'2','i'},{'2','j'},{'2','k'},{'2','l'},{'2','m'},{'2','n'},{'2','o'},{'2','p'},{'2','q'},{'2','r'},{'2','s'},{'2','t'},{'2','u'},{'2','v'}, 643 | {'2','w'},{'2','x'},{'2','y'},{'2','z'},{'2','0'},{'2','1'},{'2','2'},{'2','3'},{'2','4'},{'2','5'},{'2','6'},{'2','7'},{'2','8'},{'2','9'},{'2','-'},{'2','_'}, 644 | // 55 645 | {'3','A'},{'3','B'},{'3','C'},{'3','D'},{'3','E'},{'3','F'},{'3','G'},{'3','H'},{'3','I'},{'3','J'},{'3','K'},{'3','L'},{'3','M'},{'3','N'},{'3','O'},{'3','P'}, 646 | {'3','Q'},{'3','R'},{'3','S'},{'3','T'},{'3','U'},{'3','V'},{'3','W'},{'3','X'},{'3','Y'},{'3','Z'},{'3','a'},{'3','b'},{'3','c'},{'3','d'},{'3','e'},{'3','f'}, 647 | {'3','g'},{'3','h'},{'3','i'},{'3','j'},{'3','k'},{'3','l'},{'3','m'},{'3','n'},{'3','o'},{'3','p'},{'3','q'},{'3','r'},{'3','s'},{'3','t'},{'3','u'},{'3','v'}, 648 | {'3','w'},{'3','x'},{'3','y'},{'3','z'},{'3','0'},{'3','1'},{'3','2'},{'3','3'},{'3','4'},{'3','5'},{'3','6'},{'3','7'},{'3','8'},{'3','9'},{'3','-'},{'3','_'}, 649 | // 56 650 | {'4','A'},{'4','B'},{'4','C'},{'4','D'},{'4','E'},{'4','F'},{'4','G'},{'4','H'},{'4','I'},{'4','J'},{'4','K'},{'4','L'},{'4','M'},{'4','N'},{'4','O'},{'4','P'}, 651 | {'4','Q'},{'4','R'},{'4','S'},{'4','T'},{'4','U'},{'4','V'},{'4','W'},{'4','X'},{'4','Y'},{'4','Z'},{'4','a'},{'4','b'},{'4','c'},{'4','d'},{'4','e'},{'4','f'}, 652 | {'4','g'},{'4','h'},{'4','i'},{'4','j'},{'4','k'},{'4','l'},{'4','m'},{'4','n'},{'4','o'},{'4','p'},{'4','q'},{'4','r'},{'4','s'},{'4','t'},{'4','u'},{'4','v'}, 653 | {'4','w'},{'4','x'},{'4','y'},{'4','z'},{'4','0'},{'4','1'},{'4','2'},{'4','3'},{'4','4'},{'4','5'},{'4','6'},{'4','7'},{'4','8'},{'4','9'},{'4','-'},{'4','_'}, 654 | // 57 655 | {'5','A'},{'5','B'},{'5','C'},{'5','D'},{'5','E'},{'5','F'},{'5','G'},{'5','H'},{'5','I'},{'5','J'},{'5','K'},{'5','L'},{'5','M'},{'5','N'},{'5','O'},{'5','P'}, 656 | {'5','Q'},{'5','R'},{'5','S'},{'5','T'},{'5','U'},{'5','V'},{'5','W'},{'5','X'},{'5','Y'},{'5','Z'},{'5','a'},{'5','b'},{'5','c'},{'5','d'},{'5','e'},{'5','f'}, 657 | {'5','g'},{'5','h'},{'5','i'},{'5','j'},{'5','k'},{'5','l'},{'5','m'},{'5','n'},{'5','o'},{'5','p'},{'5','q'},{'5','r'},{'5','s'},{'5','t'},{'5','u'},{'5','v'}, 658 | {'5','w'},{'5','x'},{'5','y'},{'5','z'},{'5','0'},{'5','1'},{'5','2'},{'5','3'},{'5','4'},{'5','5'},{'5','6'},{'5','7'},{'5','8'},{'5','9'},{'5','-'},{'5','_'}, 659 | // 58 660 | {'6','A'},{'6','B'},{'6','C'},{'6','D'},{'6','E'},{'6','F'},{'6','G'},{'6','H'},{'6','I'},{'6','J'},{'6','K'},{'6','L'},{'6','M'},{'6','N'},{'6','O'},{'6','P'}, 661 | {'6','Q'},{'6','R'},{'6','S'},{'6','T'},{'6','U'},{'6','V'},{'6','W'},{'6','X'},{'6','Y'},{'6','Z'},{'6','a'},{'6','b'},{'6','c'},{'6','d'},{'6','e'},{'6','f'}, 662 | {'6','g'},{'6','h'},{'6','i'},{'6','j'},{'6','k'},{'6','l'},{'6','m'},{'6','n'},{'6','o'},{'6','p'},{'6','q'},{'6','r'},{'6','s'},{'6','t'},{'6','u'},{'6','v'}, 663 | {'6','w'},{'6','x'},{'6','y'},{'6','z'},{'6','0'},{'6','1'},{'6','2'},{'6','3'},{'6','4'},{'6','5'},{'6','6'},{'6','7'},{'6','8'},{'6','9'},{'6','-'},{'6','_'}, 664 | // 59 665 | {'7','A'},{'7','B'},{'7','C'},{'7','D'},{'7','E'},{'7','F'},{'7','G'},{'7','H'},{'7','I'},{'7','J'},{'7','K'},{'7','L'},{'7','M'},{'7','N'},{'7','O'},{'7','P'}, 666 | {'7','Q'},{'7','R'},{'7','S'},{'7','T'},{'7','U'},{'7','V'},{'7','W'},{'7','X'},{'7','Y'},{'7','Z'},{'7','a'},{'7','b'},{'7','c'},{'7','d'},{'7','e'},{'7','f'}, 667 | {'7','g'},{'7','h'},{'7','i'},{'7','j'},{'7','k'},{'7','l'},{'7','m'},{'7','n'},{'7','o'},{'7','p'},{'7','q'},{'7','r'},{'7','s'},{'7','t'},{'7','u'},{'7','v'}, 668 | {'7','w'},{'7','x'},{'7','y'},{'7','z'},{'7','0'},{'7','1'},{'7','2'},{'7','3'},{'7','4'},{'7','5'},{'7','6'},{'7','7'},{'7','8'},{'7','9'},{'7','-'},{'7','_'}, 669 | // 60 670 | {'8','A'},{'8','B'},{'8','C'},{'8','D'},{'8','E'},{'8','F'},{'8','G'},{'8','H'},{'8','I'},{'8','J'},{'8','K'},{'8','L'},{'8','M'},{'8','N'},{'8','O'},{'8','P'}, 671 | {'8','Q'},{'8','R'},{'8','S'},{'8','T'},{'8','U'},{'8','V'},{'8','W'},{'8','X'},{'8','Y'},{'8','Z'},{'8','a'},{'8','b'},{'8','c'},{'8','d'},{'8','e'},{'8','f'}, 672 | {'8','g'},{'8','h'},{'8','i'},{'8','j'},{'8','k'},{'8','l'},{'8','m'},{'8','n'},{'8','o'},{'8','p'},{'8','q'},{'8','r'},{'8','s'},{'8','t'},{'8','u'},{'8','v'}, 673 | {'8','w'},{'8','x'},{'8','y'},{'8','z'},{'8','0'},{'8','1'},{'8','2'},{'8','3'},{'8','4'},{'8','5'},{'8','6'},{'8','7'},{'8','8'},{'8','9'},{'8','-'},{'8','_'}, 674 | // 61 675 | {'9','A'},{'9','B'},{'9','C'},{'9','D'},{'9','E'},{'9','F'},{'9','G'},{'9','H'},{'9','I'},{'9','J'},{'9','K'},{'9','L'},{'9','M'},{'9','N'},{'9','O'},{'9','P'}, 676 | {'9','Q'},{'9','R'},{'9','S'},{'9','T'},{'9','U'},{'9','V'},{'9','W'},{'9','X'},{'9','Y'},{'9','Z'},{'9','a'},{'9','b'},{'9','c'},{'9','d'},{'9','e'},{'9','f'}, 677 | {'9','g'},{'9','h'},{'9','i'},{'9','j'},{'9','k'},{'9','l'},{'9','m'},{'9','n'},{'9','o'},{'9','p'},{'9','q'},{'9','r'},{'9','s'},{'9','t'},{'9','u'},{'9','v'}, 678 | {'9','w'},{'9','x'},{'9','y'},{'9','z'},{'9','0'},{'9','1'},{'9','2'},{'9','3'},{'9','4'},{'9','5'},{'9','6'},{'9','7'},{'9','8'},{'9','9'},{'9','-'},{'9','_'}, 679 | // 62 680 | {'-','A'},{'-','B'},{'-','C'},{'-','D'},{'-','E'},{'-','F'},{'-','G'},{'-','H'},{'-','I'},{'-','J'},{'-','K'},{'-','L'},{'-','M'},{'-','N'},{'-','O'},{'-','P'}, 681 | {'-','Q'},{'-','R'},{'-','S'},{'-','T'},{'-','U'},{'-','V'},{'-','W'},{'-','X'},{'-','Y'},{'-','Z'},{'-','a'},{'-','b'},{'-','c'},{'-','d'},{'-','e'},{'-','f'}, 682 | {'-','g'},{'-','h'},{'-','i'},{'-','j'},{'-','k'},{'-','l'},{'-','m'},{'-','n'},{'-','o'},{'-','p'},{'-','q'},{'-','r'},{'-','s'},{'-','t'},{'-','u'},{'-','v'}, 683 | {'-','w'},{'-','x'},{'-','y'},{'-','z'},{'-','0'},{'-','1'},{'-','2'},{'-','3'},{'-','4'},{'-','5'},{'-','6'},{'-','7'},{'-','8'},{'-','9'},{'-','-'},{'-','_'}, 684 | // 63 685 | {'_','A'},{'_','B'},{'_','C'},{'_','D'},{'_','E'},{'_','F'},{'_','G'},{'_','H'},{'_','I'},{'_','J'},{'_','K'},{'_','L'},{'_','M'},{'_','N'},{'_','O'},{'_','P'}, 686 | {'_','Q'},{'_','R'},{'_','S'},{'_','T'},{'_','U'},{'_','V'},{'_','W'},{'_','X'},{'_','Y'},{'_','Z'},{'_','a'},{'_','b'},{'_','c'},{'_','d'},{'_','e'},{'_','f'}, 687 | {'_','g'},{'_','h'},{'_','i'},{'_','j'},{'_','k'},{'_','l'},{'_','m'},{'_','n'},{'_','o'},{'_','p'},{'_','q'},{'_','r'},{'_','s'},{'_','t'},{'_','u'},{'_','v'}, 688 | {'_','w'},{'_','x'},{'_','y'},{'_','z'},{'_','0'},{'_','1'},{'_','2'},{'_','3'},{'_','4'},{'_','5'},{'_','6'},{'_','7'},{'_','8'},{'_','9'},{'_','-'},{'_','_'} 689 | }; 690 | 691 | #ifdef __GNUC__ 692 | # ifdef __ELF__ 693 | __attribute__((section(".rodata.base64_alphabet"))) 694 | # endif 695 | #endif 696 | ALIGNED(64) const char _base64_alphabet[64] = "ABCDEFGH" "IJKLMNOP" "QRSTUVWX" "YZabcdef" 697 | "ghijklmn" "opqrstuv" "wxyz0123" "456789+/", 698 | _base64url_alphabet[64] = "ABCDEFGH" "IJKLMNOP" "QRSTUVWX" "YZabcdef" 699 | "ghijklmn" "opqrstuv" "wxyz0123" "456789-_"; 700 | --------------------------------------------------------------------------------