From 006d24b29afd628f5b869443b9f06efc8b8360c6 Mon Sep 17 00:00:00 2001 From: Tyler Wilding Date: Sat, 16 Aug 2025 19:35:47 -0400 Subject: [PATCH] game: Support korean in Jak 2 and Jak 3 (#3988) Resolves #3075 TODO before merge: - [x] Properly draw non-korean strings while in korean mode (language selection) - [x] Check jak 3 - [x] Translation scaffolding (allow korean characters, add to Crowdin, fix japanese locale, etc) - [x] Check translation of text lines - [x] Check translation of subtitle lines - [x] Cleanup PR / some performance optimization (it's take a bit too long to build the text and it shouldn't since the information is in a giant lookup table) - [x] Wait until release is cut I confirmed the font textures are identical between Jak 2 and Jak 3, so thank god for that. Some examples of converting the korean encoding to utf-8. These show off all scenarios, pure korean / korean with ascii and japanese / korean with replacements (flags): Screenshot 2025-07-26 191511 Screenshot 2025-07-26 191529 And it working in game. `Input Options` is a custom not-yet-translated string. It now shows up properly instead of a disgusting block of glyphs, and all the original strings are hopefully the same semantically!: Screenshot 2025-07-26 202838 Quite the challenge. The crux of the problem is -- Naughty Dog came up with their own encoding for representing korean syllable blocks, and that source information is lost so it has to be reverse engineered. Instead of trying to figure out their encoding from the text -- I went at it from the angle of just "how do i draw every single korean character using their glyph set". One might think this is way too time consuming but it's important to remember: - Korean letters are designed to be composable from a relatively small number of glyphs (more on this later) - Someone at naughty dog did basically this exact process - There is no other way! While there are loose patterns, there isn't an overarching rhyme or reason, they just picked the right glyph for the writing context (more on this later). And there are even situations where there IS NO good looking glyph, or the one ND chose looks awful and unreadable (we could technically fix this by adjusting the positioning of the glyphs but....no more)! Information on their encoding that gets passed to `convert-korean-text`: - It's a raw stream of bytes - It can contain normal font letters - Every syllable block begins with: `0x04 <...the glyph bytes...>` - DO NOT confuse `num_glyphs` with num jamo, because some glyphs can have multiple jamo! - Every section of normal text starts with `0x03`. For example a space would be `0x03 0x20` - There are a very select few number of jamo glyphs on a secondary texture page, these glyph bytes are preceeded with a `0x05`. These jamo are a variant of some of the final vowels, moving them as low down as possible. Crash course on korean writing: - Nice resource as this is basically what we are doing - https://glyphsapp.com/learn/creating-a-hangeul-font - Korean syllable blocks have either 2 or 3 jamo. Jamo are basically letters and are the individual pieces that make up the syllable blocks. - The jamo are split up into "initial", "medial" and "final" categories. Within the "medial" category there are obvious visual variants: - Horizontal - Vertical - Combination (horizontal + a vertical) - These jamo are laid out in 6 main pre-defined "orientations": - initial + vertical medial - initial + horizontal medial - initial + combination - initial + vertical medial + final - initial + horizontal medial + final - initial + combination + final - Sometimes, for stylistic reasons, jamo will be written in different ways (ie. if there is nothing below a vertical vowel will be extended). - Annoying, and ND's glyph set supports this stylistic choice! - There are some combination of jamo that are never used, and some that are only used for a single word in the entire language! With all that in mind, my basic process was: - Scan the game's entire corpus of korean text, that includes subtitles. It's very easy to look at the font texture's glyphs and assign them to their respective jamo - This let me construct a mapping and see which glyphs were used under which context - I then shoved this information into a 2-D matrix in excel, and created an in-game tool to check every single jamo permutation to fill in the gaps / change them if naughty dogs was bad. Most of the time, ND's encoding was fine. - https://docs.google.com/spreadsheets/d/e/2PACX-1vTtyMeb5-mL5rXseS9YllVj32BGCISOGZFic6nkRV5Er5aLZ9CLq1Hj_rTY7pRCn-wrQDH1rvTqUHwB/pubhtml?gid=886895534&single=true anything in red is an addition / modification on my part. - This was the most lengthy part but not as long as you may think, you can do a lot of pruning. For example if you are checking a 3-jamo variant (the ones with the most permutations) and you've verified that the medial jamo is as far up vertically as it can be, and you are using the lowest final jamo that are available -- there is nothing to check or improve -- for better or worse! So those end up being the permutations between the initial and medial instead of a three-way permutation nightmare. - Also, while it is a 2d matrix, there's a lot of pruning even within that. For example, for the first 3 orientations, you dont have to care about final vowels at all. - At the end, I'm left with a lookup table that I can use the encode the best looking korean syllable blocks possible given the context of the jamo combination. --- .gitignore | 2 +- .vscode/launch.json | 4 +- common/CMakeLists.txt | 6 +- common/goos/Reader.cpp | 64 +- common/goos/Reader.h | 5 +- common/serialization/subtitles/subtitles_v2.h | 2 +- common/serialization/text/text_ser.cpp | 49 +- common/serialization/text/text_ser.h | 2 +- common/util/FontUtils.cpp | 2047 --- common/util/Trie.h | 27 +- common/util/font/dbs/font_db_jak1.cpp | 596 + common/util/font/dbs/font_db_jak1.h | 25 + common/util/font/dbs/font_db_jak2.cpp | 866 ++ common/util/font/dbs/font_db_jak2.h | 16 + common/util/font/dbs/font_db_jak3.cpp | 794 ++ common/util/font/dbs/font_db_jak3.h | 14 + common/util/font/font_utils.cpp | 365 + .../util/{FontUtils.h => font/font_utils.h} | 109 +- common/util/font/font_utils_korean.cpp | 403 + common/util/font/font_utils_korean.h | 54 + common/util/string_util.cpp | 43 + common/util/string_util.h | 2 + decompiler/data/game_subs.h | 2 +- decompiler/data/game_text.cpp | 8 +- decompiler/data/game_text.h | 2 +- game/assets/fonts/jak2_jak3_korean_db.json | 11014 ++++++++++++++++ .../jak1/subtitle/subtitle_lines_fi-FI.json | 2 +- .../jak2/subtitle/subtitle_lines_fi-FI.json | 2 +- .../jak2/subtitle/subtitle_lines_it-IT.json | 2 +- game/assets/jak2/temp-text-id-mapping.json | 53 - game/assets/jak2/update-text-from-jak1.py | 49 - game/kernel/common/kmachine.cpp | 2 +- game/kernel/jak2/kmachine.cpp | 2 +- game/kernel/jak2/kmachine_extras.cpp | 3 +- game/kernel/jak3/kmachine_extras.cpp | 2 +- goal_src/jak2/engine/scene/scene.gc | 10 + goal_src/jak2/engine/ui/text.gc | 131 +- goal_src/jak2/kernel/gstring.gc | 22 + goal_src/jak2/pc/subtitle2.gc | 40 +- goal_src/jak2/pc/util/font-encode-test.gc | 2 + goal_src/jak2/pc/util/korean-tester.gc | 155 + goal_src/jak2/pc/util/string-viewer.gc | 108 + .../jak3/pc/progress/progress-static-pc.gc | 29 +- goal_src/jak3/pc/subtitle3.gc | 40 +- .../compiler/compilation/CompilerControl.cpp | 11 +- goalc/data_compiler/game_text_common.cpp | 41 +- goalc/data_compiler/game_text_common.h | 2 +- goalc/emitter/CodeTester.cpp | 4 + goalc/emitter/CodeTester.h | 2 + goalc/main.cpp | 1 + scripts/analyze_korean.py | 1400 ++ scripts/ci/lint-characters.py | 263 +- scripts/jamos.png | Bin 0 -> 194192 bytes 53 files changed, 16295 insertions(+), 2604 deletions(-) delete mode 100644 common/util/FontUtils.cpp create mode 100644 common/util/font/dbs/font_db_jak1.cpp create mode 100644 common/util/font/dbs/font_db_jak1.h create mode 100644 common/util/font/dbs/font_db_jak2.cpp create mode 100644 common/util/font/dbs/font_db_jak2.h create mode 100644 common/util/font/dbs/font_db_jak3.cpp create mode 100644 common/util/font/dbs/font_db_jak3.h create mode 100644 common/util/font/font_utils.cpp rename common/util/{FontUtils.h => font/font_utils.h} (51%) create mode 100644 common/util/font/font_utils_korean.cpp create mode 100644 common/util/font/font_utils_korean.h create mode 100644 game/assets/fonts/jak2_jak3_korean_db.json delete mode 100644 game/assets/jak2/temp-text-id-mapping.json delete mode 100644 game/assets/jak2/update-text-from-jak1.py create mode 100644 goal_src/jak2/pc/util/korean-tester.gc create mode 100644 goal_src/jak2/pc/util/string-viewer.gc create mode 100644 scripts/analyze_korean.py create mode 100644 scripts/jamos.png diff --git a/.gitignore b/.gitignore index 3f3bed8ad1..7be47009b3 100644 --- a/.gitignore +++ b/.gitignore @@ -86,4 +86,4 @@ __pycache__/ /TODO.md unifont-15.0.03.ttf *.diff -goalc-report.html \ No newline at end of file +goalc-report.html diff --git a/.vscode/launch.json b/.vscode/launch.json index a5b8280bfc..0c44e384f5 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -8,10 +8,10 @@ "name": "run python script", "type": "python", "request": "launch", - "program": "${workspaceFolder}/scripts/gsrc/compare-compilation-outputs.py", + "program": "${workspaceFolder}/scripts/ci/lint-characters.py", "console": "integratedTerminal", "cwd": "${workspaceFolder}", - "args": [] + "args": ["--fix"] }, ] } diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index c71cd15432..90203686c9 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -83,7 +83,11 @@ add_library(common util/dialogs.cpp util/diff.cpp util/FileUtil.cpp - util/FontUtils.cpp + util/font/dbs/font_db_jak1.cpp + util/font/dbs/font_db_jak2.cpp + util/font/dbs/font_db_jak3.cpp + util/font/font_utils_korean.cpp + util/font/font_utils.cpp util/FrameLimiter.cpp util/json_util.cpp util/os.cpp diff --git a/common/goos/Reader.cpp b/common/goos/Reader.cpp index 4d2f56a5e4..7070b6946d 100644 --- a/common/goos/Reader.cpp +++ b/common/goos/Reader.cpp @@ -13,7 +13,7 @@ #include "common/log/log.h" #include "common/util/FileUtil.h" -#include "common/util/FontUtils.h" +#include "common/util/font/font_utils.h" #include "fmt/format.h" #include "fmt/ranges.h" @@ -156,39 +156,6 @@ Reader::Reader() { for (const char* c = bonus; *c; c++) { m_valid_symbols_chars[(int)*c] = true; } - - // table of characters that are valid in source code: - for (auto& x : m_valid_source_text_chars) { - x = false; - } - for (int i = ' '; i <= '~'; i++) { - m_valid_source_text_chars[i] = true; - } - m_valid_source_text_chars[(int)'\n'] = true; - m_valid_source_text_chars[(int)'\t'] = true; - m_valid_source_text_chars[(int)'\r'] = true; - - // allow every character that gets transformed to something else - for (auto& [version, font] : g_font_banks) { - for (auto& remap : *font->encode_info()) { - for (auto rc : remap.chars) { - m_valid_source_text_chars[(u8)rc] = true; - } - } - for (auto& remap : *font->replace_info()) { - for (auto rc : remap.to) { - m_valid_source_text_chars[(u8)rc] = true; - } - for (auto rc : remap.from) { - m_valid_source_text_chars[(u8)rc] = true; - } - } - } - m_valid_source_text_chars[0] = false; -} - -bool Reader::is_valid_source_char(char c) const { - return m_valid_source_text_chars[(u8)c]; } /*! @@ -266,17 +233,6 @@ Object Reader::internal_read(std::shared_ptr text, fmt::format("Text file {} has invalid encoding", text->get_description())); } - // validate the input - for (int offset = check_encoding ? 3 : 0; offset < text->get_size(); offset++) { - if (!is_valid_source_char(text->get_text()[offset])) { - // failed. - int line_number = text->get_line_idx(offset) + 1; - throw std::runtime_error(fmt::format("Invalid character found on line {} of {}: 0x{:x}", - line_number, text->get_description(), - (u8)text->get_text()[offset])); - } - } - // first create stream TextStream ts(text); @@ -301,15 +257,6 @@ Object Reader::internal_read(std::shared_ptr text, } } -bool Reader::check_string_is_valid(const std::string& str) const { - for (auto c : str) { - if (!is_valid_source_char(c)) { - return false; - } - } - return true; -} - /*! * Given a stream starting at the first character of a token, get the token. Doesn't consume * whitespace at the end and leaves the stream on the first character after the token. @@ -905,4 +852,13 @@ std::string get_readable_string(const char* in) { } return result; } + +std::string get_byte_string(const char* in) { + std::string result; + while (*in) { + result += fmt::format("\\c{:02x}", uint8_t(*in)); + in++; + } + return result; +} } // namespace goos diff --git a/common/goos/Reader.h b/common/goos/Reader.h index c20071e1a3..9b6b1ea6fd 100644 --- a/common/goos/Reader.h +++ b/common/goos/Reader.h @@ -75,7 +75,6 @@ class Reader { const std::optional& string_name = {}); std::optional read_from_stdin(const std::string& prompt, REPL::Wrapper& repl); Object read_from_file(const std::vector& file_path, bool check_encoding = false); - bool check_string_is_valid(const std::string& str) const; SymbolTable symbolTable; TextDb db; @@ -101,12 +100,10 @@ class Reader { void add_reader_macro(const std::string& shortcut, std::string replacement); bool m_valid_symbols_chars[256]; - bool m_valid_source_text_chars[256]; - - bool is_valid_source_char(char c) const; std::unordered_map m_reader_macros; }; +std::string get_byte_string(const char* in); std::string get_readable_string(const char* in); } // namespace goos diff --git a/common/serialization/subtitles/subtitles_v2.h b/common/serialization/subtitles/subtitles_v2.h index 6023338f7e..f5c22e4bb5 100644 --- a/common/serialization/subtitles/subtitles_v2.h +++ b/common/serialization/subtitles/subtitles_v2.h @@ -2,7 +2,7 @@ #include "common/serialization/subtitles/subtitles.h" #include "common/util/Assert.h" -#include "common/util/FontUtils.h" +#include "common/util/font/font_utils.h" #include "common/util/json_util.h" struct SubtitleLineMetadata { diff --git a/common/serialization/text/text_ser.cpp b/common/serialization/text/text_ser.cpp index 6e579401b3..f11f2faa3c 100644 --- a/common/serialization/text/text_ser.cpp +++ b/common/serialization/text/text_ser.cpp @@ -2,6 +2,7 @@ #include "common/goos/ParseHelpers.h" #include "common/goos/Reader.h" +#include "common/util/font/font_utils_korean.h" int64_t get_int(const goos::Object& obj) { if (obj.is_int()) { @@ -44,7 +45,7 @@ std::string get_string(const goos::Object& x) { void parse_text_goal(const goos::Object& data, GameTextDB& db, const GameTextDefinitionFile& /*file_info*/) { - const GameTextFontBank* font = nullptr; + GameTextFontBank* font = nullptr; std::vector> banks; std::string possible_group_name; @@ -122,9 +123,15 @@ void parse_text_goal(const goos::Object& data, if (b_i >= int(banks.size())) { throw std::runtime_error(fmt::format("Too many strings in text id #x{:x}", id)); } - - auto line = font->convert_utf8_to_game(entry.as_string()->data); - banks[b_i++]->set_line(id, line); + if (font->is_language_id_korean(b_i)) { + // korean changes differently! + auto line = font->convert_utf8_to_game_korean(entry.as_string()->data); + banks[b_i]->set_line(id, line); + } else { + auto line = font->convert_utf8_to_game(entry.as_string()->data); + banks[b_i]->set_line(id, line); + } + b_i++; } else { throw std::runtime_error(fmt::format("Non-string value in text id #x{:x}", id)); } @@ -165,8 +172,15 @@ void parse_text_goal(const goos::Object& data, throw std::runtime_error(fmt::format("Too many strings in text id #x{:x}", id)); } - auto line = font->convert_utf8_to_game(entry.as_string()->data); - banks[i++]->set_line(id, line); + if (font->is_language_id_korean(i)) { + // handle korean differently! + auto line = font->convert_utf8_to_game_korean(entry.as_string()->data); + banks[i]->set_line(id, line); + } else { + auto line = font->convert_utf8_to_game(entry.as_string()->data); + banks[i]->set_line(id, line); + } + i++; } else { throw std::runtime_error(fmt::format("Non-string value in text id #x{:x}", id)); } @@ -230,15 +244,20 @@ void parse_text_json(const nlohmann::json& json, } else { bank = db.bank_by_id(file_info.group_name.value(), file_info.language_id); } - const GameTextFontBank* font = get_font_bank(file_info.text_version); + GameTextFontBank* font = get_font_bank(file_info.text_version); // Parse the file for (const auto& [text_id, text_value] : json.items()) { auto line_id = std::stoi(text_id, nullptr, 16); if (text_value.is_string()) { // single line replacement - auto line = font->convert_utf8_to_game(text_value); - // TODO - lint duplicate line definitions across text files - bank->set_line(line_id, line); + if (font->is_language_id_korean(file_info.language_id)) { + auto line = font->convert_utf8_to_game_korean(text_value); + bank->set_line(line_id, line); + } else { + auto line = font->convert_utf8_to_game(text_value); + bank->set_line(line_id, line); + } + } else if (text_value.is_array()) { // multi-line replacement starting from line_id // (e.g. for Jak 1 credits, start from x0b00) @@ -247,8 +266,14 @@ void parse_text_json(const nlohmann::json& json, throw std::runtime_error(fmt::format( "Non string provided for line {} / text id #x{} of _credits", idx, line_id)); } - auto line = font->convert_utf8_to_game(raw_line); - bank->set_line(line_id++, line); // increment line_id + + if (font->is_language_id_korean(file_info.language_id)) { + auto line = font->convert_utf8_to_game_korean(raw_line); + bank->set_line(line_id++, line); // increment line_id + } else { + auto line = font->convert_utf8_to_game(raw_line); + bank->set_line(line_id++, line); // increment line_id + } } } else { // Unexpected value type diff --git a/common/serialization/text/text_ser.h b/common/serialization/text/text_ser.h index 778aa3dac7..ec12de7ab6 100644 --- a/common/serialization/text/text_ser.h +++ b/common/serialization/text/text_ser.h @@ -11,7 +11,7 @@ #include "common/goos/Object.h" #include "common/log/log.h" #include "common/util/Assert.h" -#include "common/util/FontUtils.h" +#include "common/util/font/font_utils.h" #include "common/util/json_util.h" #include "common/versions/versions.h" diff --git a/common/util/FontUtils.cpp b/common/util/FontUtils.cpp deleted file mode 100644 index f936c2fc67..0000000000 --- a/common/util/FontUtils.cpp +++ /dev/null @@ -1,2047 +0,0 @@ -/*! - * @file FontUtils.cpp - * - * Code for handling text and strings in Jak 1's "large font" format. - * - * MAKE SURE THIS FILE IS ENCODED IN UTF-8!!! The various strings here depend on it. - * Always verify the encoding if string detection suddenly goes awry. - */ - -#include "FontUtils.h" - -#include -#include - -#include "string_util.h" - -#include "common/util/Assert.h" - -#include "fmt/format.h" - -const std::unordered_map sTextVerEnumMap = { - {"jak1-v1", GameTextVersion::JAK1_V1}, - {"jak1-v2", GameTextVersion::JAK1_V2}, - {"jak2", GameTextVersion::JAK2}, - {"jak3", GameTextVersion::JAK3}}; - -const std::string& get_text_version_name(GameTextVersion version) { - for (auto& [name, ver] : sTextVerEnumMap) { - if (ver == version) { - return name; - } - } - throw std::runtime_error(fmt::format("invalid text version {}", fmt::underlying(version))); -} - -GameTextVersion get_text_version_from_name(const std::string& name) { - return sTextVerEnumMap.at(name); -} - -GameTextFontBank::GameTextFontBank(GameTextVersion version, - std::vector* encode_info, - std::vector* replace_info, - std::unordered_set* passthrus) - : m_version(version), - m_encode_info(encode_info), - m_replace_info(replace_info), - m_passthrus(passthrus) { - std::sort( - m_encode_info->begin(), m_encode_info->end(), - [](const EncodeInfo& a, const EncodeInfo& b) { return a.bytes.size() > b.bytes.size(); }); - std::sort( - m_replace_info->begin(), m_replace_info->end(), - [](const ReplaceInfo& a, const ReplaceInfo& b) { return a.from.size() > b.from.size(); }); -} - -/*! - * Finds a remap info that best matches the byte sequence (is the longest match). - */ -const EncodeInfo* GameTextFontBank::find_encode_to_utf8(const char* in) const { - const EncodeInfo* best_info = nullptr; - for (auto& info : *m_encode_info) { - if (info.bytes.size() == 0) - continue; - - bool found = true; - for (int i = 0; found && i < (int)info.bytes.size(); ++i) { - if (uint8_t(in[i]) != info.bytes.at(i)) { - found = false; - } - } - - if (found && (!best_info || info.chars.length() > best_info->chars.length())) { - best_info = &info; - } - } - return best_info; -} - -/*! - * Finds a remap info that best matches the character sequence (is the longest match). - */ -const EncodeInfo* GameTextFontBank::find_encode_to_game(const std::string& in, int off) const { - const EncodeInfo* best_info = nullptr; - for (auto& info : *m_encode_info) { - if (info.chars.length() == 0) - continue; - - bool found = true; - for (int i = 0; found && i < (int)info.chars.length() && i + off < (int)in.size(); ++i) { - if (in.at(i + off) != info.chars.at(i)) { - found = false; - } - } - - if (found && (!best_info || info.chars.length() > best_info->chars.length())) { - best_info = &info; - } - } - return best_info; -} - -/*! - * Finds a remap info that best matches the character sequence (is the longest match). - */ -const ReplaceInfo* GameTextFontBank::find_replace_to_utf8(const std::string& in, int off) const { - const ReplaceInfo* best_info = nullptr; - for (auto& info : *m_replace_info) { - if (info.from.empty() || in.size() - off < info.from.size()) - continue; - - bool found = memcmp(in.data() + off, info.from.data(), info.from.size()) == 0; - if (found && (!best_info || info.from.length() > best_info->from.length())) { - best_info = &info; - } - } - return best_info; -} - -/*! - * Finds a remap info that best matches the character sequence (is the longest match). - */ -const ReplaceInfo* GameTextFontBank::find_replace_to_game(const std::string& in, int off) const { - const ReplaceInfo* best_info = nullptr; - for (auto& info : *m_replace_info) { - if (info.to.empty() || in.size() - off < info.to.size()) - continue; - - bool found = memcmp(in.data() + off, info.to.data(), info.to.size()) == 0; - if (found && (!best_info || info.to.length() > best_info->to.length())) { - best_info = &info; - } - } - return best_info; -} - -/*! - * Try to replace specific substrings with better variants. - * These are for hiding confusing text transforms. - */ -std::string GameTextFontBank::replace_to_utf8(std::string& str) const { - std::string newstr; - - for (int i = 0; i < (int)str.length();) { - auto remap = find_replace_to_utf8(str, i); - if (!remap) { - newstr.push_back(str.at(i)); - i += 1; - } else { - for (auto b : remap->to) { - newstr.push_back(b); - } - i += remap->from.length(); - } - } - - str = newstr; - return str; -} - -std::string GameTextFontBank::replace_to_game(std::string& str) const { - std::string newstr; - - for (int i = 0; i < (int)str.length();) { - auto remap = find_replace_to_game(str, i); - if (!remap) { - newstr.push_back(str.at(i)); - i += 1; - } else { - for (auto b : remap->from) { - newstr.push_back(b); - } - i += remap->to.length(); - } - } - - str = newstr; - return str; -} - -std::string GameTextFontBank::encode_utf8_to_game(std::string& str) const { - std::string newstr; - - for (int i = 0; i < (int)str.length();) { - auto remap = find_encode_to_game(str, i); - if (!remap) { - newstr.push_back(str.at(i)); - i += 1; - } else { - for (auto b : remap->bytes) { - newstr.push_back(b); - } - i += remap->chars.length(); - } - } - - str = newstr; - return str; -} - -/*! - * Turn a normal readable string into a string readable in the in-game font encoding and converts - * \cXX escape sequences - */ -// NOTE - the convert_utf8_to_game function is really really slow (about 80-90% of the -// time loading the text files) -// TODO - improve that as a follow up sometime in the future -std::string GameTextFontBank::convert_utf8_to_game(std::string str, bool escape) const { - std::string newstr; - - if (escape) { - for (size_t i = 0; i < str.size(); ++i) { - auto c = str.at(i); - if (c == '"') { - newstr.push_back('"'); - i += 1; - } else if (c == '\\') { - if (i + 1 >= str.size()) { - throw std::runtime_error("incomplete string escape code"); - } - auto p = str.at(i + 1); - if (p == 'c') { - if (i + 3 >= str.size()) { - throw std::runtime_error("incomplete string escape code"); - } - auto first = str.at(i + 2); - auto second = str.at(i + 3); - if (!str_util::hex_char(first) || !str_util::hex_char(second)) { - throw std::runtime_error("invalid character escape hex number"); - } - char hex_num[3] = {first, second, '\0'}; - std::size_t end = 0; - auto value = std::stoul(hex_num, &end, 16); - if (end != 2) { - throw std::runtime_error("invalid character escape"); - } - ASSERT(value < 256); - newstr.push_back(char(value)); - i += 3; - } else if (p == '"' || p == '\\') { - newstr.push_back(p); - i += 1; - } else { - throw std::runtime_error( - fmt::format("unknown string escape code '{}' (0x{:x})", p, u32(p))); - } - } else { - newstr.push_back(c); - } - } - } else { - newstr = str; - } - - replace_to_game(newstr); - encode_utf8_to_game(newstr); - return newstr; -} - -bool GameTextFontBank::valid_char_range(const char in) const { - if (m_version == GameTextVersion::JAK1_V1 || m_version == GameTextVersion::JAK1_V2) { - return ((in >= '0' && in <= '9') || (in >= 'A' && in <= 'Z') || - m_passthrus->find(in) != m_passthrus->end()) && - in != '\\'; - } else if (m_version == GameTextVersion::JAK2 || m_version == GameTextVersion::JAK3 || - m_version == GameTextVersion::JAKX) { - return ((in >= '0' && in <= '9') || (in >= 'A' && in <= 'Z') || (in >= 'a' && in <= 'z') || - m_passthrus->find(in) != m_passthrus->end()) && - in != '\\'; - } - return false; -} - -/*! - * Convert a string from the game-text font encoding to something normal. - * Unprintable characters become escape sequences, including tab and newline. - */ -std::string GameTextFontBank::convert_game_to_utf8(const char* in) const { - std::string temp; - std::string result; - while (*in) { - auto remap = find_encode_to_utf8(in); - if (remap != nullptr) { - temp.append(remap->chars); - in += remap->bytes.size() - 1; - } else if (valid_char_range(*in) || *in == '\n' || *in == '\t' || *in == '\\' || *in == '\"') { - temp.push_back(*in); - } else { - temp += fmt::format("\\c{:02x}", uint8_t(*in)); - } - in++; - } - replace_to_utf8(temp); - for (size_t i = 0; i < temp.length(); ++i) { - auto c = temp.at(i); - if (c == '\n') { - result += "\\n"; - } else if (c == '\t') { - result += "\\t"; - } else if (c == '\\') { - if (i < temp.length() - 1 && temp.at(i + 1) == 'c') { - result.push_back(c); - } else { - result += "\\\\"; - } - } else if (c == '"') { - result += "\\\""; - } else { - result.push_back(c); - } - } - return replace_to_utf8(result); -} - -static std::vector s_encode_info_null = {}; -static std::vector s_replace_info_null = {}; - -/*! - * =========================== - * GAME TEXT FONT BANK - JAK 1 - * =========================== - * This font is used in: - * - Jak & Daxter: The Precursor Legacy (Black Label) - */ - -static std::unordered_set s_passthrus_jak1 = {'~', ' ', ',', '.', '-', '+', '(', ')', - '!', ':', '?', '=', '%', '*', '/', '#', - ';', '<', '>', '@', '[', '_'}; - -static std::vector s_encode_info_jak1 = { - // random - {"ˇ", {0x10}}, // caron - {"`", {0x11}}, // grave accent - {"'", {0x12}}, // apostrophe - {"^", {0x13}}, // circumflex - {"", {0x14}}, // tilde - {"¨", {0x15}}, // umlaut - {"º", {0x16}}, // numero/overring - {"¡", {0x17}}, // inverted exclamation mark - {"¿", {0x18}}, // inverted question mark - - {"海", {0x1a}}, // umi - {"Æ", {0x1b}}, // aesc - {"界", {0x1c}}, // kai - {"Ç", {0x1d}}, // c-cedilla - {"学", {0x1e}}, // gaku - {"ß", {0x1f}}, // eszett - - {"ワ", {0x24}}, // wa - - {"ヲ", {0x26}}, // wo - {"ン", {0x27}}, // -n - - {"岩", {0x5c}}, // iwa - {"旧", {0x5d}}, // kyuu - {"空", {0x5e}}, // sora - //{"掘", {0x5f}}, // horu - - {"ヮ", {0x60}}, // -wa - {"撃", {0x61}}, // utsu - {"賢", {0x62}}, // kashikoi - {"湖", {0x63}}, // mizuumi - {"口", {0x64}}, // kuchi - {"行", {0x65}}, // iku - {"合", {0x66}}, // ai - {"士", {0x67}}, // shi - {"寺", {0x68}}, // tera - {"山", {0x69}}, // yama - {"者", {0x6a}}, // mono - {"所", {0x6b}}, // tokoro - {"書", {0x6c}}, // kaku - {"小", {0x6d}}, // shou - {"沼", {0x6e}}, // numa - {"上", {0x6f}}, // ue - {"城", {0x70}}, // shiro - {"場", {0x71}}, // ba - {"出", {0x72}}, // shutsu - {"闇", {0x73}}, // yami - {"遺", {0x74}}, // nokosu - {"黄", {0x75}}, // ki - {"屋", {0x76}}, // ya - {"下", {0x77}}, // shita - {"家", {0x78}}, // ie - {"火", {0x79}}, // hi - {"花", {0x7a}}, // hana - {"レ", {0x7b}}, // re - {"Œ", {0x7c}}, // oe - {"ロ", {0x7d}}, // ro - - {"青", {0x7f}}, // ao - - {"・", {0x90}}, // nakaguro - {"゛", {0x91}}, // dakuten - {"゜", {0x92}}, // handakuten - {"ー", {0x93}}, // chouompu - {"『", {0x94}}, // nijuukagikakko left - {"』", {0x95}}, // nijuukagikakko right - // hiragana - {"ぁ", {0x96}}, // -a - {"あ", {0x97}}, // a - {"ぃ", {0x98}}, // -i - {"い", {0x99}}, // i - {"ぅ", {0x9a}}, // -u - {"う", {0x9b}}, // u - {"ぇ", {0x9c}}, // -e - {"え", {0x9d}}, // e - {"ぉ", {0x9e}}, // -o - {"お", {0x9f}}, // o - {"か", {0xa0}}, // ka - {"き", {0xa1}}, // ki - {"く", {0xa2}}, // ku - {"け", {0xa3}}, // ke - {"こ", {0xa4}}, // ko - {"さ", {0xa5}}, // sa - {"し", {0xa6}}, // shi - {"す", {0xa7}}, // su - {"せ", {0xa8}}, // se - {"そ", {0xa9}}, // so - {"た", {0xaa}}, // ta - {"ち", {0xab}}, // chi - {"っ", {0xac}}, // sokuon - {"つ", {0xad}}, // tsu - {"て", {0xae}}, // te - {"と", {0xaf}}, // to - {"な", {0xb0}}, // na - {"に", {0xb1}}, // ni - {"ぬ", {0xb2}}, // nu - {"ね", {0xb3}}, // ne - {"の", {0xb4}}, // no - {"は", {0xb5}}, // ha - {"ひ", {0xb6}}, // hi - {"ふ", {0xb7}}, // hu - {"へ", {0xb8}}, // he - {"ほ", {0xb9}}, // ho - {"ま", {0xba}}, // ma - {"み", {0xbb}}, // mi - {"む", {0xbc}}, // mu - {"め", {0xbd}}, // me - {"も", {0xbe}}, // mo - {"ゃ", {0xbf}}, // youon ya - {"や", {0xc0}}, // ya - {"ゅ", {0xc1}}, // youon yu - {"ゆ", {0xc2}}, // yu - {"ょ", {0xc3}}, // youon yo - {"よ", {0xc4}}, // yo - {"ら", {0xc5}}, // ra - {"り", {0xc6}}, // ri - {"る", {0xc7}}, // ru - {"れ", {0xc8}}, // re - {"ろ", {0xc9}}, // ro - {"ゎ", {0xca}}, // -wa - {"わ", {0xcb}}, // wa - {"を", {0xcc}}, // wo - {"ん", {0xcd}}, // -n - // katakana - {"ァ", {0xce}}, // -a - {"ア", {0xcf}}, // a - {"ィ", {0xd0}}, // -i - {"イ", {0xd1}}, // i - {"ゥ", {0xd2}}, // -u - {"ウ", {0xd3}}, // u - {"ェ", {0xd4}}, // -e - {"エ", {0xd5}}, // e - {"ォ", {0xd6}}, // -o - {"オ", {0xd7}}, // o - {"カ", {0xd8}}, // ka - {"キ", {0xd9}}, // ki - {"ク", {0xda}}, // ku - {"ケ", {0xdb}}, // ke - {"コ", {0xdc}}, // ko - {"サ", {0xdd}}, // sa - {"シ", {0xde}}, // shi - {"ス", {0xdf}}, // su - {"セ", {0xe0}}, // se - {"ソ", {0xe1}}, // so - {"タ", {0xe2}}, // ta - {"チ", {0xe3}}, // chi - {"ッ", {0xe4}}, // sokuon - {"ツ", {0xe5}}, // tsu - {"テ", {0xe6}}, // te - {"ト", {0xe7}}, // to - {"ナ", {0xe8}}, // na - {"ニ", {0xe9}}, // ni - {"ヌ", {0xea}}, // nu - {"ネ", {0xeb}}, // ne - {"ノ", {0xec}}, // no - {"ハ", {0xed}}, // ha - {"ヒ", {0xee}}, // hi - {"フ", {0xef}}, // hu - {"ヘ", {0xf0}}, // he - {"ホ", {0xf1}}, // ho - {"マ", {0xf2}}, // ma - {"ミ", {0xf3}}, // mi - {"ム", {0xf4}}, // mu - {"メ", {0xf5}}, // me - {"モ", {0xf6}}, // mo - {"ャ", {0xf7}}, // youon ya - {"ヤ", {0xf8}}, // ya - {"ュ", {0xf9}}, // youon yu - {"ユ", {0xfa}}, // yu - {"ョ", {0xfb}}, // youon yo - {"ヨ", {0xfc}}, // yo - {"ラ", {0xfd}}, // ra - {"リ", {0xfe}}, // ri - {"ル", {0xff}}, // ru - // kanji 2 - {"宝", {1, 0x01}}, // takara - - {"石", {1, 0x10}}, // ishi - {"赤", {1, 0x11}}, // aka - {"跡", {1, 0x12}}, // ato - {"川", {1, 0x13}}, // kawa - {"戦", {1, 0x14}}, // ikusa - {"村", {1, 0x15}}, // mura - {"隊", {1, 0x16}}, // tai - {"台", {1, 0x17}}, // utena - {"長", {1, 0x18}}, // osa - {"鳥", {1, 0x19}}, // tori - {"艇", {1, 0x1a}}, // tei - {"洞", {1, 0x1b}}, // hora - {"道", {1, 0x1c}}, // michi - {"発", {1, 0x1d}}, // hatsu - {"飛", {1, 0x1e}}, // tobu - {"噴", {1, 0x1f}}, // fuku - - {"池", {1, 0xa0}}, // ike - {"中", {1, 0xa1}}, // naka - {"塔", {1, 0xa2}}, // tou - {"島", {1, 0xa3}}, // shima - {"部", {1, 0xa4}}, // bu - {"砲", {1, 0xa5}}, // hou - {"産", {1, 0xa6}}, // san - {"眷", {1, 0xa7}}, // kaerimiru - {"力", {1, 0xa8}}, // chikara - {"緑", {1, 0xa9}}, // midori - {"岸", {1, 0xaa}}, // kishi - {"像", {1, 0xab}}, // zou - {"谷", {1, 0xac}}, // tani - {"心", {1, 0xad}}, // kokoro - {"森", {1, 0xae}}, // mori - {"水", {1, 0xaf}}, // mizu - {"船", {1, 0xb0}}, // fune - {"™", {1, 0xb1}}, // trademark -}; - -static std::vector s_replace_info_jak1 = { - // other - {"A~Y~-21H~-5Vº~Z", "Å"}, - {"N~Y~-6Hº~Z~+10H", "Nº"}, - {"O~Y~-16H~-1V/~Z", "Ø"}, - {"A~Y~-6H~+3V,~Z", "Ą"}, - {"E~Y~-6H~+2V,~Z", "Ę"}, - {"L~Y~-16H~+0V/~Z", "Ł"}, - {"Z~Y~-21H~-5Vº~Z", "Ż"}, - {"E~Y~-20H~-5Vº~Z", "Ė"}, - {"C~Y~-20H~-4Vˇ~Z", "Č"}, - {"S~Y~-22H~-4Vˇ~Z", "Š"}, - {"Z~Y~-22H~-4Vˇ~Z", "Ž"}, - {"U~Y~-13H~+2V,~Z", "Ų"}, - {"U~Y~-18H~-10V-~Z", "Ū"}, - {"D~Y~-25H~-1V-~Z", "Đ"}, - {"I~Y~-8H~+1V,~Z", "Į"}, - // czech specific - {"U~Y~-23H~-5Vº~Z", "Ů"}, - - // tildes - {"N~Y~-22H~-4V~Z", "Ñ"}, - {"A~Y~-21H~-5V~Z", "Ã"}, // custom - {"O~Y~-22H~-4V~Z", "Õ"}, // custom - - // acute accents - {"A~Y~-21H~-5V'~Z", "Á"}, - {"E~Y~-22H~-5V'~Z", "É"}, - {"I~Y~-19H~-5V'~Z", "Í"}, - {"O~Y~-22H~-4V'~Z", "Ó"}, - {"U~Y~-24H~-3V'~Z", "Ú"}, - {"C~Y~-21H~-5V'~Z", "Ć"}, - {"N~Y~-21H~-5V'~Z", "Ń"}, - {"S~Y~-21H~-5V'~Z", "Ś"}, - {"Z~Y~-21H~-5V'~Z", "Ź"}, - // czech specific - {"Y~Y~-25H~-4V'~Z", "Ý"}, - - // double acute accents - {"O~Y~-28H~-4V'~-9H'~Z", "Ő"}, // custom - {"U~Y~-27H~-4V'~-12H'~Z", "Ű"}, // custom - - // circumflex - {"A~Y~-20H~-4V^~Z", "Â"}, // custom - {"E~Y~-20H~-5V^~Z", "Ê"}, - {"I~Y~-19H~-5V^~Z", "Î"}, - {"O~Y~-20H~-4V^~Z", "Ô"}, // custom - {"U~Y~-24H~-3V^~Z", "Û"}, - - // grave accents - {"A~Y~-21H~-5V`~Z", "À"}, - {"E~Y~-22H~-5V`~Z", "È"}, - {"I~Y~-19H~-5V`~Z", "Ì"}, - {"O~Y~-22H~-4V`~Z", "Ò"}, // custom - {"U~Y~-24H~-3V`~Z", "Ù"}, - - // umlaut - {"A~Y~-21H~-5V¨~Z", "Ä"}, - {"E~Y~-20H~-5V¨~Z", "Ë"}, - {"I~Y~-19H~-5V¨~Z", "Ï"}, // custom - {"O~Y~-22H~-4V¨~Z", "Ö"}, - {"O~Y~-22H~-3V¨~Z", "ö"}, // dumb - {"U~Y~-22H~-3V¨~Z", "Ü"}, - - // caron - Ǎ ǎ Ě ě Ǧ ǧ Ǐ ǐ Ǒ ǒ Ǔ ǔ Y̌ y̌ - {"A~Y~-20H~-4Vˇ~Z", "Ǎ"}, - {"E~Y~-20H~-5Vˇ~Z", "Ě"}, - {"G~Y~-20H~-5Vˇ~Z", "Ǧ"}, - {"I~Y~-19H~-5Vˇ~Z", "Ǐ"}, - {"O~Y~-20H~-4Vˇ~Z", "Ǒ"}, - {"U~Y~-24H~-3Vˇ~Z", "Ǔ"}, - {"Y~Y~-24H~-3Vˇ~Z", "Y̌"}, - // czech specific - Č Ň Ř Š Ž Ť - {"C~Y~-25H~-9Vˇ~Z", "Č"}, - {"N~Y~-23H~-5Vˇ~Z", "Ň"}, - {"R~Y~-24H~-5Vˇ~Z", "Ř"}, - {"S~Y~-24H~-5Vˇ~Z", "Š"}, - {"T~Y~-23H~-5Vˇ~Z", "Ť"}, - {"Z~Y~-23H~-5Vˇ~Z", "Ž"}, - - // dakuten katakana - {"~Yウ~Z゛", "ヴ"}, - {"~Yカ~Z゛", "ガ"}, - {"~Yキ~Z゛", "ギ"}, - {"~Yク~Z゛", "グ"}, - {"~Yケ~Z゛", "ゲ"}, - {"~Yコ~Z゛", "ゴ"}, - {"~Yサ~Z゛", "ザ"}, - {"~Yシ~Z゛", "ジ"}, - {"~Yス~Z゛", "ズ"}, - {"~Yセ~Z゛", "ゼ"}, - {"~Yソ~Z゛", "ゾ"}, - {"~Yタ~Z゛", "ダ"}, - {"~Yチ~Z゛", "ヂ"}, - {"~Yツ~Z゛", "ヅ"}, - {"~Yテ~Z゛", "デ"}, - {"~Yト~Z゛", "ド"}, - {"~Yハ~Z゛", "バ"}, - {"~Yヒ~Z゛", "ビ"}, - {"~Yフ~Z゛", "ブ"}, - {"~Yヘ~Z゛", "ベ"}, - {"~Yホ~Z゛", "ボ"}, - // handakuten katakana - {"~Yハ~Z゜", "パ"}, - {"~Yヒ~Z゜", "ピ"}, - {"~Yフ~Z゜", "プ"}, - {"~Yヘ~Z゜", "ペ"}, - {"~Yホ~Z゜", "ポ"}, - // dakuten hiragana - {"~Yか~Z゛", "が"}, - {"~Yき~Z゛", "ぎ"}, - {"~Yく~Z゛", "ぐ"}, - {"~Yけ~Z゛", "げ"}, - {"~Yこ~Z゛", "ご"}, - {"~Yさ~Z゛", "ざ"}, - {"~Yし~Z゛", "じ"}, - {"~Yす~Z゛", "ず"}, - {"~Yせ~Z゛", "ぜ"}, - {"~Yそ~Z゛", "ぞ"}, - {"~Yた~Z゛", "だ"}, - {"~Yち~Z゛", "ぢ"}, - {"~Yつ~Z゛", "づ"}, - {"~Yて~Z゛", "で"}, - {"~Yと~Z゛", "ど"}, - {"~Yは~Z゛", "ば"}, - {"~Yひ~Z゛", "び"}, - {"~Yふ~Z゛", "ぶ"}, - {"~Yへ~Z゛", "べ"}, - {"~Yほ~Z゛", "ぼ"}, - // handakuten hiragana - {"~Yは~Z゜", "ぱ"}, - {"~Yひ~Z゜", "ぴ"}, - {"~Yふ~Z゜", "ぷ"}, - {"~Yへ~Z゜", "ぺ"}, - {"~Yほ~Z゜", "ぽ"}, - // japanese punctuation - {",~+8H", "、"}, - {"~+8H ", " "}, - - // (hack) special case kanji - {"~~", "世"}, - - // playstation buttons - {"~Y~22L<~Z~Y~27L*~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, - {"~Y~22L<~Z~Y~26L;~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, - {"~Y~22L<~Z~Y~25L@~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, - {"~Y~22L<~Z~Y~24L#~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, // custom -}; - -GameTextFontBank g_font_bank_jak1_v1(GameTextVersion::JAK1_V1, - &s_encode_info_jak1, - &s_replace_info_jak1, - &s_passthrus_jak1); - -/*! - * ================================ - * GAME TEXT FONT BANK - JAK 1 (v2) - * ================================ - * This font is used in: - * - Jak & Daxter: The Precursor Legacy (PAL) - * - ジャックXダクスター ~ 旧世界の遺産 - * - Jak & Daxter: The Precursor Legacy (NTSC-U v2) - * - * It is the same as v1, but _ has been fixed and no longer overlaps 掘 - */ - -static std::vector s_encode_info_jak1_v2 = { - // random - {"_", {0x03}}, // large space - {"ˇ", {0x10}}, // caron - {"`", {0x11}}, // grave accent - {"'", {0x12}}, // apostrophe - {"^", {0x13}}, // circumflex - {"", {0x14}}, // tilde - {"¨", {0x15}}, // umlaut - {"º", {0x16}}, // numero/overring - {"¡", {0x17}}, // inverted exclamation mark - {"¿", {0x18}}, // inverted question mark - - {"海", {0x1a}}, // umi - {"Æ", {0x1b}}, // aesc - {"界", {0x1c}}, // kai - {"Ç", {0x1d}}, // c-cedilla - {"学", {0x1e}}, // gaku - {"ß", {0x1f}}, // eszett - - {"ワ", {0x24}}, // wa - - {"ヲ", {0x26}}, // wo - {"ン", {0x27}}, // -n - - {"岩", {0x5c}}, // iwa - {"旧", {0x5d}}, // kyuu - {"空", {0x5e}}, // sora - {"掘", {0x5f}}, // horu - - {"ヮ", {0x60}}, // -wa - {"撃", {0x61}}, // utsu - {"賢", {0x62}}, // kashikoi - {"湖", {0x63}}, // mizuumi - {"口", {0x64}}, // kuchi - {"行", {0x65}}, // iku - {"合", {0x66}}, // ai - {"士", {0x67}}, // shi - {"寺", {0x68}}, // tera - {"山", {0x69}}, // yama - {"者", {0x6a}}, // mono - {"所", {0x6b}}, // tokoro - {"書", {0x6c}}, // kaku - {"小", {0x6d}}, // shou - {"沼", {0x6e}}, // numa - {"上", {0x6f}}, // ue - {"城", {0x70}}, // shiro - {"場", {0x71}}, // ba - {"出", {0x72}}, // shutsu - {"闇", {0x73}}, // yami - {"遺", {0x74}}, // nokosu - {"黄", {0x75}}, // ki - {"屋", {0x76}}, // ya - {"下", {0x77}}, // shita - {"家", {0x78}}, // ie - {"火", {0x79}}, // hi - {"花", {0x7a}}, // hana - {"レ", {0x7b}}, // re - {"Œ", {0x7c}}, // oe - {"ロ", {0x7d}}, // ro - - {"青", {0x7f}}, // ao - - {"・", {0x90}}, // nakaguro - {"゛", {0x91}}, // dakuten - {"゜", {0x92}}, // handakuten - {"ー", {0x93}}, // chouompu - {"『", {0x94}}, // nijuukagikakko left - {"』", {0x95}}, // nijuukagikakko right - // hiragana - {"ぁ", {0x96}}, // -a - {"あ", {0x97}}, // a - {"ぃ", {0x98}}, // -i - {"い", {0x99}}, // i - {"ぅ", {0x9a}}, // -u - {"う", {0x9b}}, // u - {"ぇ", {0x9c}}, // -e - {"え", {0x9d}}, // e - {"ぉ", {0x9e}}, // -o - {"お", {0x9f}}, // o - {"か", {0xa0}}, // ka - {"き", {0xa1}}, // ki - {"く", {0xa2}}, // ku - {"け", {0xa3}}, // ke - {"こ", {0xa4}}, // ko - {"さ", {0xa5}}, // sa - {"し", {0xa6}}, // shi - {"す", {0xa7}}, // su - {"せ", {0xa8}}, // se - {"そ", {0xa9}}, // so - {"た", {0xaa}}, // ta - {"ち", {0xab}}, // chi - {"っ", {0xac}}, // sokuon - {"つ", {0xad}}, // tsu - {"て", {0xae}}, // te - {"と", {0xaf}}, // to - {"な", {0xb0}}, // na - {"に", {0xb1}}, // ni - {"ぬ", {0xb2}}, // nu - {"ね", {0xb3}}, // ne - {"の", {0xb4}}, // no - {"は", {0xb5}}, // ha - {"ひ", {0xb6}}, // hi - {"ふ", {0xb7}}, // hu - {"へ", {0xb8}}, // he - {"ほ", {0xb9}}, // ho - {"ま", {0xba}}, // ma - {"み", {0xbb}}, // mi - {"む", {0xbc}}, // mu - {"め", {0xbd}}, // me - {"も", {0xbe}}, // mo - {"ゃ", {0xbf}}, // youon ya - {"や", {0xc0}}, // ya - {"ゅ", {0xc1}}, // youon yu - {"ゆ", {0xc2}}, // yu - {"ょ", {0xc3}}, // youon yo - {"よ", {0xc4}}, // yo - {"ら", {0xc5}}, // ra - {"り", {0xc6}}, // ri - {"る", {0xc7}}, // ru - {"れ", {0xc8}}, // re - {"ろ", {0xc9}}, // ro - {"ゎ", {0xca}}, // -wa - {"わ", {0xcb}}, // wa - {"を", {0xcc}}, // wo - {"ん", {0xcd}}, // -n - // katakana - {"ァ", {0xce}}, // -a - {"ア", {0xcf}}, // a - {"ィ", {0xd0}}, // -i - {"イ", {0xd1}}, // i - {"ゥ", {0xd2}}, // -u - {"ウ", {0xd3}}, // u - {"ェ", {0xd4}}, // -e - {"エ", {0xd5}}, // e - {"ォ", {0xd6}}, // -o - {"オ", {0xd7}}, // o - {"カ", {0xd8}}, // ka - {"キ", {0xd9}}, // ki - {"ク", {0xda}}, // ku - {"ケ", {0xdb}}, // ke - {"コ", {0xdc}}, // ko - {"サ", {0xdd}}, // sa - {"シ", {0xde}}, // shi - {"ス", {0xdf}}, // su - {"セ", {0xe0}}, // se - {"ソ", {0xe1}}, // so - {"タ", {0xe2}}, // ta - {"チ", {0xe3}}, // chi - {"ッ", {0xe4}}, // sokuon - {"ツ", {0xe5}}, // tsu - {"テ", {0xe6}}, // te - {"ト", {0xe7}}, // to - {"ナ", {0xe8}}, // na - {"ニ", {0xe9}}, // ni - {"ヌ", {0xea}}, // nu - {"ネ", {0xeb}}, // ne - {"ノ", {0xec}}, // no - {"ハ", {0xed}}, // ha - {"ヒ", {0xee}}, // hi - {"フ", {0xef}}, // hu - {"ヘ", {0xf0}}, // he - {"ホ", {0xf1}}, // ho - {"マ", {0xf2}}, // ma - {"ミ", {0xf3}}, // mi - {"ム", {0xf4}}, // mu - {"メ", {0xf5}}, // me - {"モ", {0xf6}}, // mo - {"ャ", {0xf7}}, // youon ya - {"ヤ", {0xf8}}, // ya - {"ュ", {0xf9}}, // youon yu - {"ユ", {0xfa}}, // yu - {"ョ", {0xfb}}, // youon yo - {"ヨ", {0xfc}}, // yo - {"ラ", {0xfd}}, // ra - {"リ", {0xfe}}, // ri - {"ル", {0xff}}, // ru - // kanji 2 - {"宝", {1, 0x01}}, // takara - - {"石", {1, 0x10}}, // ishi - {"赤", {1, 0x11}}, // aka - {"跡", {1, 0x12}}, // ato - {"川", {1, 0x13}}, // kawa - {"戦", {1, 0x14}}, // ikusa - {"村", {1, 0x15}}, // mura - {"隊", {1, 0x16}}, // tai - {"台", {1, 0x17}}, // utena - {"長", {1, 0x18}}, // osa - {"鳥", {1, 0x19}}, // tori - {"艇", {1, 0x1a}}, // tei - {"洞", {1, 0x1b}}, // hora - {"道", {1, 0x1c}}, // michi - {"発", {1, 0x1d}}, // hatsu - {"飛", {1, 0x1e}}, // tobu - {"噴", {1, 0x1f}}, // fuku - - {"池", {1, 0xa0}}, // ike - {"中", {1, 0xa1}}, // naka - {"塔", {1, 0xa2}}, // tou - {"島", {1, 0xa3}}, // shima - {"部", {1, 0xa4}}, // bu - {"砲", {1, 0xa5}}, // hou - {"産", {1, 0xa6}}, // san - {"眷", {1, 0xa7}}, // kaerimiru - {"力", {1, 0xa8}}, // chikara - {"緑", {1, 0xa9}}, // midori - {"岸", {1, 0xaa}}, // kishi - {"像", {1, 0xab}}, // zou - {"谷", {1, 0xac}}, // tani - {"心", {1, 0xad}}, // kokoro - {"森", {1, 0xae}}, // mori - {"水", {1, 0xaf}}, // mizu - {"船", {1, 0xb0}}, // fune - {"™", {1, 0xb1}}, // trademark -}; - -GameTextFontBank g_font_bank_jak1_v2(GameTextVersion::JAK1_V2, - &s_encode_info_jak1_v2, - &s_replace_info_jak1, - &s_passthrus_jak1); - -/*! - * ================================ - * GAME TEXT FONT BANK - JAK 2 - * ================================ - * This font is used in: - * - Jak II - * - Jak II: Renegade - * - ジャックXダクスター2 - */ - -static std::unordered_set s_passthrus_jak2 = {'~', ' ', ',', '.', '-', '+', '(', ')', - '!', ':', '?', '=', '%', '*', '/', '#', - ';', '<', '>', '@', '[', '_', ']'}; - -static std::vector s_replace_info_jak2 = { - // other - {"A~Y~-21H~-5Vº~Z", "Å"}, - {"N~Y~-6Hº~Z~+10H", "Nº"}, - {"~+4Vç~-4V", ",c"}, - - // added for translations TODO - check these for jak 2 - {"O~Y~-25H~-1V/~Z", "Ø"}, - {"o~Y~-23H~+4V/~Z", "ø"}, - {"A~Y~-13H~+8V,~Z", "Ą"}, - {"a~Y~-8H~+6V,~Z", "ą"}, - {"E~Y~-6H~+8V,~Z", "Ę"}, - {"e~Y~-10H~+7V,~Z", "ę"}, - {"L~Y~-21H~+0V/~Z", "Ł"}, - {"l~Y~-16H~+0V/~Z", "ł"}, // TODO - this one is ugly, font character addition (small slash) - {"Z~Y~-25H~-11Vº~Z", "Ż"}, - {"z~Y~-23H~-5Vº~Z", "ż"}, - {"a~Y~-25H~-5Vº~Z", "å"}, - {"S~Y~-21H~-5V'~Z", "Ś"}, - {"s~Y~-25H~-5V'~Z", "ś"}, - {"n~Y~-25H~-5V'~Z", "ń"}, - {"c~Y~-25H~-5V'~Z", "ć"}, - {"o~Y~-24H~-4V~Z", "õ"}, - {"a~Y~-24H~-4V~Z", "ã"}, - {"O~Y~-28H~-4V'~-9H'~Z", "Ő"}, - {"U~Y~-27H~-4V'~-12H'~Z", "Ű"}, - {"o~Y~-28H~-4V'~-9H'~Z", "ő"}, - {"u~Y~-28H~-4V'~-9H'~Z", "ű"}, - {"E~Y~-22H~-11Vº~Z", "Ė"}, - {"e~Y~-25H~-5Vº~Z", "ė"}, - {"C~Y~-27H~-10Vˇ~Z", "Č"}, - {"c~Y~-25H~-5Vˇ~Z", "č"}, - {"S~Y~-24H~-10Vˇ~Z", "Š"}, - {"s~Y~-22H~-4Vˇ~Z", "š"}, - {"Z~Y~-25H~-10Vˇ~Z", "Ž"}, - {"z~Y~-23H~-4Vˇ~Z", "ž"}, - {"U~Y~-15H~+5V,~Z", "Ų"}, - {"u~Y~-15H~+5V,~Z", "ų"}, - {"U~Y~-20H~-18V-~Z", "Ū"}, - {"u~Y~-18H~-15V-~Z", "ū"}, - {"D~Y~-28H~-1V-~Z", "Đ"}, - {"d~Y~-13H~-10V-~Z", "đ"}, - {"I~Y~-8H~+4V,~Z", "Į"}, - {"i~Y~-8H~+4V,~Z", "į"}, - // czech specific - {"U~Y~-24H~-7Vº~Z", "Ů"}, - {"u~Y~-23H~-5Vº~Z", "ů"}, - {"t~Y~-7H~-21V,~Z", "ť"}, - - // tildes - {"N~Y~-22H~-4V~Z", "Ñ"}, - {"n~Y~-24H~-4V~Z", "ñ"}, - {"A~Y~-21H~-5V~Z", "Ã"}, - {"O~Y~-22H~-4V~Z", "Õ"}, - - // acute accents - {"A~Y~-21H~-5V'~Z", "Á"}, - {"A~Y~-26H~-8V'~Z", "<Á_V2>"}, // unfortunate... - {"a~Y~-25H~-5V'~Z", "á"}, - {"E~Y~-23H~-9V'~Z", "É"}, - {"e~Y~-26H~-5V'~Z", "é"}, - {"I~Y~-19H~-5V'~Z", "Í"}, - {"i~Y~-19H~-8V'~Z", "í"}, - {"O~Y~-22H~-4V'~Z", "Ó"}, - {"o~Y~-26H~-4V'~Z", "ó"}, - {"U~Y~-24H~-3V'~Z", "Ú"}, - {"u~Y~-24H~-3V'~Z", "ú"}, - {"Z~Y~-24H~-3V'~Z", "Ź"}, - {"z~Y~-24H~-3V'~Z", "ź"}, - // czech specific - {"Y~Y~-26H~-5V'~Z", "Ý"}, - {"~+7Vy~-7V~Y~-24H~-3V'~Z", "ý"}, - - // circumflex - {"A~Y~-20H~-4V^~Z", "Â"}, - {"a~Y~-24H~-5V^~Z", "â"}, - {"E~Y~-20H~-5V^~Z", "Ê"}, - {"e~Y~-25H~-4V^~Z", "ê"}, - {"I~Y~-19H~-5V^~Z", "Î"}, - {"i~Y~-19H~-8V^~Z", "î"}, - {"O~Y~-20H~-4V^~Z", "Ô"}, - {"o~Y~-25H~-4V^~Z", "ô"}, - {"U~Y~-24H~-3V^~Z", "Û"}, - {"u~Y~-23H~-3V^~Z", "û"}, - - // grave accents - {"A~Y~-26H~-8V`~Z", "À"}, - {"a~Y~-25H~-5V`~Z", "à"}, - {"E~Y~-23H~-9V`~Z", "È"}, - {"e~Y~-26H~-5V`~Z", "è"}, - {"I~Y~-19H~-5V`~Z", "Ì"}, - {"i~Y~-19H~-8V`~Z", "ì"}, - {"O~Y~-22H~-4V`~Z", "Ò"}, - {"o~Y~-26H~-4V`~Z", "ò"}, - {"U~Y~-24H~-3V`~Z", "Ù"}, - {"u~Y~-24H~-3V`~Z", "ù"}, - - // umlaut - {"A~Y~-26H~-8V¨~Z", "Ä"}, - {"a~Y~-25H~-5V¨~Z", "ä"}, - {"E~Y~-20H~-5V¨~Z", "Ë"}, - {"e~Y~-25H~-5V¨~Z", "ë"}, - {"I~Y~-19H~-5V¨~Z", "Ï"}, - {"i~Y~-26H~-4V¨~Z", "ï"}, - {"O~Y~-26H~-8V¨~Z", "Ö"}, - {"o~Y~-26H~-4V¨~Z", "ö"}, - {"U~Y~-25H~-8V¨~Z", "Ü"}, - {"u~Y~-24H~-3V¨~Z", "ü"}, - - // caron - Ǎ ǎ Ě ě Ǧ ǧ Ǐ ǐ Ǒ ǒ Ǔ ǔ Y̌ y̌ - {"A~Y~-25H~-9Vˇ~Z", "Ǎ"}, - {"a~Y~-24H~-5Vˇ~Z", "ǎ"}, - {"E~Y~-22H~-8Vˇ~Z", "Ě"}, - {"e~Y~-25H~-4Vˇ~Z", "ě"}, - {"G~Y~-24H~-8Vˇ~Z", "Ǧ"}, - {"~+7Vg~-7V~Y~-25H~-4Vˇ~Z", "ǧ"}, - {"I~Y~-19H~-8Vˇ~Z", "Ǐ"}, - {"i~Y~-19H~-8Vˇ~Z", "ǐ"}, - {"O~Y~-25H~-7Vˇ~Z", "Ǒ"}, - {"o~Y~-25H~-4Vˇ~Z", "ǒ"}, - {"U~Y~-25H~-6Vˇ~Z", "Ǔ"}, - {"u~Y~-24H~-3Vˇ~Z", "ǔ"}, - {"Y~Y~-25H~-5Vˇ~Z", "Y̌"}, - {"~+7Vy~-7V~Y~-25H~-3Vˇ~Z", "y̌"}, - // czech specific - Č č Ň ň Ř ř Š š Ž ž Ť - {"C~Y~-25H~-9Vˇ~Z", "Č"}, - {"c~Y~-24H~-5Vˇ~Z", "č"}, - {"N~Y~-25H~-9Vˇ~Z", "Ň"}, - {"n~Y~-24H~-5Vˇ~Z", "ň"}, - {"R~Y~-25H~-9Vˇ~Z", "Ř"}, - {"r~Y~-22H~-5Vˇ~Z", "ř"}, - {"S~Y~-25H~-9Vˇ~Z", "Š"}, - {"s~Y~-22H~-5Vˇ~Z", "š"}, - {"T~Y~-24H~-7Vˇ~Z", "Ť"}, - {"Z~Y~-25H~-9Vˇ~Z", "Ž"}, - {"z~Y~-24H~-5Vˇ~Z", "ž"}, - - // dakuten katakana - {"~Yウ~Z゛", "ヴ"}, - {"~Yカ~Z゛", "ガ"}, - {"~Yキ~Z゛", "ギ"}, - {"~Yク~Z゛", "グ"}, - {"~Yケ~Z゛", "ゲ"}, - {"~Yコ~Z゛", "ゴ"}, - {"~Yサ~Z゛", "ザ"}, - {"~Yシ~Z゛", "ジ"}, - {"~Yス~Z゛", "ズ"}, - {"~Yセ~Z゛", "ゼ"}, - {"~Yソ~Z゛", "ゾ"}, - {"~Yタ~Z゛", "ダ"}, - {"~Yチ~Z゛", "ヂ"}, - {"~Yツ~Z゛", "ヅ"}, - {"~Yテ~Z゛", "デ"}, - {"~Yト~Z゛", "ド"}, - {"~Yハ~Z゛", "バ"}, - {"~Yヒ~Z゛", "ビ"}, - {"~Yフ~Z゛", "ブ"}, - {"~Yヘ~Z゛", "ベ"}, - {"~Yホ~Z゛", "ボ"}, - // handakuten katakana - {"~Yハ~Z゜", "パ"}, - {"~Yヒ~Z゜", "ピ"}, - {"~Yフ~Z゜", "プ"}, - {"~Yヘ~Z゜", "ペ"}, - {"~Yホ~Z゜", "ポ"}, - // dakuten hiragana - {"~Yか~Z゛", "が"}, - {"~Yき~Z゛", "ぎ"}, - {"~Yく~Z゛", "ぐ"}, - {"~Yけ~Z゛", "げ"}, - {"~Yこ~Z゛", "ご"}, - {"~Yさ~Z゛", "ざ"}, - {"~Yし~Z゛", "じ"}, - {"~Yす~Z゛", "ず"}, - {"~Yせ~Z゛", "ぜ"}, - {"~Yそ~Z゛", "ぞ"}, - {"~Yた~Z゛", "だ"}, - {"~Yち~Z゛", "ぢ"}, - {"~Yつ~Z゛", "づ"}, - {"~Yて~Z゛", "で"}, - {"~Yと~Z゛", "ど"}, - {"~Yは~Z゛", "ば"}, - {"~Yひ~Z゛", "び"}, - {"~Yふ~Z゛", "ぶ"}, - {"~Yへ~Z゛", "べ"}, - {"~Yほ~Z゛", "ぼ"}, - // handakuten hiragana - {"~Yは~Z゜", "ぱ"}, - {"~Yひ~Z゜", "ぴ"}, - {"~Yふ~Z゜", "ぷ"}, - {"~Yへ~Z゜", "ぺ"}, - {"~Yほ~Z゜", "ぽ"}, - // japanese punctuation - {",~+8H", "、"}, - {"~+8H ", " "}, - - // playstation buttons - // - face - {"~Y~22L<~Z~Y~27L*~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, - {"~Y~22L<~Z~Y~26L;~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, - {"~Y~22L<~Z~Y~25L@~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, - {"~Y~22L<~Z~Y~24L#~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, - // - dpad - {"~Y~22L~Z~3L~+17H~-13V~Z~22L~+17H~+14V~Z~" - "22L~+32H~Z~+56H", - ""}, - {"~Y~22L~Z~3L~+17H~-13V~Z~3L~+17H~+14V~Z~" - "22L~+32H~Z~+56H", - ""}, - {"~Y~22L~Z~22L~+17H~-13V~Z~22L~+17H~+14V~Z~" - "22L~+32H~Z~+56H", - ""}, - // - shoulder - {"~Y~22L~-2H~-12V~Z~22L~-2H~+17V~Z~1L~+4H~+3V~Z~+" - "38H", - ""}, - {"~Y~22L~-2H~-12V~Z~22L~-2H~+17V~Z~1L~+6H~+3V~Z~+" - "38H", - ""}, - {"~Y~22L~-2H~-6V~Z~22L~-2H~+16V~Z~1L~+5H~-2V~Z~+" - "38H", - ""}, - {"~Y~22L~-2H~-6V~Z~22L~-2H~+16V~Z~1L~+5H~-2V~Z~+" - "38H", - ""}, - // - analog - {"~1L~+8H~Y~Z~6L~-16H~Z~+16h~6L~Z~" - "6L~-15V~Z~+13V~6L~Z~-10H~+9V~6L~Z~+10H~+9V~6L~Z~-10H~-11V~6L~Z~+10H~" - "-11V~6L~Z~+32H", - ""}, - {"~Y~1L~+8H~Z~6L~-8H~Z~+24H~6L~Z~+" - "40H", - ""}, - {"~Y~1L~Z~6L~-15V~Z~+13V~6L~Z~+26H", - ""}, - - // icons - {"~Y~6L<~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, - {"~Y~3L<~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, - - // flags - {"~Y~6L~Z~+15H~1L~Z~+30H~3L~Z~+45H", - ""}, - {"~Y~5L~Z~3L~]~-1H~Y~5L~Z~3L~Z~+26H", - ""}, - {"~Y~39L~~~Z~3L~Z~5L~]~-1H~Y~39L~~~" - "Z~3L~Z~5L~Z~+26H", - ""}, - {"~Y~7L~Z~+15H~1L~Z~+30H~3L~Z~+47H", - ""}, - {"~Y~1L~Z~3L~Z~7L~]~-1H~Y~1L<" - "FLAG_PART_FILL>~Z~3L~Z~7L~Z~+26H", - ""}, - {"~Y~1L~Z~3L~Z~7L~]~-1H~Y~1L<" - "FLAG_PART_FILL>~Z~3L~Z~+26H", - ""}, - {"~Y~1L~Z~39L~]~-1H~Y~1L~Z~39L<" - "FLAG_PART_KOREA_TRIGRAMS_RIGHT>~Z~-11H~7L~Z~-11H~3L~Z~+26H", - ""}, - {"~Y~1L~]~-1H~Y~1L~Z~-11H~3L~Z~+26H", - ""}, - {"~Y~1L~Z~7L~Z~7L~]" - "~-1H~Y~1L~Z~7L~Z~+26H", - ""}, - {"~Y~7L~Z~5L~Z~5L~]" - "~-1H~Y~7L~Z~5L~Z~+26H", - ""}, - {"~Y~3L~Z~1L~Z~1L~]" - "~-1H~Y~3L~Z~1L~Z~+26H", - ""}, - {"~Y~1L~Z~3L~]~-1H~Y~1L~Z~3L~Z~-19H~1L~Z~-23H~7L~Z~-23H~7L~Z~7L~Z~" - "+26H", - ""}, - {"~Y~1L~Z~7L~]~-1H~Y~1L~Z~7L~Z~-19H~1L~Z~-23H~3L~Z~-23H~3L~Z~3L~Z~" - "+26H", - ""}, - - // weird stuff - // - descenders - {"~+7Vp~-7V", "p"}, - {"~+7Vy~-7V", "y"}, - {"~+7Vg~-7V", "g"}, - {"~+7Vq~-7V", "q"}, - {"~+1Vj~-1V", "j"}, - - {"\\\\", - "~%"}, // this is 2 slashes, duplicated because we use an escape sequence when decompiling - - // - symbols and ligatures - {"~-4H~-3V~+3V~-4H", - ""}, // used for the 4<__> place in spanish. the 5th uses the same - // character but looks different...? - {"~Y~-6Hº~Z~+10H", "°"}, - - // Color / Emphasis - {"~[~0L", ""}, - {"~[~1L", ""}, - {"~[~2L", ""}, - {"~[~3L", ""}, - {"~[~4L", ""}, - {"~[~5L", ""}, - {"~[~6L", ""}, - {"~[~7L", ""}, - {"~[~8L", ""}, - {"~[~9L", ""}, - {"~[~10L", ""}, - {"~[~11L", ""}, - {"~[~12L", ""}, - {"~[~13L", ""}, - {"~[~14L", ""}, - {"~[~15L", ""}, - {"~[~16L", ""}, - {"~[~17L", ""}, - {"~[~18L", ""}, - {"~[~19L", ""}, - {"~[~20L", ""}, - {"~[~21L", ""}, - {"~[~22L", ""}, - {"~[~23L", ""}, - {"~[~24L", ""}, - {"~[~25L", ""}, - {"~[~26L", ""}, - {"~[~27L", ""}, - {"~[~28L", ""}, - {"~[~29L", ""}, - {"~[~30L", ""}, - {"~[~31L", ""}, - {"~[~32L", ""}, - {"~[~33L", ""}, - {"~[~34L", ""}, - {"~[~35L", ""}, - {"~[~36L", ""}, - {"~[~37L", ""}, - {"~[~38L", ""}, - {"~[~39L", ""}}; - -static std::vector s_encode_info_jak2 = { - {"ˇ", {0x10}}, // caron - {"`", {0x11}}, // grave accent - {"'", {0x12}}, // apostrophe - {"^", {0x13}}, // circumflex - {"", {0x14}}, // tilde - {"¨", {0x15}}, // umlaut - {"º", {0x16}}, // numero/overring - {"¡", {0x17}}, // inverted exclamation mark - {"¿", {0x18}}, // inverted question mark - {"", {0x19}}, - {"ç", {0x1d}}, // c-cedilla - {"Ç", {0x1e}}, // c-cedilla - {"ß", {0x1f}}, // eszett - - {"œ", {0x5e}}, // ligature o+e - - {"", {0x7f}}, - {"", {0x80}}, - {"", {0x81}}, - {"", {0x82}}, - {"", {0x83}}, - {"", {0x84}}, - {"", {0x85}}, - {"", {0x86}}, - {"", {0x87}}, - {"", {0x88}}, - {"", {0x89}}, - {"", {0x8a}}, - {"", {0x8b}}, - {"", {0x8c}}, - {"", {0x8d}}, - {"", {0x8e}}, - {"", {0x8f}}, - {"", {0x90}}, - {"", {0x91}}, - {"", {0x92}}, - {"", {0x93}}, - {"", {0x94}}, - {"", {0x95}}, - {"", {0x96}}, - {"", {0x97}}, - {"", {0x98}}, - {"", {0x99}}, - {"", {0x9a}}, - {"", {0x9b}}, - {"", {0x9c}}, - {"", {0x9d}}, - {"", {0x9e}}, - {"", {0x9f}}, - {"", {0xa0}}, - {"", {0xa1}}, - {"", {0xa2}}, - {"", {0xa3}}, - {"", {0xa4}}, - {"", {0xa5}}, - {"", {0xa6}}, - {"", {0xa7}}, - {"", {0xa8}}, - {"", {0xa9}}, - {"", {0xaa}}, - {"", {0xab}}, - {"", {0xac}}, - - {"", {0xb0}}, - {"", {0xb1}}, - {"", {0xb2}}, - {"", {0xb3}}, - // {"入", {1, 0x00}}, - // {"年", {1, 0x01}}, - // punctuation - {"・", {1, 0x10}}, - {"゛", {1, 0x11}}, - {"゜", {1, 0x12}}, - {"ー", {1, 0x13}}, - {"『", {1, 0x14}}, - {"』", {1, 0x15}}, - // hiragana - {"ぁ", {1, 0x16}}, // -a - {"あ", {1, 0x17}}, // a - {"ぃ", {1, 0x18}}, // -i - {"い", {1, 0x19}}, // i - {"ぅ", {1, 0x1a}}, // -u - {"う", {1, 0x1b}}, // u - {"ぇ", {1, 0x1c}}, // -e - {"え", {1, 0x1d}}, // e - {"ぉ", {1, 0x1e}}, // -o - {"お", {1, 0x1f}}, // o - {"か", {1, 0x20}}, // ka - {"き", {1, 0x21}}, // ki - {"く", {1, 0x22}}, // ku - {"け", {1, 0x23}}, // ke - {"こ", {1, 0x24}}, // ko - {"さ", {1, 0x25}}, // sa - {"し", {1, 0x26}}, // shi - {"す", {1, 0x27}}, // su - {"せ", {1, 0x28}}, // se - {"そ", {1, 0x29}}, // so - {"た", {1, 0x2a}}, // ta - {"ち", {1, 0x2b}}, // chi - {"っ", {1, 0x2c}}, // sokuon - {"つ", {1, 0x2d}}, // tsu - {"て", {1, 0x2e}}, // te - {"と", {1, 0x2f}}, // to - {"な", {1, 0x30}}, // na - {"に", {1, 0x31}}, // ni - {"ぬ", {1, 0x32}}, // nu - {"ね", {1, 0x33}}, // ne - {"の", {1, 0x34}}, // no - {"は", {1, 0x35}}, // ha - {"ひ", {1, 0x36}}, // hi - {"ふ", {1, 0x37}}, // fu - {"へ", {1, 0x38}}, // he - {"ほ", {1, 0x39}}, // ho - {"ま", {1, 0x3a}}, // ma - {"み", {1, 0x3b}}, // mi - {"む", {1, 0x3c}}, // mu - {"め", {1, 0x3d}}, // me - {"も", {1, 0x3e}}, // mo - {"ゃ", {1, 0x3f}}, // youon ya - {"や", {1, 0x40}}, // ya - {"ゅ", {1, 0x41}}, // youon yu - {"ゆ", {1, 0x42}}, // yu - {"ょ", {1, 0x43}}, // youon yo - {"よ", {1, 0x44}}, // yo - {"ら", {1, 0x45}}, // ra - {"り", {1, 0x46}}, // ri - {"る", {1, 0x47}}, // ru - {"れ", {1, 0x48}}, // re - {"ろ", {1, 0x49}}, // ro - {"ゎ", {1, 0x4a}}, // -wa - {"わ", {1, 0x4b}}, // wa - {"を", {1, 0x4c}}, // wo - {"ん", {1, 0x4d}}, // -n - // katakana - {"ァ", {1, 0x4e}}, // -a - {"ア", {1, 0x4f}}, // a - {"ィ", {1, 0x50}}, // -i - {"イ", {1, 0x51}}, // i - {"ゥ", {1, 0x52}}, // -u - {"ウ", {1, 0x53}}, // u - {"ェ", {1, 0x54}}, // -e - {"エ", {1, 0x55}}, // e - {"ォ", {1, 0x56}}, // -o - {"オ", {1, 0x57}}, // o - {"カ", {1, 0x58}}, // ka - {"キ", {1, 0x59}}, // ki - {"ク", {1, 0x5a}}, // ku - {"ケ", {1, 0x5b}}, // ke - {"コ", {1, 0x5c}}, // ko - {"サ", {1, 0x5d}}, // sa - {"シ", {1, 0x5e}}, // shi - {"ス", {1, 0x5f}}, // su - {"セ", {1, 0x60}}, // se - {"ソ", {1, 0x61}}, // so - {"タ", {1, 0x62}}, // ta - {"チ", {1, 0x63}}, // chi - {"ッ", {1, 0x64}}, // sokuon - {"ツ", {1, 0x65}}, // tsu - {"テ", {1, 0x66}}, // te - {"ト", {1, 0x67}}, // to - {"ナ", {1, 0x68}}, // na - {"ニ", {1, 0x69}}, // ni - {"ヌ", {1, 0x6a}}, // nu - {"ネ", {1, 0x6b}}, // ne - {"ノ", {1, 0x6c}}, // no - {"ハ", {1, 0x6d}}, // ha - {"ヒ", {1, 0x6e}}, // hi - {"フ", {1, 0x6f}}, // fu - {"ヘ", {1, 0x70}}, // he - {"ホ", {1, 0x71}}, // ho - {"マ", {1, 0x72}}, // ma - {"ミ", {1, 0x73}}, // mi - {"ム", {1, 0x74}}, // mu - {"メ", {1, 0x75}}, // me - {"モ", {1, 0x76}}, // mo - {"ャ", {1, 0x77}}, // youon ya - {"ヤ", {1, 0x78}}, // ya - {"ュ", {1, 0x79}}, // youon yu - {"ユ", {1, 0x7a}}, // yu - {"ョ", {1, 0x7b}}, // youon yo - {"ヨ", {1, 0x7c}}, // yo - {"ラ", {1, 0x7d}}, // ra - {"リ", {1, 0x7e}}, // ri - {"ル", {1, 0x7f}}, // ru - {"レ", {1, 0x80}}, // re - {"ロ", {1, 0x81}}, // ro - {"ヮ", {1, 0x82}}, // -wa - {"ワ", {1, 0x83}}, // wa - {"ヲ", {1, 0x84}}, // wo - {"ン", {1, 0x85}}, // -n - - {"位", {1, 0x8c}}, - {"遺", {1, 0x8d}}, - {"院", {1, 0x8e}}, - {"映", {1, 0x8f}}, - {"衛", {1, 0x90}}, - {"応", {1, 0x91}}, - {"下", {1, 0x92}}, - {"画", {1, 0x93}}, - {"解", {1, 0x94}}, - {"開", {1, 0x95}}, - {"外", {1, 0x96}}, - {"害", {1, 0x97}}, - {"蓋", {1, 0x98}}, - {"完", {1, 0x99}}, - {"換", {1, 0x9a}}, - {"監", {1, 0x9b}}, - {"間", {1, 0x9c}}, - {"器", {1, 0x9d}}, - {"記", {1, 0x9e}}, - {"逆", {1, 0x9f}}, - {"救", {1, 0xa0}}, - {"金", {1, 0xa1}}, - {"空", {1, 0xa2}}, - {"掘", {1, 0xa3}}, - {"警", {1, 0xa4}}, - {"迎", {1, 0xa5}}, - {"撃", {1, 0xa6}}, - {"建", {1, 0xa7}}, - {"源", {1, 0xa8}}, - {"現", {1, 0xa9}}, - {"言", {1, 0xaa}}, - {"限", {1, 0xab}}, - {"個", {1, 0xac}}, - {"庫", {1, 0xad}}, - {"後", {1, 0xae}}, - {"語", {1, 0xaf}}, - {"護", {1, 0xb0}}, - {"交", {1, 0xb1}}, - {"功", {1, 0xb2}}, - {"向", {1, 0xb3}}, - {"工", {1, 0xb4}}, - {"攻", {1, 0xb5}}, - {"溝", {1, 0xb6}}, - {"行", {1, 0xb7}}, - {"鉱", {1, 0xb8}}, - {"降", {1, 0xb9}}, - {"合", {1, 0xba}}, - {"告", {1, 0xbb}}, - {"獄", {1, 0xbc}}, - {"彩", {1, 0xbd}}, - {"作", {1, 0xbe}}, - {"山", {1, 0xbf}}, - {"使", {1, 0xc0}}, - {"始", {1, 0xc1}}, - {"試", {1, 0xc2}}, - {"字", {1, 0xc3}}, - {"寺", {1, 0xc4}}, - {"時", {1, 0xc5}}, - {"示", {1, 0xc6}}, - {"自", {1, 0xc7}}, - {"式", {1, 0xc8}}, - {"矢", {1, 0xc9}}, - {"射", {1, 0xca}}, - {"者", {1, 0xcb}}, - {"守", {1, 0xcc}}, - {"手", {1, 0xcd}}, - {"終", {1, 0xce}}, - {"週", {1, 0xcf}}, - {"出", {1, 0xd0}}, - {"所", {1, 0xd1}}, - {"書", {1, 0xd2}}, - {"勝", {1, 0xd3}}, - {"章", {1, 0xd4}}, - {"上", {1, 0xd5}}, - {"乗", {1, 0xd6}}, - {"場", {1, 0xd7}}, - {"森", {1, 0xd8}}, - {"進", {1, 0xd9}}, - {"人", {1, 0xda}}, - {"水", {1, 0xdb}}, - {"数", {1, 0xdc}}, - {"制", {1, 0xdd}}, - {"性", {1, 0xde}}, - {"成", {1, 0xdf}}, - {"聖", {1, 0xe0}}, - {"石", {1, 0xe1}}, - {"跡", {1, 0xe2}}, - {"先", {1, 0xe3}}, - {"戦", {1, 0xe4}}, - {"船", {1, 0xe5}}, - {"選", {1, 0xe6}}, - {"走", {1, 0xe7}}, - {"送", {1, 0xe8}}, - {"像", {1, 0xe9}}, - {"造", {1, 0xea}}, - {"続", {1, 0xeb}}, - {"対", {1, 0xec}}, - {"袋", {1, 0xed}}, - {"台", {1, 0xee}}, - {"弾", {1, 0xef}}, - {"地", {1, 0xf0}}, - {"中", {1, 0xf1}}, - {"敵", {1, 0xf2}}, - {"転", {1, 0xf3}}, - {"電", {1, 0xf4}}, - {"塔", {1, 0xf5}}, - {"頭", {1, 0xf6}}, - {"動", {1, 0xf7}}, - {"内", {1, 0xf8}}, - {"日", {1, 0xf9}}, - {"入", {1, 0xfa}}, - {"年", {1, 0xfb}}, - {"能", {1, 0xfc}}, - {"廃", {1, 0xfd}}, - {"排", {1, 0xfe}}, - {"敗", {1, 0xff}}, - - {"発", {2, 0x10}}, - {"反", {2, 0x11}}, - {"必", {2, 0x12}}, - {"表", {2, 0x13}}, - {"武", {2, 0x14}}, - {"壁", {2, 0x15}}, - {"墓", {2, 0x16}}, - {"放", {2, 0x17}}, - {"方", {2, 0x18}}, - {"砲", {2, 0x19}}, - {"妨", {2, 0x1a}}, - {"北", {2, 0x1b}}, - {"本", {2, 0x1c}}, - {"幕", {2, 0x1d}}, - {"無", {2, 0x1e}}, - {"迷", {2, 0x1f}}, - {"面", {2, 0x20}}, - {"戻", {2, 0x21}}, - {"紋", {2, 0x22}}, - {"薬", {2, 0x23}}, - {"輸", {2, 0x24}}, - {"勇", {2, 0x25}}, - {"友", {2, 0x26}}, - {"遊", {2, 0x27}}, - {"容", {2, 0x28}}, - {"要", {2, 0x29}}, - {"利", {2, 0x2a}}, - {"了", {2, 0x2b}}, - {"量", {2, 0x2c}}, - {"力", {2, 0x2d}}, - {"練", {2, 0x2e}}, - {"連", {2, 0x2f}}, - {"録", {2, 0x30}}, - {"話", {2, 0x31}}, - {"墟", {2, 0x32}}, - {"脱", {2, 0x33}}, - // {"成", {2, 0x34}}, - {"旗", {2, 0x35}}, - {"破", {2, 0x36}}, - {"壊", {2, 0x37}}, - {"全", {2, 0x38}}, - {"滅", {2, 0x39}}, - {"機", {2, 0x3a}}, - {"仲", {2, 0x3b}}, - {"渓", {2, 0x3c}}, - {"谷", {2, 0x3d}}, - {"優", {2, 0x3e}}, - {"探", {2, 0x3f}}, - {"部", {2, 0x40}}, - {"索", {2, 0x41}}, - // {"乗", {2, 0x42}}, - {"前", {2, 0x43}}, - {"右", {2, 0x44}}, - {"左", {2, 0x45}}, - {"会", {2, 0x46}}, - {"高", {2, 0x47}}, - {"低", {2, 0x48}}, - {"押", {2, 0x49}}, - {"切", {2, 0x4a}}, - {"替", {2, 0x4b}}, - // {"対", {2, 0x4c}}, - {"秒", {2, 0x4d}}, - {"箱", {2, 0x4e}}, - {"泳", {2, 0x4f}}, - {"~", {2, 0x50}}, - - {"闇", {2, 0x56}}, - {"以", {2, 0x57}}, - {"屋", {2, 0x58}}, - {"俺", {2, 0x59}}, - {"化", {2, 0x5a}}, - {"界", {2, 0x5b}}, - {"感", {2, 0x5c}}, - {"気", {2, 0x5d}}, - {"却", {2, 0x5e}}, - {"曲", {2, 0x5f}}, - {"継", {2, 0x60}}, - {"権", {2, 0x61}}, - {"見", {2, 0x62}}, - {"古", {2, 0x63}}, - {"好", {2, 0x64}}, - // {"高", {2, 0x65}}, - {"才", {2, 0x66}}, - {"士", {2, 0x67}}, - {"子", {2, 0x68}}, - {"次", {2, 0x69}}, - {"主", {2, 0x6a}}, - {"種", {2, 0x6b}}, - {"讐", {2, 0x6c}}, - {"女", {2, 0x6d}}, - {"小", {2, 0x6e}}, - {"焼", {2, 0x6f}}, - {"証", {2, 0x70}}, - {"神", {2, 0x71}}, - {"身", {2, 0x72}}, - {"寸", {2, 0x73}}, - {"世", {2, 0x74}}, - {"想", {2, 0x75}}, - {"退", {2, 0x76}}, - {"第", {2, 0x77}}, - {"着", {2, 0x78}}, - {"天", {2, 0x79}}, - {"倒", {2, 0x7a}}, - {"到", {2, 0x7b}}, - {"突", {2, 0x7c}}, - {"爆", {2, 0x7d}}, - {"番", {2, 0x7e}}, - {"負", {2, 0x7f}}, - {"復", {2, 0x80}}, - {"物", {2, 0x81}}, - {"眠", {2, 0x82}}, - {"予", {2, 0x83}}, - {"用", {2, 0x84}}, - {"落", {2, 0x85}}, - {"緑", {2, 0x86}}, - - {"封", {2, 0x88}}, - {"印", {2, 0x89}}, - {"扉", {2, 0x8a}}, - {"最", {2, 0x8b}}, - {"刻", {2, 0x8c}}, - {"足", {2, 0x8d}}, - - {"", {3, 0x00}}, - {"", {3, 0x01}}, - {"", {3, 0x02}}, - {"", {3, 0x03}}, - {"", {3, 0x04}}, - {"", {3, 0x05}}, - {"", {3, 0x06}}, - {"", {3, 0x07}}, - {"", {3, 0x08}}, - {"", {3, 0x09}}, - {"", {3, 0x0a}}, - {"", {3, 0x0b}}, - {"", {3, 0x0c}}, - {"", {3, 0x0d}}, - {"", {3, 0x0e}}, - {"", {3, 0x0f}}, - {"", {3, 0x10}}, - {"", {3, 0x11}}, - {"", {3, 0x12}}, - {"", {3, 0x13}}, - {"", {3, 0x14}}, - {"", {3, 0x15}}, - {"", {3, 0x16}}, - {"", {3, 0x17}}, - {"", {3, 0x18}}, - {"", {3, 0x19}}, - {"", {3, 0x1a}}, - {"", {3, 0x1b}}, - {"", {3, 0x1c}}, - {"", {3, 0x1d}}, - {"", {3, 0x1e}}, - {"", {3, 0x1f}}, - {"", {3, 0x20}}, - {"", {3, 0x21}}, - {"", {3, 0x22}}, - {"", {3, 0x23}}, - {"", {3, 0x24}}, - {"", {3, 0x25}}, - {"", {3, 0x26}}, - {"", {3, 0x27}}, - {"", {3, 0x28}}, - {"", {3, 0x29}}, - {"", {3, 0x2a}}, - {"", {3, 0x2b}}, - {"", {3, 0x2c}}, - {"", {3, 0x2d}}, - {"", {3, 0x2e}}, - {"", {3, 0x2f}}, - {"", {3, 0x30}}, - {"", {3, 0x31}}, - {"", {3, 0x32}}, - {"", {3, 0x33}}, - {"", {3, 0x34}}, - {"", {3, 0x35}}, - {"", {3, 0x36}}, - {"", {3, 0x37}}, - {"", {3, 0x38}}, - {"", {3, 0x39}}, - {"", {3, 0x3a}}, - {"", {3, 0x3b}}, - {"", {3, 0x3c}}, - {"", {3, 0x3d}}, - {"", {3, 0x3e}}, - {"", {3, 0x3f}}, - {"", {3, 0x40}}, - {"", {3, 0x41}}, - {"", {3, 0x42}}, - {"", {3, 0x43}}, - {"", {3, 0x44}}, - {"", {3, 0x45}}, - {"", {3, 0x46}}, - {"", {3, 0x47}}, - {"", {3, 0x48}}, - {"", {3, 0x49}}, - {"", {3, 0x4a}}, - {"", {3, 0x4b}}, - {"", {3, 0x4c}}, - {"", {3, 0x4d}}, - {"", {3, 0x4e}}, - {"", {3, 0x4f}}, - {"", {3, 0x50}}, - {"", {3, 0x51}}, - {"", {3, 0x52}}, - {"", {3, 0x53}}, - {"", {3, 0x54}}, - {"", {3, 0x55}}, - {"", {3, 0x56}}, - {"", {3, 0x57}}, - {"", {3, 0x58}}, - {"", {3, 0x59}}, - {"", {3, 0x5a}}, - {"", {3, 0x5b}}, - {"", {3, 0x5c}}, - {"", {3, 0x5d}}, - {"", {3, 0x5e}}, - {"", {3, 0x5f}}, - {"", {3, 0x60}}, - {"", {3, 0x61}}, - {"", {3, 0x62}}, - {"", {3, 0x63}}, - {"", {3, 0x64}}, - {"", {3, 0x65}}, - {"", {3, 0x66}}, - {"", {3, 0x67}}, - {"", {3, 0x68}}, - {"", {3, 0x69}}, - {"", {3, 0x6a}}, - {"", {3, 0x6b}}, - {"", {3, 0x6c}}, - {"", {3, 0x6d}}, - {"", {3, 0x6e}}, - {"", {3, 0x6f}}, - {"", {3, 0x70}}, - {"", {3, 0x71}}, - {"", {3, 0x72}}, - {"", {3, 0x73}}, - {"", {3, 0x74}}, - {"", {3, 0x75}}, - {"", {3, 0x76}}, - {"", {3, 0x77}}, - {"", {3, 0x78}}, - {"", {3, 0x79}}, - {"", {3, 0x7a}}, - {"", {3, 0x7b}}, - {"", {3, 0x7c}}, - {"", {3, 0x7d}}, - {"", {3, 0x7e}}, - {"", {3, 0x7f}}, - {"", {3, 0x80}}, - {"", {3, 0x81}}, - {"", {3, 0x82}}, - {"", {3, 0x83}}, - {"", {3, 0x84}}, - {"", {3, 0x85}}, - {"", {3, 0x86}}, - {"", {3, 0x87}}, - {"", {3, 0x88}}, - {"", {3, 0x89}}, - {"", {3, 0x8a}}, - {"", {3, 0x8b}}, - {"", {3, 0x8c}}, - {"", {3, 0x8d}}, - {"", {3, 0x8e}}, - {"", {3, 0x8f}}, - {"", {3, 0x90}}, - {"", {3, 0x91}}, - {"", {3, 0x92}}, - {"", {3, 0x93}}, - {"", {3, 0x94}}, - {"", {3, 0x95}}, - {"", {3, 0x96}}, - {"", {3, 0x97}}, - {"", {3, 0x98}}, - {"", {3, 0x99}}, - {"", {3, 0x9a}}, - {"", {3, 0x9b}}, - {"", {3, 0x9c}}, - {"", {3, 0x9d}}, - {"", {3, 0x9e}}, - {"", {3, 0x9f}}, - {"", {3, 0xa0}}, - {"", {3, 0xa1}}, - {"", {3, 0xa2}}, - {"", {3, 0xa3}}, - {"", {3, 0xa4}}, - {"", {3, 0xa5}}, - {"", {3, 0xa6}}, - {"", {3, 0xa7}}, - {"", {3, 0xa8}}, - {"", {3, 0xa9}}, - {"", {3, 0xaa}}, - {"", {3, 0xab}}, - {"", {3, 0xac}}, - {"", {3, 0xad}}, - {"", {3, 0xae}}, - {"", {3, 0xaf}}, - {"", {3, 0xb0}}, - {"", {3, 0xb1}}, - {"", {3, 0xb2}}, - {"", {3, 0xb3}}, - {"", {3, 0xb4}}, - {"", {3, 0xb5}}, - {"", {3, 0xb6}}, - {"", {3, 0xb7}}, - {"", {3, 0xb8}}, - {"", {3, 0xb9}}, - {"", {3, 0xba}}, - {"", {3, 0xbb}}, - {"", {3, 0xbc}}, - {"", {3, 0xbd}}, - {"", {3, 0xbe}}, - {"", {3, 0xbf}}, - {"", {3, 0xc0}}, - {"", {3, 0xc1}}, - {"", {3, 0xc2}}, - {"", {3, 0xc3}}, - {"", {3, 0xc4}}, - {"", {3, 0xc5}}, - {"", {3, 0xc6}}, - {"", {3, 0xc7}}, - {"", {3, 0xc8}}, - {"", {3, 0xc9}}, - {"", {3, 0xca}}, - {"", {3, 0xcb}}, - {"", {3, 0xcc}}, - {"", {3, 0xcd}}, - {"", {3, 0xce}}, - {"", {3, 0xcf}}, - {"", {3, 0xd0}}, - {"", {3, 0xd1}}, - {"", {3, 0xd2}}, - {"", {3, 0xd3}}, - {"", {3, 0xd4}}, - {"", {3, 0xd5}}, - {"", {3, 0xd6}}, - {"", {3, 0xd7}}, - {"", {3, 0xd8}}, - {"", {3, 0xd9}}, - {"", {3, 0xda}}, - {"", {3, 0xdb}}, - {"", {3, 0xdc}}, - {"", {3, 0xdd}}, - {"", {3, 0xde}}, - {"", {3, 0xdf}}, - {"", {3, 0xe0}}, - {"", {3, 0xe1}}, - {"", {3, 0xe2}}, - {"", {3, 0xe3}}, - {"", {3, 0xe4}}, - {"", {3, 0xe5}}, - {"", {3, 0xe6}}, - {"", {3, 0xe7}}, - {"", {3, 0xe8}}, - {"", {3, 0xe9}}, - {"", {3, 0xea}}, - {"", {3, 0xeb}}, - {"", {3, 0xec}}, - {"", {3, 0xed}}, - {"", {3, 0xee}}, - {"", {3, 0xef}}, - {"", {3, 0xf0}}, - {"", {3, 0xf1}}, - {"", {3, 0xf2}}, - {"", {3, 0xf3}}, - {"", {3, 0xf4}}, - {"", {3, 0xf5}}, - {"", {3, 0xf6}}, - {"", {3, 0xf7}}, - {"", {3, 0xf8}}, - {"", {3, 0xf9}}, - {"", {3, 0xfa}}, - {"", {3, 0xfb}}, - {"", {3, 0xfc}}, - {"", {3, 0xfd}}, - {"", {3, 0xfe}}, - {"", {3, 0xff}}, -}; - -GameTextFontBank g_font_bank_jak2(GameTextVersion::JAK2, - &s_encode_info_jak2, - &s_replace_info_jak2, - &s_passthrus_jak2); - -/*! - * ================================ - * GAME TEXT FONT BANK - JAK 3 - * ================================ - * This font is used in: - * - Jak 3 - */ - -// TODO cyrillic - -GameTextFontBank g_font_bank_jak3(GameTextVersion::JAK3, - &s_encode_info_jak2, - &s_replace_info_jak2, - &s_passthrus_jak2); - -/*! - * ======================== - * GAME TEXT FONT BANK LIST - * ======================== - * The list of available font banks and a couple of helper functions. - */ - -std::map g_font_banks = { - {GameTextVersion::JAK1_V1, &g_font_bank_jak1_v1}, - {GameTextVersion::JAK1_V2, &g_font_bank_jak1_v2}, - {GameTextVersion::JAK2, &g_font_bank_jak2}, - {GameTextVersion::JAK3, &g_font_bank_jak3}}; - -const GameTextFontBank* get_font_bank(GameTextVersion version) { - return g_font_banks.at(version); -} - -const GameTextFontBank* get_font_bank_from_game_version(GameVersion version) { - // Jak 1 has been patched to use V2 - switch (version) { - case GameVersion::Jak1: - return get_font_bank(GameTextVersion::JAK1_V2); - case GameVersion::Jak2: - return get_font_bank(GameTextVersion::JAK2); - case GameVersion::Jak3: - return get_font_bank(GameTextVersion::JAK3); - default: - ASSERT_MSG(false, "Unsupported game for get_font_bank_from_game_version"); - } -} - -const GameTextFontBank* get_font_bank(const std::string& name) { - if (auto it = sTextVerEnumMap.find(name); it == sTextVerEnumMap.end()) { - throw std::runtime_error(fmt::format("unknown text version {}", name)); - } else { - return get_font_bank(it->second); - } -} - -bool font_bank_exists(GameTextVersion version) { - return g_font_banks.find(version) != g_font_banks.cend(); -} diff --git a/common/util/Trie.h b/common/util/Trie.h index 76a6a86a6a..7f55170184 100644 --- a/common/util/Trie.h +++ b/common/util/Trie.h @@ -36,6 +36,9 @@ class Trie { // Get all objects starting with the given prefix. std::vector lookup_prefix(const std::string& str) const; + // Finds the longest prefix match starting at offset `off` in string `in`. + const T* find_longest_prefix(const std::string& in, int off) const; + // Get all nodes in the tree. std::vector get_all_nodes() const; ~Trie(); @@ -143,6 +146,23 @@ class Trie { } } } + + const T* find_longest_prefix(const std::string& in, int off) const { + const Node* node = this; + const T* best = nullptr; + + for (int j = off; j < (int)in.size(); ++j) { + unsigned char c = static_cast(in[j]); + node = node->children[c]; + if (!node) { + break; + } + if (node->value) { + best = node->value; + } + } + return best; + } }; Node m_root; @@ -182,9 +202,14 @@ std::vector Trie::lookup_prefix(const std::string& str) const { return m_root.lookup_prefix(str.c_str()); } +template +const T* Trie::find_longest_prefix(const std::string& in, int off) const { + return m_root.find_longest_prefix(in, off); +} + template std::vector Trie::get_all_nodes() const { std::vector result; m_root.get_all_children(result); return result; -} \ No newline at end of file +} diff --git a/common/util/font/dbs/font_db_jak1.cpp b/common/util/font/dbs/font_db_jak1.cpp new file mode 100644 index 0000000000..a212d51b4c --- /dev/null +++ b/common/util/font/dbs/font_db_jak1.cpp @@ -0,0 +1,596 @@ +#include "font_db_jak1.h" + +std::unordered_set passthrus_jak1 = {'~', ' ', ',', '.', '-', '+', '(', ')', '!', ':', '?', + '=', '%', '*', '/', '#', ';', '<', '>', '@', '[', '_'}; + +std::vector encode_info_jak1 = { + // random + {"ˇ", "\x10"}, // caron + {"`", "\x11"}, // grave accent + {"'", "\x12"}, // apostrophe + {"^", "\x13"}, // circumflex + {"", "\x14"}, // tilde + {"¨", "\x15"}, // umlaut + {"º", "\x16"}, // numero/overring + {"¡", "\x17"}, // inverted exclamation mark + {"¿", "\x18"}, // inverted question mark + + {"海", "\x1a"}, // umi + {"Æ", "\x1b"}, // aesc + {"界", "\x1c"}, // kai + {"Ç", "\x1d"}, // c-cedilla + {"学", "\x1e"}, // gaku + {"ß", "\x1f"}, // eszett + + {"ワ", "\x24"}, // wa + + {"ヲ", "\x26"}, // wo + {"ン", "\x27"}, // -n + + {"岩", "\x5c"}, // iwa + {"旧", "\x5d"}, // kyuu + {"空", "\x5e"}, // sora + //{"掘", "\x5f"}, // horu + + {"ヮ", "\x60"}, // -wa + {"撃", "\x61"}, // utsu + {"賢", "\x62"}, // kashikoi + {"湖", "\x63"}, // mizuumi + {"口", "\x64"}, // kuchi + {"行", "\x65"}, // iku + {"合", "\x66"}, // ai + {"士", "\x67"}, // shi + {"寺", "\x68"}, // tera + {"山", "\x69"}, // yama + {"者", "\x6a"}, // mono + {"所", "\x6b"}, // tokoro + {"書", "\x6c"}, // kaku + {"小", "\x6d"}, // shou + {"沼", "\x6e"}, // numa + {"上", "\x6f"}, // ue + {"城", "\x70"}, // shiro + {"場", "\x71"}, // ba + {"出", "\x72"}, // shutsu + {"闇", "\x73"}, // yami + {"遺", "\x74"}, // nokosu + {"黄", "\x75"}, // ki + {"屋", "\x76"}, // ya + {"下", "\x77"}, // shita + {"家", "\x78"}, // ie + {"火", "\x79"}, // hi + {"花", "\x7a"}, // hana + {"レ", "\x7b"}, // re + {"Œ", "\x7c"}, // oe + {"ロ", "\x7d"}, // ro + + {"青", "\x7f"}, // ao + + {"・", "\x90"}, // nakaguro + {"゛", "\x91"}, // dakuten + {"゜", "\x92"}, // handakuten + {"ー", "\x93"}, // chouompu + {"『", "\x94"}, // nijuukagikakko left + {"』", "\x95"}, // nijuukagikakko right + // hiragana + {"ぁ", "\x96"}, // -a + {"あ", "\x97"}, // a + {"ぃ", "\x98"}, // -i + {"い", "\x99"}, // i + {"ぅ", "\x9a"}, // -u + {"う", "\x9b"}, // u + {"ぇ", "\x9c"}, // -e + {"え", "\x9d"}, // e + {"ぉ", "\x9e"}, // -o + {"お", "\x9f"}, // o + {"か", "\xa0"}, // ka + {"き", "\xa1"}, // ki + {"く", "\xa2"}, // ku + {"け", "\xa3"}, // ke + {"こ", "\xa4"}, // ko + {"さ", "\xa5"}, // sa + {"し", "\xa6"}, // shi + {"す", "\xa7"}, // su + {"せ", "\xa8"}, // se + {"そ", "\xa9"}, // so + {"た", "\xaa"}, // ta + {"ち", "\xab"}, // chi + {"っ", "\xac"}, // sokuon + {"つ", "\xad"}, // tsu + {"て", "\xae"}, // te + {"と", "\xaf"}, // to + {"な", "\xb0"}, // na + {"に", "\xb1"}, // ni + {"ぬ", "\xb2"}, // nu + {"ね", "\xb3"}, // ne + {"の", "\xb4"}, // no + {"は", "\xb5"}, // ha + {"ひ", "\xb6"}, // hi + {"ふ", "\xb7"}, // hu + {"へ", "\xb8"}, // he + {"ほ", "\xb9"}, // ho + {"ま", "\xba"}, // ma + {"み", "\xbb"}, // mi + {"む", "\xbc"}, // mu + {"め", "\xbd"}, // me + {"も", "\xbe"}, // mo + {"ゃ", "\xbf"}, // youon ya + {"や", "\xc0"}, // ya + {"ゅ", "\xc1"}, // youon yu + {"ゆ", "\xc2"}, // yu + {"ょ", "\xc3"}, // youon yo + {"よ", "\xc4"}, // yo + {"ら", "\xc5"}, // ra + {"り", "\xc6"}, // ri + {"る", "\xc7"}, // ru + {"れ", "\xc8"}, // re + {"ろ", "\xc9"}, // ro + {"ゎ", "\xca"}, // -wa + {"わ", "\xcb"}, // wa + {"を", "\xcc"}, // wo + {"ん", "\xcd"}, // -n + // katakana + {"ァ", "\xce"}, // -a + {"ア", "\xcf"}, // a + {"ィ", "\xd0"}, // -i + {"イ", "\xd1"}, // i + {"ゥ", "\xd2"}, // -u + {"ウ", "\xd3"}, // u + {"ェ", "\xd4"}, // -e + {"エ", "\xd5"}, // e + {"ォ", "\xd6"}, // -o + {"オ", "\xd7"}, // o + {"カ", "\xd8"}, // ka + {"キ", "\xd9"}, // ki + {"ク", "\xda"}, // ku + {"ケ", "\xdb"}, // ke + {"コ", "\xdc"}, // ko + {"サ", "\xdd"}, // sa + {"シ", "\xde"}, // shi + {"ス", "\xdf"}, // su + {"セ", "\xe0"}, // se + {"ソ", "\xe1"}, // so + {"タ", "\xe2"}, // ta + {"チ", "\xe3"}, // chi + {"ッ", "\xe4"}, // sokuon + {"ツ", "\xe5"}, // tsu + {"テ", "\xe6"}, // te + {"ト", "\xe7"}, // to + {"ナ", "\xe8"}, // na + {"ニ", "\xe9"}, // ni + {"ヌ", "\xea"}, // nu + {"ネ", "\xeb"}, // ne + {"ノ", "\xec"}, // no + {"ハ", "\xed"}, // ha + {"ヒ", "\xee"}, // hi + {"フ", "\xef"}, // hu + {"ヘ", "\xf0"}, // he + {"ホ", "\xf1"}, // ho + {"マ", "\xf2"}, // ma + {"ミ", "\xf3"}, // mi + {"ム", "\xf4"}, // mu + {"メ", "\xf5"}, // me + {"モ", "\xf6"}, // mo + {"ャ", "\xf7"}, // youon ya + {"ヤ", "\xf8"}, // ya + {"ュ", "\xf9"}, // youon yu + {"ユ", "\xfa"}, // yu + {"ョ", "\xfb"}, // youon yo + {"ヨ", "\xfc"}, // yo + {"ラ", "\xfd"}, // ra + {"リ", "\xfe"}, // ri + {"ル", "\xff"}, // ru + // kanji 2 + {"宝", "\x1\x01"}, // takara + + {"石", "\x1\x10"}, // ishi + {"赤", "\x1\x11"}, // aka + {"跡", "\x1\x12"}, // ato + {"川", "\x1\x13"}, // kawa + {"戦", "\x1\x14"}, // ikusa + {"村", "\x1\x15"}, // mura + {"隊", "\x1\x16"}, // tai + {"台", "\x1\x17"}, // utena + {"長", "\x1\x18"}, // osa + {"鳥", "\x1\x19"}, // tori + {"艇", "\x1\x1a"}, // tei + {"洞", "\x1\x1b"}, // hora + {"道", "\x1\x1c"}, // michi + {"発", "\x1\x1d"}, // hatsu + {"飛", "\x1\x1e"}, // tobu + {"噴", "\x1\x1f"}, // fuku + + {"池", "\x1\xa0"}, // ike + {"中", "\x1\xa1"}, // naka + {"塔", "\x1\xa2"}, // tou + {"島", "\x1\xa3"}, // shima + {"部", "\x1\xa4"}, // bu + {"砲", "\x1\xa5"}, // hou + {"産", "\x1\xa6"}, // san + {"眷", "\x1\xa7"}, // kaerimiru + {"力", "\x1\xa8"}, // chikara + {"緑", "\x1\xa9"}, // midori + {"岸", "\x1\xaa"}, // kishi + {"像", "\x1\xab"}, // zou + {"谷", "\x1\xac"}, // tani + {"心", "\x1\xad"}, // kokoro + {"森", "\x1\xae"}, // mori + {"水", "\x1\xaf"}, // mizu + {"船", "\x1\xb0"}, // fune + {"™", "\x1\xb1"}, // trademark +}; + +std::vector replace_info_jak1 = { + // other + {"A~Y~-21H~-5Vº~Z", "Å"}, + {"N~Y~-6Hº~Z~+10H", "Nº"}, + {"O~Y~-16H~-1V/~Z", "Ø"}, + {"A~Y~-6H~+3V,~Z", "Ą"}, + {"E~Y~-6H~+2V,~Z", "Ę"}, + {"L~Y~-16H~+0V/~Z", "Ł"}, + {"Z~Y~-21H~-5Vº~Z", "Ż"}, + {"E~Y~-20H~-5Vº~Z", "Ė"}, + {"C~Y~-20H~-4Vˇ~Z", "Č"}, + {"S~Y~-22H~-4Vˇ~Z", "Š"}, + {"Z~Y~-22H~-4Vˇ~Z", "Ž"}, + {"U~Y~-13H~+2V,~Z", "Ų"}, + {"U~Y~-18H~-10V-~Z", "Ū"}, + {"D~Y~-25H~-1V-~Z", "Đ"}, + {"I~Y~-8H~+1V,~Z", "Į"}, + // czech specific + {"U~Y~-23H~-5Vº~Z", "Ů"}, + + // tildes + {"N~Y~-22H~-4V~Z", "Ñ"}, + {"A~Y~-21H~-5V~Z", "Ã"}, // custom + {"O~Y~-22H~-4V~Z", "Õ"}, // custom + + // acute accents + {"A~Y~-21H~-5V'~Z", "Á"}, + {"E~Y~-22H~-5V'~Z", "É"}, + {"I~Y~-19H~-5V'~Z", "Í"}, + {"O~Y~-22H~-4V'~Z", "Ó"}, + {"U~Y~-24H~-3V'~Z", "Ú"}, + {"C~Y~-21H~-5V'~Z", "Ć"}, + {"N~Y~-21H~-5V'~Z", "Ń"}, + {"S~Y~-21H~-5V'~Z", "Ś"}, + {"Z~Y~-21H~-5V'~Z", "Ź"}, + // czech specific + {"Y~Y~-25H~-4V'~Z", "Ý"}, + + // double acute accents + {"O~Y~-28H~-4V'~-9H'~Z", "Ő"}, // custom + {"U~Y~-27H~-4V'~-12H'~Z", "Ű"}, // custom + + // circumflex + {"A~Y~-20H~-4V^~Z", "Â"}, // custom + {"E~Y~-20H~-5V^~Z", "Ê"}, + {"I~Y~-19H~-5V^~Z", "Î"}, + {"O~Y~-20H~-4V^~Z", "Ô"}, // custom + {"U~Y~-24H~-3V^~Z", "Û"}, + + // grave accents + {"A~Y~-21H~-5V`~Z", "À"}, + {"E~Y~-22H~-5V`~Z", "È"}, + {"I~Y~-19H~-5V`~Z", "Ì"}, + {"O~Y~-22H~-4V`~Z", "Ò"}, // custom + {"U~Y~-24H~-3V`~Z", "Ù"}, + + // umlaut + {"A~Y~-21H~-5V¨~Z", "Ä"}, + {"E~Y~-20H~-5V¨~Z", "Ë"}, + {"I~Y~-19H~-5V¨~Z", "Ï"}, // custom + {"O~Y~-22H~-4V¨~Z", "Ö"}, + {"O~Y~-22H~-3V¨~Z", "ö"}, // dumb + {"U~Y~-22H~-3V¨~Z", "Ü"}, + + // caron - Ǎ ǎ Ě ě Ǧ ǧ Ǐ ǐ Ǒ ǒ Ǔ ǔ Y̌ y̌ + {"A~Y~-20H~-4Vˇ~Z", "Ǎ"}, + {"E~Y~-20H~-5Vˇ~Z", "Ě"}, + {"G~Y~-20H~-5Vˇ~Z", "Ǧ"}, + {"I~Y~-19H~-5Vˇ~Z", "Ǐ"}, + {"O~Y~-20H~-4Vˇ~Z", "Ǒ"}, + {"U~Y~-24H~-3Vˇ~Z", "Ǔ"}, + {"Y~Y~-24H~-3Vˇ~Z", "Y̌"}, + // czech specific - Č Ň Ř Š Ž Ť + {"C~Y~-25H~-9Vˇ~Z", "Č"}, + {"N~Y~-23H~-5Vˇ~Z", "Ň"}, + {"R~Y~-24H~-5Vˇ~Z", "Ř"}, + {"S~Y~-24H~-5Vˇ~Z", "Š"}, + {"T~Y~-23H~-5Vˇ~Z", "Ť"}, + {"Z~Y~-23H~-5Vˇ~Z", "Ž"}, + + // dakuten katakana + {"~Yウ~Z゛", "ヴ"}, + {"~Yカ~Z゛", "ガ"}, + {"~Yキ~Z゛", "ギ"}, + {"~Yク~Z゛", "グ"}, + {"~Yケ~Z゛", "ゲ"}, + {"~Yコ~Z゛", "ゴ"}, + {"~Yサ~Z゛", "ザ"}, + {"~Yシ~Z゛", "ジ"}, + {"~Yス~Z゛", "ズ"}, + {"~Yセ~Z゛", "ゼ"}, + {"~Yソ~Z゛", "ゾ"}, + {"~Yタ~Z゛", "ダ"}, + {"~Yチ~Z゛", "ヂ"}, + {"~Yツ~Z゛", "ヅ"}, + {"~Yテ~Z゛", "デ"}, + {"~Yト~Z゛", "ド"}, + {"~Yハ~Z゛", "バ"}, + {"~Yヒ~Z゛", "ビ"}, + {"~Yフ~Z゛", "ブ"}, + {"~Yヘ~Z゛", "ベ"}, + {"~Yホ~Z゛", "ボ"}, + // handakuten katakana + {"~Yハ~Z゜", "パ"}, + {"~Yヒ~Z゜", "ピ"}, + {"~Yフ~Z゜", "プ"}, + {"~Yヘ~Z゜", "ペ"}, + {"~Yホ~Z゜", "ポ"}, + // dakuten hiragana + {"~Yか~Z゛", "が"}, + {"~Yき~Z゛", "ぎ"}, + {"~Yく~Z゛", "ぐ"}, + {"~Yけ~Z゛", "げ"}, + {"~Yこ~Z゛", "ご"}, + {"~Yさ~Z゛", "ざ"}, + {"~Yし~Z゛", "じ"}, + {"~Yす~Z゛", "ず"}, + {"~Yせ~Z゛", "ぜ"}, + {"~Yそ~Z゛", "ぞ"}, + {"~Yた~Z゛", "だ"}, + {"~Yち~Z゛", "ぢ"}, + {"~Yつ~Z゛", "づ"}, + {"~Yて~Z゛", "で"}, + {"~Yと~Z゛", "ど"}, + {"~Yは~Z゛", "ば"}, + {"~Yひ~Z゛", "び"}, + {"~Yふ~Z゛", "ぶ"}, + {"~Yへ~Z゛", "べ"}, + {"~Yほ~Z゛", "ぼ"}, + // handakuten hiragana + {"~Yは~Z゜", "ぱ"}, + {"~Yひ~Z゜", "ぴ"}, + {"~Yふ~Z゜", "ぷ"}, + {"~Yへ~Z゜", "ぺ"}, + {"~Yほ~Z゜", "ぽ"}, + // japanese punctuation + {",~+8H", "、"}, + {"~+8H ", " "}, + + // (hack) special case kanji + {"~~", "世"}, + + // playstation buttons + {"~Y~22L<~Z~Y~27L*~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + {"~Y~22L<~Z~Y~26L;~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + {"~Y~22L<~Z~Y~25L@~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + {"~Y~22L<~Z~Y~24L#~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, // custom +}; + +std::vector encode_info_jak1_v2 = { + // random + {"_", "\x03"}, // large space + {"ˇ", "\x10"}, // caron + {"`", "\x11"}, // grave accent + {"'", "\x12"}, // apostrophe + {"^", "\x13"}, // circumflex + {"", "\x14"}, // tilde + {"¨", "\x15"}, // umlaut + {"º", "\x16"}, // numero/overring + {"¡", "\x17"}, // inverted exclamation mark + {"¿", "\x18"}, // inverted question mark + + {"海", "\x1a"}, // umi + {"Æ", "\x1b"}, // aesc + {"界", "\x1c"}, // kai + {"Ç", "\x1d"}, // c-cedilla + {"学", "\x1e"}, // gaku + {"ß", "\x1f"}, // eszett + + {"ワ", "\x24"}, // wa + + {"ヲ", "\x26"}, // wo + {"ン", "\x27"}, // -n + + {"岩", "\x5c"}, // iwa + {"旧", "\x5d"}, // kyuu + {"空", "\x5e"}, // sora + {"掘", "\x5f"}, // horu + + {"ヮ", "\x60"}, // -wa + {"撃", "\x61"}, // utsu + {"賢", "\x62"}, // kashikoi + {"湖", "\x63"}, // mizuumi + {"口", "\x64"}, // kuchi + {"行", "\x65"}, // iku + {"合", "\x66"}, // ai + {"士", "\x67"}, // shi + {"寺", "\x68"}, // tera + {"山", "\x69"}, // yama + {"者", "\x6a"}, // mono + {"所", "\x6b"}, // tokoro + {"書", "\x6c"}, // kaku + {"小", "\x6d"}, // shou + {"沼", "\x6e"}, // numa + {"上", "\x6f"}, // ue + {"城", "\x70"}, // shiro + {"場", "\x71"}, // ba + {"出", "\x72"}, // shutsu + {"闇", "\x73"}, // yami + {"遺", "\x74"}, // nokosu + {"黄", "\x75"}, // ki + {"屋", "\x76"}, // ya + {"下", "\x77"}, // shita + {"家", "\x78"}, // ie + {"火", "\x79"}, // hi + {"花", "\x7a"}, // hana + {"レ", "\x7b"}, // re + {"Œ", "\x7c"}, // oe + {"ロ", "\x7d"}, // ro + + {"青", "\x7f"}, // ao + + {"・", "\x90"}, // nakaguro + {"゛", "\x91"}, // dakuten + {"゜", "\x92"}, // handakuten + {"ー", "\x93"}, // chouompu + {"『", "\x94"}, // nijuukagikakko left + {"』", "\x95"}, // nijuukagikakko right + // hiragana + {"ぁ", "\x96"}, // -a + {"あ", "\x97"}, // a + {"ぃ", "\x98"}, // -i + {"い", "\x99"}, // i + {"ぅ", "\x9a"}, // -u + {"う", "\x9b"}, // u + {"ぇ", "\x9c"}, // -e + {"え", "\x9d"}, // e + {"ぉ", "\x9e"}, // -o + {"お", "\x9f"}, // o + {"か", "\xa0"}, // ka + {"き", "\xa1"}, // ki + {"く", "\xa2"}, // ku + {"け", "\xa3"}, // ke + {"こ", "\xa4"}, // ko + {"さ", "\xa5"}, // sa + {"し", "\xa6"}, // shi + {"す", "\xa7"}, // su + {"せ", "\xa8"}, // se + {"そ", "\xa9"}, // so + {"た", "\xaa"}, // ta + {"ち", "\xab"}, // chi + {"っ", "\xac"}, // sokuon + {"つ", "\xad"}, // tsu + {"て", "\xae"}, // te + {"と", "\xaf"}, // to + {"な", "\xb0"}, // na + {"に", "\xb1"}, // ni + {"ぬ", "\xb2"}, // nu + {"ね", "\xb3"}, // ne + {"の", "\xb4"}, // no + {"は", "\xb5"}, // ha + {"ひ", "\xb6"}, // hi + {"ふ", "\xb7"}, // hu + {"へ", "\xb8"}, // he + {"ほ", "\xb9"}, // ho + {"ま", "\xba"}, // ma + {"み", "\xbb"}, // mi + {"む", "\xbc"}, // mu + {"め", "\xbd"}, // me + {"も", "\xbe"}, // mo + {"ゃ", "\xbf"}, // youon ya + {"や", "\xc0"}, // ya + {"ゅ", "\xc1"}, // youon yu + {"ゆ", "\xc2"}, // yu + {"ょ", "\xc3"}, // youon yo + {"よ", "\xc4"}, // yo + {"ら", "\xc5"}, // ra + {"り", "\xc6"}, // ri + {"る", "\xc7"}, // ru + {"れ", "\xc8"}, // re + {"ろ", "\xc9"}, // ro + {"ゎ", "\xca"}, // -wa + {"わ", "\xcb"}, // wa + {"を", "\xcc"}, // wo + {"ん", "\xcd"}, // -n + // katakana + {"ァ", "\xce"}, // -a + {"ア", "\xcf"}, // a + {"ィ", "\xd0"}, // -i + {"イ", "\xd1"}, // i + {"ゥ", "\xd2"}, // -u + {"ウ", "\xd3"}, // u + {"ェ", "\xd4"}, // -e + {"エ", "\xd5"}, // e + {"ォ", "\xd6"}, // -o + {"オ", "\xd7"}, // o + {"カ", "\xd8"}, // ka + {"キ", "\xd9"}, // ki + {"ク", "\xda"}, // ku + {"ケ", "\xdb"}, // ke + {"コ", "\xdc"}, // ko + {"サ", "\xdd"}, // sa + {"シ", "\xde"}, // shi + {"ス", "\xdf"}, // su + {"セ", "\xe0"}, // se + {"ソ", "\xe1"}, // so + {"タ", "\xe2"}, // ta + {"チ", "\xe3"}, // chi + {"ッ", "\xe4"}, // sokuon + {"ツ", "\xe5"}, // tsu + {"テ", "\xe6"}, // te + {"ト", "\xe7"}, // to + {"ナ", "\xe8"}, // na + {"ニ", "\xe9"}, // ni + {"ヌ", "\xea"}, // nu + {"ネ", "\xeb"}, // ne + {"ノ", "\xec"}, // no + {"ハ", "\xed"}, // ha + {"ヒ", "\xee"}, // hi + {"フ", "\xef"}, // hu + {"ヘ", "\xf0"}, // he + {"ホ", "\xf1"}, // ho + {"マ", "\xf2"}, // ma + {"ミ", "\xf3"}, // mi + {"ム", "\xf4"}, // mu + {"メ", "\xf5"}, // me + {"モ", "\xf6"}, // mo + {"ャ", "\xf7"}, // youon ya + {"ヤ", "\xf8"}, // ya + {"ュ", "\xf9"}, // youon yu + {"ユ", "\xfa"}, // yu + {"ョ", "\xfb"}, // youon yo + {"ヨ", "\xfc"}, // yo + {"ラ", "\xfd"}, // ra + {"リ", "\xfe"}, // ri + {"ル", "\xff"}, // ru + // kanji 2 + {"宝", "\x1\x01"}, // takara + + {"石", "\x1\x10"}, // ishi + {"赤", "\x1\x11"}, // aka + {"跡", "\x1\x12"}, // ato + {"川", "\x1\x13"}, // kawa + {"戦", "\x1\x14"}, // ikusa + {"村", "\x1\x15"}, // mura + {"隊", "\x1\x16"}, // tai + {"台", "\x1\x17"}, // utena + {"長", "\x1\x18"}, // osa + {"鳥", "\x1\x19"}, // tori + {"艇", "\x1\x1a"}, // tei + {"洞", "\x1\x1b"}, // hora + {"道", "\x1\x1c"}, // michi + {"発", "\x1\x1d"}, // hatsu + {"飛", "\x1\x1e"}, // tobu + {"噴", "\x1\x1f"}, // fuku + + {"池", "\x1\xa0"}, // ike + {"中", "\x1\xa1"}, // naka + {"塔", "\x1\xa2"}, // tou + {"島", "\x1\xa3"}, // shima + {"部", "\x1\xa4"}, // bu + {"砲", "\x1\xa5"}, // hou + {"産", "\x1\xa6"}, // san + {"眷", "\x1\xa7"}, // kaerimiru + {"力", "\x1\xa8"}, // chikara + {"緑", "\x1\xa9"}, // midori + {"岸", "\x1\xaa"}, // kishi + {"像", "\x1\xab"}, // zou + {"谷", "\x1\xac"}, // tani + {"心", "\x1\xad"}, // kokoro + {"森", "\x1\xae"}, // mori + {"水", "\x1\xaf"}, // mizu + {"船", "\x1\xb0"}, // fune + {"™", "\x1\xb1"}, // trademark +}; + +GameTextFontBank g_font_bank_jak1_v1(GameTextVersion::JAK1_V1, + &encode_info_jak1, + &replace_info_jak1, + &passthrus_jak1); + +GameTextFontBank g_font_bank_jak1_v2(GameTextVersion::JAK1_V2, + &encode_info_jak1_v2, + &replace_info_jak1, + &passthrus_jak1); diff --git a/common/util/font/dbs/font_db_jak1.h b/common/util/font/dbs/font_db_jak1.h new file mode 100644 index 0000000000..e28b83b696 --- /dev/null +++ b/common/util/font/dbs/font_db_jak1.h @@ -0,0 +1,25 @@ +#pragma once + +#include "common/util/font/font_utils.h" + +/*! + * =========================== + * GAME TEXT FONT BANK - JAK 1 + * =========================== + * This font is used in: + * - Jak & Daxter: The Precursor Legacy (Black Label) + */ + +extern GameTextFontBank g_font_bank_jak1_v1; +/*! + * ================================ + * GAME TEXT FONT BANK - JAK 1 (v2) + * ================================ + * This font is used in: + * - Jak & Daxter: The Precursor Legacy (PAL) + * - ジャックXダクスター ~ 旧世界の遺産 + * - Jak & Daxter: The Precursor Legacy (NTSC-U v2) + * + * It is the same as v1, but _ has been fixed and no longer overlaps 掘 + */ +extern GameTextFontBank g_font_bank_jak1_v2; diff --git a/common/util/font/dbs/font_db_jak2.cpp b/common/util/font/dbs/font_db_jak2.cpp new file mode 100644 index 0000000000..a25b90464d --- /dev/null +++ b/common/util/font/dbs/font_db_jak2.cpp @@ -0,0 +1,866 @@ +#include "font_db_jak2.h" + +std::unordered_set passthrus_jak2 = {'~', ' ', ',', '.', '-', '+', '(', ')', + '!', ':', '?', '=', '%', '*', '/', '#', + ';', '<', '>', '@', '[', '_', ']'}; + +std::vector replace_info_jak2 = { + // other + {"A~Y~-21H~-5Vº~Z", "Å"}, + {"N~Y~-6Hº~Z~+10H", "Nº"}, + {"~+4Vç~-4V", ",c"}, + + // added for translations TODO - check these for jak 2 + {"O~Y~-25H~-1V/~Z", "Ø"}, + {"o~Y~-23H~+4V/~Z", "ø"}, + {"A~Y~-13H~+8V,~Z", "Ą"}, + {"a~Y~-8H~+6V,~Z", "ą"}, + {"E~Y~-6H~+8V,~Z", "Ę"}, + {"e~Y~-10H~+7V,~Z", "ę"}, + {"L~Y~-21H~+0V/~Z", "Ł"}, + {"l~Y~-16H~+0V/~Z", "ł"}, // TODO - this one is ugly, font character addition (small slash) + {"Z~Y~-25H~-11Vº~Z", "Ż"}, + {"z~Y~-23H~-5Vº~Z", "ż"}, + {"a~Y~-25H~-5Vº~Z", "å"}, + {"S~Y~-21H~-5V'~Z", "Ś"}, + {"s~Y~-25H~-5V'~Z", "ś"}, + {"n~Y~-25H~-5V'~Z", "ń"}, + {"c~Y~-25H~-5V'~Z", "ć"}, + {"o~Y~-24H~-4V~Z", "õ"}, + {"a~Y~-24H~-4V~Z", "ã"}, + {"O~Y~-28H~-4V'~-9H'~Z", "Ő"}, + {"U~Y~-27H~-4V'~-12H'~Z", "Ű"}, + {"o~Y~-28H~-4V'~-9H'~Z", "ő"}, + {"u~Y~-28H~-4V'~-9H'~Z", "ű"}, + {"E~Y~-22H~-11Vº~Z", "Ė"}, + {"e~Y~-25H~-5Vº~Z", "ė"}, + {"C~Y~-27H~-10Vˇ~Z", "Č"}, + {"c~Y~-25H~-5Vˇ~Z", "č"}, + {"S~Y~-24H~-10Vˇ~Z", "Š"}, + {"s~Y~-22H~-4Vˇ~Z", "š"}, + {"Z~Y~-25H~-10Vˇ~Z", "Ž"}, + {"z~Y~-23H~-4Vˇ~Z", "ž"}, + {"U~Y~-15H~+5V,~Z", "Ų"}, + {"u~Y~-15H~+5V,~Z", "ų"}, + {"U~Y~-20H~-18V-~Z", "Ū"}, + {"u~Y~-18H~-15V-~Z", "ū"}, + {"D~Y~-28H~-1V-~Z", "Đ"}, + {"d~Y~-13H~-10V-~Z", "đ"}, + {"I~Y~-8H~+4V,~Z", "Į"}, + {"i~Y~-8H~+4V,~Z", "į"}, + // czech specific + {"U~Y~-24H~-7Vº~Z", "Ů"}, + {"u~Y~-23H~-5Vº~Z", "ů"}, + {"t~Y~-7H~-21V,~Z", "ť"}, + + // tildes + {"N~Y~-22H~-4V~Z", "Ñ"}, + {"n~Y~-24H~-4V~Z", "ñ"}, + {"A~Y~-21H~-5V~Z", "Ã"}, + {"O~Y~-22H~-4V~Z", "Õ"}, + + // acute accents + {"A~Y~-21H~-5V'~Z", "Á"}, + {"A~Y~-26H~-8V'~Z", "<Á_V2>"}, // unfortunate... + {"a~Y~-25H~-5V'~Z", "á"}, + {"E~Y~-23H~-9V'~Z", "É"}, + {"e~Y~-26H~-5V'~Z", "é"}, + {"I~Y~-19H~-5V'~Z", "Í"}, + {"i~Y~-19H~-8V'~Z", "í"}, + {"O~Y~-22H~-4V'~Z", "Ó"}, + {"o~Y~-26H~-4V'~Z", "ó"}, + {"U~Y~-24H~-3V'~Z", "Ú"}, + {"u~Y~-24H~-3V'~Z", "ú"}, + {"Z~Y~-24H~-3V'~Z", "Ź"}, + {"z~Y~-24H~-3V'~Z", "ź"}, + // czech specific + {"Y~Y~-26H~-5V'~Z", "Ý"}, + {"~+7Vy~-7V~Y~-24H~-3V'~Z", "ý"}, + + // circumflex + {"A~Y~-20H~-4V^~Z", "Â"}, + {"a~Y~-24H~-5V^~Z", "â"}, + {"E~Y~-20H~-5V^~Z", "Ê"}, + {"e~Y~-25H~-4V^~Z", "ê"}, + {"I~Y~-19H~-5V^~Z", "Î"}, + {"i~Y~-19H~-8V^~Z", "î"}, + {"O~Y~-20H~-4V^~Z", "Ô"}, + {"o~Y~-25H~-4V^~Z", "ô"}, + {"U~Y~-24H~-3V^~Z", "Û"}, + {"u~Y~-23H~-3V^~Z", "û"}, + + // grave accents + {"A~Y~-26H~-8V`~Z", "À"}, + {"a~Y~-25H~-5V`~Z", "à"}, + {"E~Y~-23H~-9V`~Z", "È"}, + {"e~Y~-26H~-5V`~Z", "è"}, + {"I~Y~-19H~-5V`~Z", "Ì"}, + {"i~Y~-19H~-8V`~Z", "ì"}, + {"O~Y~-22H~-4V`~Z", "Ò"}, + {"o~Y~-26H~-4V`~Z", "ò"}, + {"U~Y~-24H~-3V`~Z", "Ù"}, + {"u~Y~-24H~-3V`~Z", "ù"}, + + // umlaut + {"A~Y~-26H~-8V¨~Z", "Ä"}, + {"a~Y~-25H~-5V¨~Z", "ä"}, + {"E~Y~-20H~-5V¨~Z", "Ë"}, + {"e~Y~-25H~-5V¨~Z", "ë"}, + {"I~Y~-19H~-5V¨~Z", "Ï"}, + {"i~Y~-26H~-4V¨~Z", "ï"}, + {"O~Y~-26H~-8V¨~Z", "Ö"}, + {"o~Y~-26H~-4V¨~Z", "ö"}, + {"U~Y~-25H~-8V¨~Z", "Ü"}, + {"u~Y~-24H~-3V¨~Z", "ü"}, + + // caron - Ǎ ǎ Ě ě Ǧ ǧ Ǐ ǐ Ǒ ǒ Ǔ ǔ Y̌ y̌ + {"A~Y~-25H~-9Vˇ~Z", "Ǎ"}, + {"a~Y~-24H~-5Vˇ~Z", "ǎ"}, + {"E~Y~-22H~-8Vˇ~Z", "Ě"}, + {"e~Y~-25H~-4Vˇ~Z", "ě"}, + {"G~Y~-24H~-8Vˇ~Z", "Ǧ"}, + {"~+7Vg~-7V~Y~-25H~-4Vˇ~Z", "ǧ"}, + {"I~Y~-19H~-8Vˇ~Z", "Ǐ"}, + {"i~Y~-19H~-8Vˇ~Z", "ǐ"}, + {"O~Y~-25H~-7Vˇ~Z", "Ǒ"}, + {"o~Y~-25H~-4Vˇ~Z", "ǒ"}, + {"U~Y~-25H~-6Vˇ~Z", "Ǔ"}, + {"u~Y~-24H~-3Vˇ~Z", "ǔ"}, + {"Y~Y~-25H~-5Vˇ~Z", "Y̌"}, + {"~+7Vy~-7V~Y~-25H~-3Vˇ~Z", "y̌"}, + // czech specific - Č č Ň ň Ř ř Š š Ž ž Ť + {"C~Y~-25H~-9Vˇ~Z", "Č"}, + {"c~Y~-24H~-5Vˇ~Z", "č"}, + {"N~Y~-25H~-9Vˇ~Z", "Ň"}, + {"n~Y~-24H~-5Vˇ~Z", "ň"}, + {"R~Y~-25H~-9Vˇ~Z", "Ř"}, + {"r~Y~-22H~-5Vˇ~Z", "ř"}, + {"S~Y~-25H~-9Vˇ~Z", "Š"}, + {"s~Y~-22H~-5Vˇ~Z", "š"}, + {"T~Y~-24H~-7Vˇ~Z", "Ť"}, + {"Z~Y~-25H~-9Vˇ~Z", "Ž"}, + {"z~Y~-24H~-5Vˇ~Z", "ž"}, + + // dakuten katakana + {"~Yウ~Z゛", "ヴ"}, + {"~Yカ~Z゛", "ガ"}, + {"~Yキ~Z゛", "ギ"}, + {"~Yク~Z゛", "グ"}, + {"~Yケ~Z゛", "ゲ"}, + {"~Yコ~Z゛", "ゴ"}, + {"~Yサ~Z゛", "ザ"}, + {"~Yシ~Z゛", "ジ"}, + {"~Yス~Z゛", "ズ"}, + {"~Yセ~Z゛", "ゼ"}, + {"~Yソ~Z゛", "ゾ"}, + {"~Yタ~Z゛", "ダ"}, + {"~Yチ~Z゛", "ヂ"}, + {"~Yツ~Z゛", "ヅ"}, + {"~Yテ~Z゛", "デ"}, + {"~Yト~Z゛", "ド"}, + {"~Yハ~Z゛", "バ"}, + {"~Yヒ~Z゛", "ビ"}, + {"~Yフ~Z゛", "ブ"}, + {"~Yヘ~Z゛", "ベ"}, + {"~Yホ~Z゛", "ボ"}, + // handakuten katakana + {"~Yハ~Z゜", "パ"}, + {"~Yヒ~Z゜", "ピ"}, + {"~Yフ~Z゜", "プ"}, + {"~Yヘ~Z゜", "ペ"}, + {"~Yホ~Z゜", "ポ"}, + // dakuten hiragana + {"~Yか~Z゛", "が"}, + {"~Yき~Z゛", "ぎ"}, + {"~Yく~Z゛", "ぐ"}, + {"~Yけ~Z゛", "げ"}, + {"~Yこ~Z゛", "ご"}, + {"~Yさ~Z゛", "ざ"}, + {"~Yし~Z゛", "じ"}, + {"~Yす~Z゛", "ず"}, + {"~Yせ~Z゛", "ぜ"}, + {"~Yそ~Z゛", "ぞ"}, + {"~Yた~Z゛", "だ"}, + {"~Yち~Z゛", "ぢ"}, + {"~Yつ~Z゛", "づ"}, + {"~Yて~Z゛", "で"}, + {"~Yと~Z゛", "ど"}, + {"~Yは~Z゛", "ば"}, + {"~Yひ~Z゛", "び"}, + {"~Yふ~Z゛", "ぶ"}, + {"~Yへ~Z゛", "べ"}, + {"~Yほ~Z゛", "ぼ"}, + // handakuten hiragana + {"~Yは~Z゜", "ぱ"}, + {"~Yひ~Z゜", "ぴ"}, + {"~Yふ~Z゜", "ぷ"}, + {"~Yへ~Z゜", "ぺ"}, + {"~Yほ~Z゜", "ぽ"}, + // japanese punctuation + {",~+8H", "、"}, + {"~+8H ", " "}, + + // playstation buttons + // - face + {"~Y~22L<~Z~Y~27L*~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + {"~Y~22L<~Z~Y~26L;~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + {"~Y~22L<~Z~Y~25L@~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + {"~Y~22L<~Z~Y~24L#~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + // - dpad + {"~Y~22L~Z~3L~+17H~-13V~Z~22L~+17H~+14V~Z~" + "22L~+32H~Z~+56H", + ""}, + {"~Y~22L~Z~3L~+17H~-13V~Z~3L~+17H~+14V~Z~" + "22L~+32H~Z~+56H", + ""}, + {"~Y~22L~Z~22L~+17H~-13V~Z~22L~+17H~+14V~Z~" + "22L~+32H~Z~+56H", + ""}, + // - shoulder + {"~Y~22L~-2H~-12V~Z~22L~-2H~+17V~Z~1L~+4H~+3V~Z~+" + "38H", + ""}, + {"~Y~22L~-2H~-12V~Z~22L~-2H~+17V~Z~1L~+6H~+3V~Z~+" + "38H", + ""}, + {"~Y~22L~-2H~-6V~Z~22L~-2H~+16V~Z~1L~+5H~-2V~Z~+" + "38H", + ""}, + {"~Y~22L~-2H~-6V~Z~22L~-2H~+16V~Z~1L~+5H~-2V~Z~+" + "38H", + ""}, + // - analog + {"~1L~+8H~Y~Z~6L~-16H~Z~+16h~6L~Z~" + "6L~-15V~Z~+13V~6L~Z~-10H~+9V~6L~Z~+10H~+9V~6L~Z~-10H~-11V~6L~Z~+10H~" + "-11V~6L~Z~+32H", + ""}, + {"~Y~1L~+8H~Z~6L~-8H~Z~+24H~6L~Z~+" + "40H", + ""}, + {"~Y~1L~Z~6L~-15V~Z~+13V~6L~Z~+26H", + ""}, + + // icons + {"~Y~6L<~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + {"~Y~3L<~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + + // flags + {"~Y~6L~Z~+15H~1L~Z~+30H~3L~Z~+45H", + ""}, + {"~Y~5L~Z~3L~]~-1H~Y~5L~Z~3L~Z~+26H", + ""}, + {"~Y~39L~~~Z~3L~Z~5L~]~-1H~Y~39L~~~" + "Z~3L~Z~5L~Z~+26H", + ""}, + {"~Y~7L~Z~+15H~1L~Z~+30H~3L~Z~+47H", + ""}, + {"~Y~1L~Z~3L~Z~7L~]~-1H~Y~1L<" + "FLAG_PART_FILL>~Z~3L~Z~7L~Z~+26H", + ""}, + {"~Y~1L~Z~3L~Z~7L~]~-1H~Y~1L<" + "FLAG_PART_FILL>~Z~3L~Z~+26H", + ""}, + {"~Y~1L~Z~39L~]~-1H~Y~1L~Z~39L<" + "FLAG_PART_KOREA_TRIGRAMS_RIGHT>~Z~-11H~7L~Z~-11H~3L~Z~+26H", + ""}, + {"~Y~1L~]~-1H~Y~1L~Z~-11H~3L~Z~+26H", + ""}, + {"~Y~1L~Z~7L~Z~7L~]" + "~-1H~Y~1L~Z~7L~Z~+26H", + ""}, + {"~Y~7L~Z~5L~Z~5L~]" + "~-1H~Y~7L~Z~5L~Z~+26H", + ""}, + {"~Y~3L~Z~1L~Z~1L~]" + "~-1H~Y~3L~Z~1L~Z~+26H", + ""}, + {"~Y~1L~Z~3L~]~-1H~Y~1L~Z~3L~Z~-19H~1L~Z~-23H~7L~Z~-23H~7L~Z~7L~Z~" + "+26H", + ""}, + {"~Y~1L~Z~7L~]~-1H~Y~1L~Z~7L~Z~-19H~1L~Z~-23H~3L~Z~-23H~3L~Z~3L~Z~" + "+26H", + ""}, + + // korean jamo -- only relevant for the language selection since + // non-korean languages don't run through the `convert-korean-text` function and hence the + // encoding is "normal" + {"~Y~Z\\c03.~Z\\c03\\c1a~Z\\c03\\cc8~Y~Z\\c03œ~Z\\c03k~Z\\c03\\cde~Y~Z\\c03\\c0f~Z\\c03ç", + "", + "~Y~Z\x03.~Z\x03\x1a~Z\x03\xc8~Y~Z\x03œ~Z\x03k~Z\x03\xde~Y~Z\x03\x0f~Z\x03ç"}, + + // weird stuff + // - descenders + {"~+7Vp~-7V", "p"}, + {"~+7Vy~-7V", "y"}, + {"~+7Vg~-7V", "g"}, + {"~+7Vq~-7V", "q"}, + {"~+1Vj~-1V", "j"}, + + {"\\\\", + "~%"}, // this is 2 slashes, duplicated because we use an escape sequence when decompiling + + // - symbols and ligatures + {"~-4H~-3V~+3V~-4H", + ""}, // used for the 4<__> place in spanish. the 5th uses the same + // character but looks different...? + {"~Y~-6Hº~Z~+10H", "°"}, + + // Color / Emphasis + {"~[~0L", ""}, + {"~[~1L", ""}, + {"~[~2L", ""}, + {"~[~3L", ""}, + {"~[~4L", ""}, + {"~[~5L", ""}, + {"~[~6L", ""}, + {"~[~7L", ""}, + {"~[~8L", ""}, + {"~[~9L", ""}, + {"~[~10L", ""}, + {"~[~11L", ""}, + {"~[~12L", ""}, + {"~[~13L", ""}, + {"~[~14L", ""}, + {"~[~15L", ""}, + {"~[~16L", ""}, + {"~[~17L", ""}, + {"~[~18L", ""}, + {"~[~19L", ""}, + {"~[~20L", ""}, + {"~[~21L", ""}, + {"~[~22L", ""}, + {"~[~23L", ""}, + {"~[~24L", ""}, + {"~[~25L", ""}, + {"~[~26L", ""}, + {"~[~27L", ""}, + {"~[~28L", ""}, + {"~[~29L", ""}, + {"~[~30L", ""}, + {"~[~31L", ""}, + {"~[~32L", ""}, + {"~[~33L", ""}, + {"~[~34L", ""}, + {"~[~35L", ""}, + {"~[~36L", ""}, + {"~[~37L", ""}, + {"~[~38L", ""}, + {"~[~39L", ""}}; + +std::vector encode_info_jak2 = { + {"ˇ", "\x10"}, // caron + {"`", "\x11"}, // grave accent + {"'", "\x12"}, // apostrophe + {"^", "\x13"}, // circumflex + {"", "\x14"}, // tilde + {"¨", "\x15"}, // umlaut + {"º", "\x16"}, // numero/overring + {"¡", "\x17"}, // inverted exclamation mark + {"¿", "\x18"}, // inverted question mark + {"", "\x19"}, + {"ç", "\x1d"}, // c-cedilla + {"Ç", "\x1e"}, // c-cedilla + {"ß", "\x1f"}, // eszett + + {"œ", "\x5e"}, // ligature o+e + + {"", "\x7f"}, + {"", "\x80"}, + {"", "\x81"}, + {"", "\x82"}, + {"", "\x83"}, + {"", "\x84"}, + {"", "\x85"}, + {"", "\x86"}, + {"", "\x87"}, + {"", "\x88"}, + {"", "\x89"}, + {"", "\x8a"}, + {"", "\x8b"}, + {"", "\x8c"}, + {"", "\x8d"}, + {"", "\x8e"}, + {"", "\x8f"}, + {"", "\x90"}, + {"", "\x91"}, + {"", "\x92"}, + {"", "\x93"}, + {"", "\x94"}, + {"", "\x95"}, + {"", "\x96"}, + {"", "\x97"}, + {"", "\x98"}, + {"", "\x99"}, + {"", "\x9a"}, + {"", "\x9b"}, + {"", "\x9c"}, + {"", "\x9d"}, + {"", "\x9e"}, + {"", "\x9f"}, + {"", "\xa0"}, + {"", "\xa1"}, + {"", "\xa2"}, + {"", "\xa3"}, + {"", "\xa4"}, + {"", "\xa5"}, + {"", "\xa6"}, + {"", "\xa7"}, + {"", "\xa8"}, + {"", "\xa9"}, + {"", "\xaa"}, + {"", "\xab"}, + {"", "\xac"}, + + {"", "\xb0"}, + {"", "\xb1"}, + {"", "\xb2"}, + {"", "\xb3"}, + // {"入", "\x1\x00"}}, + // {"年", "\x1\x01"}}, + // punctuation + {"・", "\x1\x10"}, + {"゛", "\x1\x11"}, + {"゜", "\x1\x12"}, + {"ー", "\x1\x13"}, + {"『", "\x1\x14"}, + {"』", "\x1\x15"}, + // hiragana + {"ぁ", "\x1\x16"}, // -a + {"あ", "\x1\x17"}, // a + {"ぃ", "\x1\x18"}, // -i + {"い", "\x1\x19"}, // i + {"ぅ", "\x1\x1a"}, // -u + {"う", "\x1\x1b"}, // u + {"ぇ", "\x1\x1c"}, // -e + {"え", "\x1\x1d"}, // e + {"ぉ", "\x1\x1e"}, // -o + {"お", "\x1\x1f"}, // o + {"か", "\x1\x20"}, // ka + {"き", "\x1\x21"}, // ki + {"く", "\x1\x22"}, // ku + {"け", "\x1\x23"}, // ke + {"こ", "\x1\x24"}, // ko + {"さ", "\x1\x25"}, // sa + {"し", "\x1\x26"}, // shi + {"す", "\x1\x27"}, // su + {"せ", "\x1\x28"}, // se + {"そ", "\x1\x29"}, // so + {"た", "\x1\x2a"}, // ta + {"ち", "\x1\x2b"}, // chi + {"っ", "\x1\x2c"}, // sokuon + {"つ", "\x1\x2d"}, // tsu + {"て", "\x1\x2e"}, // te + {"と", "\x1\x2f"}, // to + {"な", "\x1\x30"}, // na + {"に", "\x1\x31"}, // ni + {"ぬ", "\x1\x32"}, // nu + {"ね", "\x1\x33"}, // ne + {"の", "\x1\x34"}, // no + {"は", "\x1\x35"}, // ha + {"ひ", "\x1\x36"}, // hi + {"ふ", "\x1\x37"}, // fu + {"へ", "\x1\x38"}, // he + {"ほ", "\x1\x39"}, // ho + {"ま", "\x1\x3a"}, // ma + {"み", "\x1\x3b"}, // mi + {"む", "\x1\x3c"}, // mu + {"め", "\x1\x3d"}, // me + {"も", "\x1\x3e"}, // mo + {"ゃ", "\x1\x3f"}, // youon ya + {"や", "\x1\x40"}, // ya + {"ゅ", "\x1\x41"}, // youon yu + {"ゆ", "\x1\x42"}, // yu + {"ょ", "\x1\x43"}, // youon yo + {"よ", "\x1\x44"}, // yo + {"ら", "\x1\x45"}, // ra + {"り", "\x1\x46"}, // ri + {"る", "\x1\x47"}, // ru + {"れ", "\x1\x48"}, // re + {"ろ", "\x1\x49"}, // ro + {"ゎ", "\x1\x4a"}, // -wa + {"わ", "\x1\x4b"}, // wa + {"を", "\x1\x4c"}, // wo + {"ん", "\x1\x4d"}, // -n + // katakana + {"ァ", "\x1\x4e"}, // -a + {"ア", "\x1\x4f"}, // a + {"ィ", "\x1\x50"}, // -i + {"イ", "\x1\x51"}, // i + {"ゥ", "\x1\x52"}, // -u + {"ウ", "\x1\x53"}, // u + {"ェ", "\x1\x54"}, // -e + {"エ", "\x1\x55"}, // e + {"ォ", "\x1\x56"}, // -o + {"オ", "\x1\x57"}, // o + {"カ", "\x1\x58"}, // ka + {"キ", "\x1\x59"}, // ki + {"ク", "\x1\x5a"}, // ku + {"ケ", "\x1\x5b"}, // ke + {"コ", "\x1\x5c"}, // ko + {"サ", "\x1\x5d"}, // sa + {"シ", "\x1\x5e"}, // shi + {"ス", "\x1\x5f"}, // su + {"セ", "\x1\x60"}, // se + {"ソ", "\x1\x61"}, // so + {"タ", "\x1\x62"}, // ta + {"チ", "\x1\x63"}, // chi + {"ッ", "\x1\x64"}, // sokuon + {"ツ", "\x1\x65"}, // tsu + {"テ", "\x1\x66"}, // te + {"ト", "\x1\x67"}, // to + {"ナ", "\x1\x68"}, // na + {"ニ", "\x1\x69"}, // ni + {"ヌ", "\x1\x6a"}, // nu + {"ネ", "\x1\x6b"}, // ne + {"ノ", "\x1\x6c"}, // no + {"ハ", "\x1\x6d"}, // ha + {"ヒ", "\x1\x6e"}, // hi + {"フ", "\x1\x6f"}, // fu + {"ヘ", "\x1\x70"}, // he + {"ホ", "\x1\x71"}, // ho + {"マ", "\x1\x72"}, // ma + {"ミ", "\x1\x73"}, // mi + {"ム", "\x1\x74"}, // mu + {"メ", "\x1\x75"}, // me + {"モ", "\x1\x76"}, // mo + {"ャ", "\x1\x77"}, // youon ya + {"ヤ", "\x1\x78"}, // ya + {"ュ", "\x1\x79"}, // youon yu + {"ユ", "\x1\x7a"}, // yu + {"ョ", "\x1\x7b"}, // youon yo + {"ヨ", "\x1\x7c"}, // yo + {"ラ", "\x1\x7d"}, // ra + {"リ", "\x1\x7e"}, // ri + {"ル", "\x1\x7f"}, // ru + {"レ", "\x1\x80"}, // re + {"ロ", "\x1\x81"}, // ro + {"ヮ", "\x1\x82"}, // -wa + {"ワ", "\x1\x83"}, // wa + {"ヲ", "\x1\x84"}, // wo + {"ン", "\x1\x85"}, // -n + + {"位", "\x1\x8c"}, + {"遺", "\x1\x8d"}, + {"院", "\x1\x8e"}, + {"映", "\x1\x8f"}, + {"衛", "\x1\x90"}, + {"応", "\x1\x91"}, + {"下", "\x1\x92"}, + {"画", "\x1\x93"}, + {"解", "\x1\x94"}, + {"開", "\x1\x95"}, + {"外", "\x1\x96"}, + {"害", "\x1\x97"}, + {"蓋", "\x1\x98"}, + {"完", "\x1\x99"}, + {"換", "\x1\x9a"}, + {"監", "\x1\x9b"}, + {"間", "\x1\x9c"}, + {"器", "\x1\x9d"}, + {"記", "\x1\x9e"}, + {"逆", "\x1\x9f"}, + {"救", "\x1\xa0"}, + {"金", "\x1\xa1"}, + {"空", "\x1\xa2"}, + {"掘", "\x1\xa3"}, + {"警", "\x1\xa4"}, + {"迎", "\x1\xa5"}, + {"撃", "\x1\xa6"}, + {"建", "\x1\xa7"}, + {"源", "\x1\xa8"}, + {"現", "\x1\xa9"}, + {"言", "\x1\xaa"}, + {"限", "\x1\xab"}, + {"個", "\x1\xac"}, + {"庫", "\x1\xad"}, + {"後", "\x1\xae"}, + {"語", "\x1\xaf"}, + {"護", "\x1\xb0"}, + {"交", "\x1\xb1"}, + {"功", "\x1\xb2"}, + {"向", "\x1\xb3"}, + {"工", "\x1\xb4"}, + {"攻", "\x1\xb5"}, + {"溝", "\x1\xb6"}, + {"行", "\x1\xb7"}, + {"鉱", "\x1\xb8"}, + {"降", "\x1\xb9"}, + {"合", "\x1\xba"}, + {"告", "\x1\xbb"}, + {"獄", "\x1\xbc"}, + {"彩", "\x1\xbd"}, + {"作", "\x1\xbe"}, + {"山", "\x1\xbf"}, + {"使", "\x1\xc0"}, + {"始", "\x1\xc1"}, + {"試", "\x1\xc2"}, + {"字", "\x1\xc3"}, + {"寺", "\x1\xc4"}, + {"時", "\x1\xc5"}, + {"示", "\x1\xc6"}, + {"自", "\x1\xc7"}, + {"式", "\x1\xc8"}, + {"矢", "\x1\xc9"}, + {"射", "\x1\xca"}, + {"者", "\x1\xcb"}, + {"守", "\x1\xcc"}, + {"手", "\x1\xcd"}, + {"終", "\x1\xce"}, + {"週", "\x1\xcf"}, + {"出", "\x1\xd0"}, + {"所", "\x1\xd1"}, + {"書", "\x1\xd2"}, + {"勝", "\x1\xd3"}, + {"章", "\x1\xd4"}, + {"上", "\x1\xd5"}, + {"乗", "\x1\xd6"}, + {"場", "\x1\xd7"}, + {"森", "\x1\xd8"}, + {"進", "\x1\xd9"}, + {"人", "\x1\xda"}, + {"水", "\x1\xdb"}, + {"数", "\x1\xdc"}, + {"制", "\x1\xdd"}, + {"性", "\x1\xde"}, + {"成", "\x1\xdf"}, + {"聖", "\x1\xe0"}, + {"石", "\x1\xe1"}, + {"跡", "\x1\xe2"}, + {"先", "\x1\xe3"}, + {"戦", "\x1\xe4"}, + {"船", "\x1\xe5"}, + {"選", "\x1\xe6"}, + {"走", "\x1\xe7"}, + {"送", "\x1\xe8"}, + {"像", "\x1\xe9"}, + {"造", "\x1\xea"}, + {"続", "\x1\xeb"}, + {"対", "\x1\xec"}, + {"袋", "\x1\xed"}, + {"台", "\x1\xee"}, + {"弾", "\x1\xef"}, + {"地", "\x1\xf0"}, + {"中", "\x1\xf1"}, + {"敵", "\x1\xf2"}, + {"転", "\x1\xf3"}, + {"電", "\x1\xf4"}, + {"塔", "\x1\xf5"}, + {"頭", "\x1\xf6"}, + {"動", "\x1\xf7"}, + {"内", "\x1\xf8"}, + {"日", "\x1\xf9"}, + {"入", "\x1\xfa"}, + {"年", "\x1\xfb"}, + {"能", "\x1\xfc"}, + {"廃", "\x1\xfd"}, + {"排", "\x1\xfe"}, + {"敗", "\x1\xff"}, + + {"発", "\x2\x10"}, + {"反", "\x2\x11"}, + {"必", "\x2\x12"}, + {"表", "\x2\x13"}, + {"武", "\x2\x14"}, + {"壁", "\x2\x15"}, + {"墓", "\x2\x16"}, + {"放", "\x2\x17"}, + {"方", "\x2\x18"}, + {"砲", "\x2\x19"}, + {"妨", "\x2\x1a"}, + {"北", "\x2\x1b"}, + {"本", "\x2\x1c"}, + {"幕", "\x2\x1d"}, + {"無", "\x2\x1e"}, + {"迷", "\x2\x1f"}, + {"面", "\x2\x20"}, + {"戻", "\x2\x21"}, + {"紋", "\x2\x22"}, + {"薬", "\x2\x23"}, + {"輸", "\x2\x24"}, + {"勇", "\x2\x25"}, + {"友", "\x2\x26"}, + {"遊", "\x2\x27"}, + {"容", "\x2\x28"}, + {"要", "\x2\x29"}, + {"利", "\x2\x2a"}, + {"了", "\x2\x2b"}, + {"量", "\x2\x2c"}, + {"力", "\x2\x2d"}, + {"練", "\x2\x2e"}, + {"連", "\x2\x2f"}, + {"録", "\x2\x30"}, + {"話", "\x2\x31"}, + {"墟", "\x2\x32"}, + {"脱", "\x2\x33"}, + // {"成", "\x2\x34"}, + {"旗", "\x2\x35"}, + {"破", "\x2\x36"}, + {"壊", "\x2\x37"}, + {"全", "\x2\x38"}, + {"滅", "\x2\x39"}, + {"機", "\x2\x3a"}, + {"仲", "\x2\x3b"}, + {"渓", "\x2\x3c"}, + {"谷", "\x2\x3d"}, + {"優", "\x2\x3e"}, + {"探", "\x2\x3f"}, + {"部", "\x2\x40"}, + {"索", "\x2\x41"}, + // {"乗", "\x2\x42"}, + {"前", "\x2\x43"}, + {"右", "\x2\x44"}, + {"左", "\x2\x45"}, + {"会", "\x2\x46"}, + {"高", "\x2\x47"}, + {"低", "\x2\x48"}, + {"押", "\x2\x49"}, + {"切", "\x2\x4a"}, + {"替", "\x2\x4b"}, + // {"対", "\x2\x4c"}, + {"秒", "\x2\x4d"}, + {"箱", "\x2\x4e"}, + {"泳", "\x2\x4f"}, + {"~", "\x2\x50"}, + + {"闇", "\x2\x56"}, + {"以", "\x2\x57"}, + {"屋", "\x2\x58"}, + {"俺", "\x2\x59"}, + {"化", "\x2\x5a"}, + {"界", "\x2\x5b"}, + {"感", "\x2\x5c"}, + {"気", "\x2\x5d"}, + {"却", "\x2\x5e"}, + {"曲", "\x2\x5f"}, + {"継", "\x2\x60"}, + {"権", "\x2\x61"}, + {"見", "\x2\x62"}, + {"古", "\x2\x63"}, + {"好", "\x2\x64"}, + // {"高", "\x2\x65"}, + {"才", "\x2\x66"}, + {"士", "\x2\x67"}, + {"子", "\x2\x68"}, + {"次", "\x2\x69"}, + {"主", "\x2\x6a"}, + {"種", "\x2\x6b"}, + {"讐", "\x2\x6c"}, + {"女", "\x2\x6d"}, + {"小", "\x2\x6e"}, + {"焼", "\x2\x6f"}, + {"証", "\x2\x70"}, + {"神", "\x2\x71"}, + {"身", "\x2\x72"}, + {"寸", "\x2\x73"}, + {"世", "\x2\x74"}, + {"想", "\x2\x75"}, + {"退", "\x2\x76"}, + {"第", "\x2\x77"}, + {"着", "\x2\x78"}, + {"天", "\x2\x79"}, + {"倒", "\x2\x7a"}, + {"到", "\x2\x7b"}, + {"突", "\x2\x7c"}, + {"爆", "\x2\x7d"}, + {"番", "\x2\x7e"}, + {"負", "\x2\x7f"}, + {"復", "\x2\x80"}, + {"物", "\x2\x81"}, + {"眠", "\x2\x82"}, + {"予", "\x2\x83"}, + {"用", "\x2\x84"}, + {"落", "\x2\x85"}, + {"緑", "\x2\x86"}, + + {"封", "\x2\x88"}, + {"印", "\x2\x89"}, + {"扉", "\x2\x8a"}, + {"最", "\x2\x8b"}, + {"刻", "\x2\x8c"}, + {"足", "\x2\x8d"}, +}; + +std::unordered_map> jamo_glyph_mappings_jak2 = { + {"0x06", {"ᄀ"}}, {"0x07", {"ᄁ"}}, {"0x08", {"ᄂ"}}, {"0x09", {"ᄃ"}}, + {"0x0a", {"ᄄ"}}, {"0x0b", {"ᄅ"}}, {"0x0c", {"ᄆ"}}, {"0x0d", {"ᄇ"}}, + {"0x0e", {"ᄈ"}}, {"0x0f", {"ᄋ"}}, {"0x10", {"ᄌ"}}, {"0x11", {"ᄍ"}}, + {"0x12", {"ᄏ"}}, {"0x13", {"ᄐ"}}, {"0x14", {"ᄑ"}}, {"0x15", {"ᅡ"}}, + {"0x16", {"ᅣ"}}, {"0x17", {"ᅵ"}}, {"0x18", {"ᅥ"}}, {"0x19", {"ᅧ"}}, + {"0x1a", {"ᅡ"}}, {"0x1b", {"ᅣ"}}, {"0x1c", {"ᅵ"}}, {"0x1d", {"ᅥ"}}, + {"0x1e", {"ᅧ"}}, {"0x1f", {"ᄂ"}}, {"0x20", {"ᄉ"}}, {"0x21", {"ᄊ"}}, + {"0x22", {"ᅥ"}}, {"0x23", {"ᅧ"}}, {"0x24", {"ᅥ"}}, {"0x25", {"ᅧ"}}, + {"0x26", {"ᄃ"}}, {"0x27", {"ᄄ"}}, {"0x28", {"ᄅ"}}, {"0x29", {"ᄐ"}}, + {"0x2a", {"ᄑ"}}, {"0x2b", {"ᅧ"}}, {"0x2c", {"ᅧ"}}, {"0x2d", {"ᄎ"}}, + {"0x2e", {"ᄒ"}}, {"0x2f", {"ᅥ"}}, {"0x30", {"ᅧ"}}, {"0x31", {"ᅥ"}}, + {"0x32", {"ᅧ"}}, {"0x33", {"ᄀ"}}, {"0x34", {"ᄁ"}}, {"0x35", {"ᄂ"}}, + {"0x36", {"ᄃ"}}, {"0x37", {"ᄄ"}}, {"0x38", {"ᄅ"}}, {"0x39", {"ᄆ"}}, + {"0x3a", {"ᄇ"}}, {"0x3b", {"ᄈ"}}, {"0x3c", {"ᄋ"}}, {"0x3d", {"ᄌ"}}, + {"0x3e", {"ᄍ"}}, {"0x3f", {"ᄏ"}}, {"0x40", {"ᄐ"}}, {"0x41", {"ᄑ"}}, + {"0x42", {"ᅢ"}}, {"0x43", {"ᅤ"}}, {"0x44", {"ᅦ"}}, {"0x45", {"ᅨ"}}, + {"0x46", {"ᅢ"}}, {"0x47", {"ᅤ"}}, {"0x48", {"ᅦ"}}, {"0x49", {"ᅨ"}}, + {"0x4a", {"ᄂ"}}, {"0x4b", {"ᄉ"}}, {"0x4c", {"ᄊ"}}, {"0x4d", {"ᅦ"}}, + {"0x4e", {"ᅨ"}}, {"0x4f", {"ᅦ"}}, {"0x50", {"ᅨ"}}, {"0x51", {"ᄃ"}}, + {"0x52", {"ᄄ"}}, {"0x53", {"ᄅ"}}, {"0x54", {"ᄐ"}}, {"0x55", {"ᄑ"}}, + {"0x56", {"ᅨ"}}, {"0x57", {"ᅨ"}}, {"0x58", {"ᄎ"}}, {"0x59", {"ᄒ"}}, + {"0x5a", {"ᅦ"}}, {"0x5b", {"ᅨ"}}, {"0x5c", {"ᅦ"}}, {"0x5d", {"ᅨ"}}, + {"0x5e", {"ᄀ"}}, {"0x5f", {"ᄏ"}}, {"0x60", {"ᅩ"}}, {"0x61", {"ᅭ"}}, + {"0x62", {"ᅩ"}}, {"0x63", {"ᅭ"}}, {"0x64", {"ᄁ", "ᅫ"}}, {"0x65", {"ᄁ", "ᅩ"}}, + {"0x66", {"ᄁ", "ᅩ"}}, {"0x67", {"ᄁ", "ᅭ"}}, {"0x68", {"ᄁ"}}, {"0x69", {"ᄂ"}}, + {"0x6a", {"ᅳ"}}, {"0x6b", {"ᅮ"}}, {"0x6c", {"ᅲ"}}, {"0x6d", {"ᅳ"}}, + {"0x6e", {"ᅮ"}}, {"0x6f", {"ᅲ"}}, {"0x70", {"ᄃ"}}, {"0x71", {"ᄄ"}}, + {"0x72", {"ᄅ"}}, {"0x73", {"ᄆ"}}, {"0x74", {"ᄇ"}}, {"0x75", {"ᄈ"}}, + {"0x76", {"ᄉ"}}, {"0x77", {"ᄊ"}}, {"0x78", {"ᄋ"}}, {"0x79", {"ᄌ"}}, + {"0x7a", {"ᄍ"}}, {"0x7b", {"ᄎ"}}, {"0x7c", {"ᄐ"}}, {"0x7d", {"ᄑ"}}, + {"0x7e", {"ᄒ"}}, {"0x7f", {"ᅩ"}}, {"0x80", {"ᅭ"}}, {"0x81", {"ᅳ"}}, + {"0x82", {"ᅩ"}}, {"0x83", {"ᅭ"}}, {"0x84", {"ᅳ"}}, {"0x85", {"ᅮ"}}, + {"0x86", {"ᅲ"}}, {"0x87", {"ᅮ"}}, {"0x88", {"ᅲ"}}, {"0x89", {"ᅮ", "ᆫ"}}, + {"0x8a", {"ᅲ", "ᆫ"}}, {"0x8b", {"ᄀ"}}, {"0x8c", {"ᄏ"}}, {"0x8d", {"ᅩ"}}, + {"0x8e", {"ᅩ"}}, {"0x8f", {"ᄁ", "ᅩ"}}, {"0x90", {"ᄁ", "ᅩ"}}, {"0x91", {"ᄁ"}}, + {"0x92", {"ᄂ"}}, {"0x93", {"ᄃ"}}, {"0x94", {"ᄄ"}}, {"0x95", {"ᄅ"}}, + {"0x96", {"ᄆ"}}, {"0x97", {"ᄇ"}}, {"0x98", {"ᄈ"}}, {"0x99", {"ᄉ"}}, + {"0x9a", {"ᄊ"}}, {"0x9b", {"ᄋ"}}, {"0x9c", {"ᄌ"}}, {"0x9d", {"ᄍ"}}, + {"0x9e", {"ᄎ"}}, {"0x9f", {"ᄐ"}}, {"0xa0", {"ᄑ"}}, {"0xa1", {"ᄒ"}}, + {"0xa2", {"ᅩ"}}, {"0xa3", {"ᅳ"}}, {"0xa4", {"ᅩ"}}, {"0xa5", {"ᅳ"}}, + {"0xa6", {"ᅡ"}}, {"0xa7", {"ᅵ"}}, {"0xa8", {"ᅡ"}}, {"0xa9", {"ᅵ"}}, + {"0xaa", {"ᅯ"}}, {"0xab", {"ᅱ"}}, {"0xac", {"ᅯ"}}, {"0xad", {"ᅱ"}}, + {"0xae", {"ᄀ"}}, {"0xaf", {"ᄏ"}}, {"0xb0", {"ᅫ"}}, {"0xb1", {"ᅫ"}}, + {"0xb2", {"ᄆ"}}, {"0xb3", {"ᄁ"}}, {"0xb4", {"ᄂ"}}, {"0xb5", {"ᄃ"}}, + {"0xb6", {"ᄄ"}}, {"0xb7", {"ᄅ"}}, {"0xb8", {"ᄇ"}}, {"0xb9", {"ᄉ"}}, + {"0xba", {"ᄊ"}}, {"0xbb", {"ᄋ"}}, {"0xbc", {"ᄌ"}}, {"0xbd", {"ᄍ"}}, + {"0xbe", {"ᄎ"}}, {"0xbf", {"ᄐ"}}, {"0xc0", {"ᄒ"}}, {"0xc1", {"ᅫ"}}, + {"0xc2", {"ᅫ"}}, {"0xc3", {"ᅰ"}}, {"0xc4", {"ᅰ"}}, {"0xc5", {"ᆨ"}}, + {"0xc6", {"ᆩ"}}, {"0xc7", {"ᆪ"}}, {"0xc8", {"ᆫ"}}, {"0xc9", {"ᆬ"}}, + {"0xca", {"ᆭ"}}, {"0xcb", {"ᆮ"}}, {"0xcc", {"ᆯ"}}, {"0xcd", {"ᆰ"}}, + {"0xce", {"ᆱ"}}, {"0xcf", {"ᆲ"}}, {"0xd0", {"ᆴ"}}, {"0xd1", {"ᆶ"}}, + {"0xd2", {"ᆷ"}}, {"0xd3", {"ᆸ"}}, {"0xd4", {"ᆹ"}}, {"0xd5", {"ᆺ"}}, + {"0xd6", {"ᆻ"}}, {"0xd7", {"ᆼ"}}, {"0xd8", {"ᆽ"}}, {"0xd9", {"ᆾ"}}, + {"0xda", {"ᆿ"}}, {"0xdb", {"ᇀ"}}, {"0xdc", {"ᇁ"}}, {"0xdd", {"ᇂ"}}, + {"0xde", {"ᆨ"}}, {"0xdf", {"ᆩ"}}, {"0xe0", {"ᆪ"}}, {"0xe1", {"ᆫ"}}, + {"0xe2", {"ᆭ"}}, {"0xe3", {"ᆮ"}}, {"0xe4", {"ᆯ"}}, {"0xe5", {"ᆰ"}}, + {"0xe6", {"ᆱ"}}, {"0xe7", {"ᆳ"}}, {"0xe8", {"ᆴ"}}, {"0xe9", {"ᆵ"}}, + {"0xea", {"ᆶ"}}, {"0xeb", {"ᆷ"}}, {"0xec", {"ᆸ"}}, {"0xed", {"ᆺ"}}, + {"0xee", {"ᆼ"}}, {"0xef", {"ᆽ"}}, {"0xf0", {"ᆾ"}}, {"0xf1", {"ᆿ"}}, + {"0xf2", {"ᇀ"}}, {"0xf3", {"ᇁ"}}, {"0xf4", {"ᇂ"}}, {"0xf5", {"ᆨ"}}, + {"0xf6", {"ᆫ"}}, {"0xf7", {"ᆯ"}}, {"0xf8", {"ᆱ"}}, {"0xf9", {"ᆷ"}}, + {"0xfa", {"ᆸ"}}, {"0xfb", {"ᆺ"}}, {"0xfc", {"ᆻ"}}, {"0xfd", {"ᆼ"}}, + {"0xfe", {"ᆨ"}}, {"0xff", {"ᆫ"}}, {"extra_0x86", {"ᆯ"}}, {"extra_0x87", {"ᆷ"}}, + {"extra_0x88", {"ᆸ"}}, {"extra_0x89", {"ᆺ"}}, {"extra_0x8a", {"ᆻ"}}, {"extra_0x8b", {"ᆼ"}}, +}; + +GameTextFontBank g_font_bank_jak2(GameTextVersion::JAK2, + &encode_info_jak2, + &replace_info_jak2, + &passthrus_jak2); diff --git a/common/util/font/dbs/font_db_jak2.h b/common/util/font/dbs/font_db_jak2.h new file mode 100644 index 0000000000..73a89e61ae --- /dev/null +++ b/common/util/font/dbs/font_db_jak2.h @@ -0,0 +1,16 @@ +#pragma once + +#include "common/util/font/font_utils.h" + +extern std::unordered_map> jamo_glyph_mappings_jak2; + +/*! + * ================================ + * GAME TEXT FONT BANK - JAK 2 + * ================================ + * This font is used in: + * - Jak II + * - Jak II: Renegade + * - ジャックXダクスター2 + */ +extern GameTextFontBank g_font_bank_jak2; \ No newline at end of file diff --git a/common/util/font/dbs/font_db_jak3.cpp b/common/util/font/dbs/font_db_jak3.cpp new file mode 100644 index 0000000000..41c5f90c5c --- /dev/null +++ b/common/util/font/dbs/font_db_jak3.cpp @@ -0,0 +1,794 @@ +#include "font_db_jak3.h" + +std::unordered_set passthrus_jak3 = {'~', ' ', ',', '.', '-', '+', '(', ')', + '!', ':', '?', '=', '%', '*', '/', '#', + ';', '<', '>', '@', '[', '_', ']'}; + +std::vector replace_info_jak3 = { + // other + {"A~Y~-21H~-5Vº~Z", "Å"}, + {"N~Y~-6Hº~Z~+10H", "Nº"}, + {"~+4Vç~-4V", ",c"}, + + // added for translations TODO - check these for jak 2 + {"O~Y~-25H~-1V/~Z", "Ø"}, + {"o~Y~-23H~+4V/~Z", "ø"}, + {"A~Y~-13H~+8V,~Z", "Ą"}, + {"a~Y~-8H~+6V,~Z", "ą"}, + {"E~Y~-6H~+8V,~Z", "Ę"}, + {"e~Y~-10H~+7V,~Z", "ę"}, + {"L~Y~-21H~+0V/~Z", "Ł"}, + {"l~Y~-16H~+0V/~Z", "ł"}, // TODO - this one is ugly, font character addition (small slash) + {"Z~Y~-25H~-11Vº~Z", "Ż"}, + {"z~Y~-23H~-5Vº~Z", "ż"}, + {"a~Y~-25H~-5Vº~Z", "å"}, + {"S~Y~-21H~-5V'~Z", "Ś"}, + {"s~Y~-25H~-5V'~Z", "ś"}, + {"n~Y~-25H~-5V'~Z", "ń"}, + {"c~Y~-25H~-5V'~Z", "ć"}, + {"o~Y~-24H~-4V~Z", "õ"}, + {"a~Y~-24H~-4V~Z", "ã"}, + {"O~Y~-28H~-4V'~-9H'~Z", "Ő"}, + {"U~Y~-27H~-4V'~-12H'~Z", "Ű"}, + {"o~Y~-28H~-4V'~-9H'~Z", "ő"}, + {"u~Y~-28H~-4V'~-9H'~Z", "ű"}, + {"E~Y~-22H~-11Vº~Z", "Ė"}, + {"e~Y~-25H~-5Vº~Z", "ė"}, + {"C~Y~-27H~-10Vˇ~Z", "Č"}, + {"c~Y~-25H~-5Vˇ~Z", "č"}, + {"S~Y~-24H~-10Vˇ~Z", "Š"}, + {"s~Y~-22H~-4Vˇ~Z", "š"}, + {"Z~Y~-25H~-10Vˇ~Z", "Ž"}, + {"z~Y~-23H~-4Vˇ~Z", "ž"}, + {"U~Y~-15H~+5V,~Z", "Ų"}, + {"u~Y~-15H~+5V,~Z", "ų"}, + {"U~Y~-20H~-18V-~Z", "Ū"}, + {"u~Y~-18H~-15V-~Z", "ū"}, + {"D~Y~-28H~-1V-~Z", "Đ"}, + {"d~Y~-13H~-10V-~Z", "đ"}, + {"I~Y~-8H~+4V,~Z", "Į"}, + {"i~Y~-8H~+4V,~Z", "į"}, + // czech specific + {"U~Y~-24H~-7Vº~Z", "Ů"}, + {"u~Y~-23H~-5Vº~Z", "ů"}, + {"t~Y~-7H~-21V,~Z", "ť"}, + + // tildes + {"N~Y~-22H~-4V~Z", "Ñ"}, + {"n~Y~-24H~-4V~Z", "ñ"}, + {"A~Y~-21H~-5V~Z", "Ã"}, + {"O~Y~-22H~-4V~Z", "Õ"}, + + // acute accents + {"A~Y~-21H~-5V'~Z", "Á"}, + {"A~Y~-26H~-8V'~Z", "<Á_V2>"}, // unfortunate... + {"a~Y~-25H~-5V'~Z", "á"}, + {"E~Y~-23H~-9V'~Z", "É"}, + {"e~Y~-26H~-5V'~Z", "é"}, + {"I~Y~-19H~-5V'~Z", "Í"}, + {"i~Y~-19H~-8V'~Z", "í"}, + {"O~Y~-22H~-4V'~Z", "Ó"}, + {"o~Y~-26H~-4V'~Z", "ó"}, + {"U~Y~-24H~-3V'~Z", "Ú"}, + {"u~Y~-24H~-3V'~Z", "ú"}, + {"Z~Y~-24H~-3V'~Z", "Ź"}, + {"z~Y~-24H~-3V'~Z", "ź"}, + // czech specific + {"Y~Y~-26H~-5V'~Z", "Ý"}, + {"~+7Vy~-7V~Y~-24H~-3V'~Z", "ý"}, + + // circumflex + {"A~Y~-20H~-4V^~Z", "Â"}, + {"a~Y~-24H~-5V^~Z", "â"}, + {"E~Y~-20H~-5V^~Z", "Ê"}, + {"e~Y~-25H~-4V^~Z", "ê"}, + {"I~Y~-19H~-5V^~Z", "Î"}, + {"i~Y~-19H~-8V^~Z", "î"}, + {"O~Y~-20H~-4V^~Z", "Ô"}, + {"o~Y~-25H~-4V^~Z", "ô"}, + {"U~Y~-24H~-3V^~Z", "Û"}, + {"u~Y~-23H~-3V^~Z", "û"}, + + // grave accents + {"A~Y~-26H~-8V`~Z", "À"}, + {"a~Y~-25H~-5V`~Z", "à"}, + {"E~Y~-23H~-9V`~Z", "È"}, + {"e~Y~-26H~-5V`~Z", "è"}, + {"I~Y~-19H~-5V`~Z", "Ì"}, + {"i~Y~-19H~-8V`~Z", "ì"}, + {"O~Y~-22H~-4V`~Z", "Ò"}, + {"o~Y~-26H~-4V`~Z", "ò"}, + {"U~Y~-24H~-3V`~Z", "Ù"}, + {"u~Y~-24H~-3V`~Z", "ù"}, + + // umlaut + {"A~Y~-26H~-8V¨~Z", "Ä"}, + {"a~Y~-25H~-5V¨~Z", "ä"}, + {"E~Y~-20H~-5V¨~Z", "Ë"}, + {"e~Y~-25H~-5V¨~Z", "ë"}, + {"I~Y~-19H~-5V¨~Z", "Ï"}, + {"i~Y~-26H~-4V¨~Z", "ï"}, + {"O~Y~-26H~-8V¨~Z", "Ö"}, + {"o~Y~-26H~-4V¨~Z", "ö"}, + {"U~Y~-25H~-8V¨~Z", "Ü"}, + {"u~Y~-24H~-3V¨~Z", "ü"}, + + // caron - Ǎ ǎ Ě ě Ǧ ǧ Ǐ ǐ Ǒ ǒ Ǔ ǔ Y̌ y̌ + {"A~Y~-25H~-9Vˇ~Z", "Ǎ"}, + {"a~Y~-24H~-5Vˇ~Z", "ǎ"}, + {"E~Y~-22H~-8Vˇ~Z", "Ě"}, + {"e~Y~-25H~-4Vˇ~Z", "ě"}, + {"G~Y~-24H~-8Vˇ~Z", "Ǧ"}, + {"~+7Vg~-7V~Y~-25H~-4Vˇ~Z", "ǧ"}, + {"I~Y~-19H~-8Vˇ~Z", "Ǐ"}, + {"i~Y~-19H~-8Vˇ~Z", "ǐ"}, + {"O~Y~-25H~-7Vˇ~Z", "Ǒ"}, + {"o~Y~-25H~-4Vˇ~Z", "ǒ"}, + {"U~Y~-25H~-6Vˇ~Z", "Ǔ"}, + {"u~Y~-24H~-3Vˇ~Z", "ǔ"}, + {"Y~Y~-25H~-5Vˇ~Z", "Y̌"}, + {"~+7Vy~-7V~Y~-25H~-3Vˇ~Z", "y̌"}, + // czech specific - Č č Ň ň Ř ř Š š Ž ž Ť + {"C~Y~-25H~-9Vˇ~Z", "Č"}, + {"c~Y~-24H~-5Vˇ~Z", "č"}, + {"N~Y~-25H~-9Vˇ~Z", "Ň"}, + {"n~Y~-24H~-5Vˇ~Z", "ň"}, + {"R~Y~-25H~-9Vˇ~Z", "Ř"}, + {"r~Y~-22H~-5Vˇ~Z", "ř"}, + {"S~Y~-25H~-9Vˇ~Z", "Š"}, + {"s~Y~-22H~-5Vˇ~Z", "š"}, + {"T~Y~-24H~-7Vˇ~Z", "Ť"}, + {"Z~Y~-25H~-9Vˇ~Z", "Ž"}, + {"z~Y~-24H~-5Vˇ~Z", "ž"}, + + // dakuten katakana + {"~Yウ~Z゛", "ヴ"}, + {"~Yカ~Z゛", "ガ"}, + {"~Yキ~Z゛", "ギ"}, + {"~Yク~Z゛", "グ"}, + {"~Yケ~Z゛", "ゲ"}, + {"~Yコ~Z゛", "ゴ"}, + {"~Yサ~Z゛", "ザ"}, + {"~Yシ~Z゛", "ジ"}, + {"~Yス~Z゛", "ズ"}, + {"~Yセ~Z゛", "ゼ"}, + {"~Yソ~Z゛", "ゾ"}, + {"~Yタ~Z゛", "ダ"}, + {"~Yチ~Z゛", "ヂ"}, + {"~Yツ~Z゛", "ヅ"}, + {"~Yテ~Z゛", "デ"}, + {"~Yト~Z゛", "ド"}, + {"~Yハ~Z゛", "バ"}, + {"~Yヒ~Z゛", "ビ"}, + {"~Yフ~Z゛", "ブ"}, + {"~Yヘ~Z゛", "ベ"}, + {"~Yホ~Z゛", "ボ"}, + // handakuten katakana + {"~Yハ~Z゜", "パ"}, + {"~Yヒ~Z゜", "ピ"}, + {"~Yフ~Z゜", "プ"}, + {"~Yヘ~Z゜", "ペ"}, + {"~Yホ~Z゜", "ポ"}, + // dakuten hiragana + {"~Yか~Z゛", "が"}, + {"~Yき~Z゛", "ぎ"}, + {"~Yく~Z゛", "ぐ"}, + {"~Yけ~Z゛", "げ"}, + {"~Yこ~Z゛", "ご"}, + {"~Yさ~Z゛", "ざ"}, + {"~Yし~Z゛", "じ"}, + {"~Yす~Z゛", "ず"}, + {"~Yせ~Z゛", "ぜ"}, + {"~Yそ~Z゛", "ぞ"}, + {"~Yた~Z゛", "だ"}, + {"~Yち~Z゛", "ぢ"}, + {"~Yつ~Z゛", "づ"}, + {"~Yて~Z゛", "で"}, + {"~Yと~Z゛", "ど"}, + {"~Yは~Z゛", "ば"}, + {"~Yひ~Z゛", "び"}, + {"~Yふ~Z゛", "ぶ"}, + {"~Yへ~Z゛", "べ"}, + {"~Yほ~Z゛", "ぼ"}, + // handakuten hiragana + {"~Yは~Z゜", "ぱ"}, + {"~Yひ~Z゜", "ぴ"}, + {"~Yふ~Z゜", "ぷ"}, + {"~Yへ~Z゜", "ぺ"}, + {"~Yほ~Z゜", "ぽ"}, + // japanese punctuation + {",~+8H", "、"}, + {"~+8H ", " "}, + + // playstation buttons + // - face + {"~Y~22L<~Z~Y~27L*~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + {"~Y~22L<~Z~Y~26L;~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + {"~Y~22L<~Z~Y~25L@~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + {"~Y~22L<~Z~Y~24L#~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + // - dpad + {"~Y~22L~Z~3L~+17H~-13V~Z~22L~+17H~+14V~Z~" + "22L~+32H~Z~+56H", + ""}, + {"~Y~22L~Z~3L~+17H~-13V~Z~3L~+17H~+14V~Z~" + "22L~+32H~Z~+56H", + ""}, + {"~Y~22L~Z~22L~+17H~-13V~Z~22L~+17H~+14V~Z~" + "22L~+32H~Z~+56H", + ""}, + // - shoulder + {"~Y~22L~-2H~-12V~Z~22L~-2H~+17V~Z~1L~+4H~+3V~Z~+" + "38H", + ""}, + {"~Y~22L~-2H~-12V~Z~22L~-2H~+17V~Z~1L~+6H~+3V~Z~+" + "38H", + ""}, + {"~Y~22L~-2H~-6V~Z~22L~-2H~+16V~Z~1L~+5H~-2V~Z~+" + "38H", + ""}, + {"~Y~22L~-2H~-6V~Z~22L~-2H~+16V~Z~1L~+5H~-2V~Z~+" + "38H", + ""}, + // - analog + {"~1L~+8H~Y~Z~6L~-16H~Z~+16h~6L~Z~" + "6L~-15V~Z~+13V~6L~Z~-10H~+9V~6L~Z~+10H~+9V~6L~Z~-10H~-11V~6L~Z~+10H~" + "-11V~6L~Z~+32H", + ""}, + {"~Y~1L~+8H~Z~6L~-8H~Z~+24H~6L~Z~+" + "40H", + ""}, + {"~Y~1L~Z~6L~-15V~Z~+13V~6L~Z~+26H", + ""}, + + // icons + {"~Y~6L<~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + {"~Y~3L<~Z~Y~1L>~Z~Y~23L[~Z~+26H", ""}, + + // flags + {"~Y~6L~Z~+15H~1L~Z~+30H~3L~Z~+45H", + ""}, + {"~Y~5L~Z~3L~]~-1H~Y~5L~Z~3L~Z~+26H", + ""}, + {"~Y~39L~~~Z~3L~Z~5L~]~-1H~Y~39L~~~" + "Z~3L~Z~5L~Z~+26H", + ""}, + {"~Y~7L~Z~+15H~1L~Z~+30H~3L~Z~+47H", + ""}, + {"~Y~1L~Z~3L~Z~7L~]~-1H~Y~1L<" + "FLAG_PART_FILL>~Z~3L~Z~7L~Z~+26H", + ""}, + {"~Y~1L~Z~3L~Z~7L~]~-1H~Y~1L<" + "FLAG_PART_FILL>~Z~3L~Z~+26H", + ""}, + {"~Y~1L~Z~39L~]~-1H~Y~1L~Z~39L<" + "FLAG_PART_KOREA_TRIGRAMS_RIGHT>~Z~-11H~7L~Z~-11H~3L~Z~+26H", + ""}, + {"~Y~1L~]~-1H~Y~1L~Z~-11H~3L~Z~+26H", + ""}, + {"~Y~1L~Z~7L~Z~7L~]" + "~-1H~Y~1L~Z~7L~Z~+26H", + ""}, + {"~Y~7L~Z~5L~Z~5L~]" + "~-1H~Y~7L~Z~5L~Z~+26H", + ""}, + {"~Y~3L~Z~1L~Z~1L~]" + "~-1H~Y~3L~Z~1L~Z~+26H", + ""}, + {"~Y~1L~Z~3L~]~-1H~Y~1L~Z~3L~Z~-19H~1L~Z~-23H~7L~Z~-23H~7L~Z~7L~Z~" + "+26H", + ""}, + {"~Y~1L~Z~7L~]~-1H~Y~1L~Z~7L~Z~-19H~1L~Z~-23H~3L~Z~-23H~3L~Z~3L~Z~" + "+26H", + ""}, + + // weird stuff + // - descenders + {"~+7Vp~-7V", "p"}, + {"~+7Vy~-7V", "y"}, + {"~+7Vg~-7V", "g"}, + {"~+7Vq~-7V", "q"}, + {"~+1Vj~-1V", "j"}, + + {"\\\\", + "~%"}, // this is 2 slashes, duplicated because we use an escape sequence when decompiling + + // - symbols and ligatures + {"~-4H~-3V~+3V~-4H", + ""}, // used for the 4<__> place in spanish. the 5th uses the same + // character but looks different...? + {"~Y~-6Hº~Z~+10H", "°"}, + + // Color / Emphasis + {"~[~0L", ""}, + {"~[~1L", ""}, + {"~[~2L", ""}, + {"~[~3L", ""}, + {"~[~4L", ""}, + {"~[~5L", ""}, + {"~[~6L", ""}, + {"~[~7L", ""}, + {"~[~8L", ""}, + {"~[~9L", ""}, + {"~[~10L", ""}, + {"~[~11L", ""}, + {"~[~12L", ""}, + {"~[~13L", ""}, + {"~[~14L", ""}, + {"~[~15L", ""}, + {"~[~16L", ""}, + {"~[~17L", ""}, + {"~[~18L", ""}, + {"~[~19L", ""}, + {"~[~20L", ""}, + {"~[~21L", ""}, + {"~[~22L", ""}, + {"~[~23L", ""}, + {"~[~24L", ""}, + {"~[~25L", ""}, + {"~[~26L", ""}, + {"~[~27L", ""}, + {"~[~28L", ""}, + {"~[~29L", ""}, + {"~[~30L", ""}, + {"~[~31L", ""}, + {"~[~32L", ""}, + {"~[~33L", ""}, + {"~[~34L", ""}, + {"~[~35L", ""}, + {"~[~36L", ""}, + {"~[~37L", ""}, + {"~[~38L", ""}, + {"~[~39L", ""}}; + +// TODO - cryllic + +std::vector encode_info_jak3 = { + {"ˇ", "\x10"}, // caron + {"`", "\x11"}, // grave accent + {"'", "\x12"}, // apostrophe + {"^", "\x13"}, // circumflex + {"", "\x14"}, // tilde + {"¨", "\x15"}, // umlaut + {"º", "\x16"}, // numero/overring + {"¡", "\x17"}, // inverted exclamation mark + {"¿", "\x18"}, // inverted question mark + {"", "\x19"}, + {"ç", "\x1d"}, // c-cedilla + {"Ç", "\x1e"}, // c-cedilla + {"ß", "\x1f"}, // eszett + + {"œ", "\x5e"}, // ligature o+e + + {"", "\x7f"}, + {"", "\x80"}, + {"", "\x81"}, + {"", "\x82"}, + {"", "\x83"}, + {"", "\x84"}, + {"", "\x85"}, + {"", "\x86"}, + {"", "\x87"}, + {"", "\x88"}, + {"", "\x89"}, + {"", "\x8a"}, + {"", "\x8b"}, + {"", "\x8c"}, + {"", "\x8d"}, + {"", "\x8e"}, + {"", "\x8f"}, + {"", "\x90"}, + {"", "\x91"}, + {"", "\x92"}, + {"", "\x93"}, + {"", "\x94"}, + {"", "\x95"}, + {"", "\x96"}, + {"", "\x97"}, + {"", "\x98"}, + {"", "\x99"}, + {"", "\x9a"}, + {"", "\x9b"}, + {"", "\x9c"}, + {"", "\x9d"}, + {"", "\x9e"}, + {"", "\x9f"}, + {"", "\xa0"}, + {"", "\xa1"}, + {"", "\xa2"}, + {"", "\xa3"}, + {"", "\xa4"}, + {"", "\xa5"}, + {"", "\xa6"}, + {"", "\xa7"}, + {"", "\xa8"}, + {"", "\xa9"}, + {"", "\xaa"}, + {"", "\xab"}, + {"", "\xac"}, + + {"", "\xb0"}, + {"", "\xb1"}, + {"", "\xb2"}, + {"", "\xb3"}, + // {"入", "\x1\x00"}}, + // {"年", "\x1\x01"}}, + // punctuation + {"・", "\x1\x10"}, + {"゛", "\x1\x11"}, + {"゜", "\x1\x12"}, + {"ー", "\x1\x13"}, + {"『", "\x1\x14"}, + {"』", "\x1\x15"}, + // hiragana + {"ぁ", "\x1\x16"}, // -a + {"あ", "\x1\x17"}, // a + {"ぃ", "\x1\x18"}, // -i + {"い", "\x1\x19"}, // i + {"ぅ", "\x1\x1a"}, // -u + {"う", "\x1\x1b"}, // u + {"ぇ", "\x1\x1c"}, // -e + {"え", "\x1\x1d"}, // e + {"ぉ", "\x1\x1e"}, // -o + {"お", "\x1\x1f"}, // o + {"か", "\x1\x20"}, // ka + {"き", "\x1\x21"}, // ki + {"く", "\x1\x22"}, // ku + {"け", "\x1\x23"}, // ke + {"こ", "\x1\x24"}, // ko + {"さ", "\x1\x25"}, // sa + {"し", "\x1\x26"}, // shi + {"す", "\x1\x27"}, // su + {"せ", "\x1\x28"}, // se + {"そ", "\x1\x29"}, // so + {"た", "\x1\x2a"}, // ta + {"ち", "\x1\x2b"}, // chi + {"っ", "\x1\x2c"}, // sokuon + {"つ", "\x1\x2d"}, // tsu + {"て", "\x1\x2e"}, // te + {"と", "\x1\x2f"}, // to + {"な", "\x1\x30"}, // na + {"に", "\x1\x31"}, // ni + {"ぬ", "\x1\x32"}, // nu + {"ね", "\x1\x33"}, // ne + {"の", "\x1\x34"}, // no + {"は", "\x1\x35"}, // ha + {"ひ", "\x1\x36"}, // hi + {"ふ", "\x1\x37"}, // fu + {"へ", "\x1\x38"}, // he + {"ほ", "\x1\x39"}, // ho + {"ま", "\x1\x3a"}, // ma + {"み", "\x1\x3b"}, // mi + {"む", "\x1\x3c"}, // mu + {"め", "\x1\x3d"}, // me + {"も", "\x1\x3e"}, // mo + {"ゃ", "\x1\x3f"}, // youon ya + {"や", "\x1\x40"}, // ya + {"ゅ", "\x1\x41"}, // youon yu + {"ゆ", "\x1\x42"}, // yu + {"ょ", "\x1\x43"}, // youon yo + {"よ", "\x1\x44"}, // yo + {"ら", "\x1\x45"}, // ra + {"り", "\x1\x46"}, // ri + {"る", "\x1\x47"}, // ru + {"れ", "\x1\x48"}, // re + {"ろ", "\x1\x49"}, // ro + {"ゎ", "\x1\x4a"}, // -wa + {"わ", "\x1\x4b"}, // wa + {"を", "\x1\x4c"}, // wo + {"ん", "\x1\x4d"}, // -n + // katakana + {"ァ", "\x1\x4e"}, // -a + {"ア", "\x1\x4f"}, // a + {"ィ", "\x1\x50"}, // -i + {"イ", "\x1\x51"}, // i + {"ゥ", "\x1\x52"}, // -u + {"ウ", "\x1\x53"}, // u + {"ェ", "\x1\x54"}, // -e + {"エ", "\x1\x55"}, // e + {"ォ", "\x1\x56"}, // -o + {"オ", "\x1\x57"}, // o + {"カ", "\x1\x58"}, // ka + {"キ", "\x1\x59"}, // ki + {"ク", "\x1\x5a"}, // ku + {"ケ", "\x1\x5b"}, // ke + {"コ", "\x1\x5c"}, // ko + {"サ", "\x1\x5d"}, // sa + {"シ", "\x1\x5e"}, // shi + {"ス", "\x1\x5f"}, // su + {"セ", "\x1\x60"}, // se + {"ソ", "\x1\x61"}, // so + {"タ", "\x1\x62"}, // ta + {"チ", "\x1\x63"}, // chi + {"ッ", "\x1\x64"}, // sokuon + {"ツ", "\x1\x65"}, // tsu + {"テ", "\x1\x66"}, // te + {"ト", "\x1\x67"}, // to + {"ナ", "\x1\x68"}, // na + {"ニ", "\x1\x69"}, // ni + {"ヌ", "\x1\x6a"}, // nu + {"ネ", "\x1\x6b"}, // ne + {"ノ", "\x1\x6c"}, // no + {"ハ", "\x1\x6d"}, // ha + {"ヒ", "\x1\x6e"}, // hi + {"フ", "\x1\x6f"}, // fu + {"ヘ", "\x1\x70"}, // he + {"ホ", "\x1\x71"}, // ho + {"マ", "\x1\x72"}, // ma + {"ミ", "\x1\x73"}, // mi + {"ム", "\x1\x74"}, // mu + {"メ", "\x1\x75"}, // me + {"モ", "\x1\x76"}, // mo + {"ャ", "\x1\x77"}, // youon ya + {"ヤ", "\x1\x78"}, // ya + {"ュ", "\x1\x79"}, // youon yu + {"ユ", "\x1\x7a"}, // yu + {"ョ", "\x1\x7b"}, // youon yo + {"ヨ", "\x1\x7c"}, // yo + {"ラ", "\x1\x7d"}, // ra + {"リ", "\x1\x7e"}, // ri + {"ル", "\x1\x7f"}, // ru + {"レ", "\x1\x80"}, // re + {"ロ", "\x1\x81"}, // ro + {"ヮ", "\x1\x82"}, // -wa + {"ワ", "\x1\x83"}, // wa + {"ヲ", "\x1\x84"}, // wo + {"ン", "\x1\x85"}, // -n + + {"位", "\x1\x8c"}, + {"遺", "\x1\x8d"}, + {"院", "\x1\x8e"}, + {"映", "\x1\x8f"}, + {"衛", "\x1\x90"}, + {"応", "\x1\x91"}, + {"下", "\x1\x92"}, + {"画", "\x1\x93"}, + {"解", "\x1\x94"}, + {"開", "\x1\x95"}, + {"外", "\x1\x96"}, + {"害", "\x1\x97"}, + {"蓋", "\x1\x98"}, + {"完", "\x1\x99"}, + {"換", "\x1\x9a"}, + {"監", "\x1\x9b"}, + {"間", "\x1\x9c"}, + {"器", "\x1\x9d"}, + {"記", "\x1\x9e"}, + {"逆", "\x1\x9f"}, + {"救", "\x1\xa0"}, + {"金", "\x1\xa1"}, + {"空", "\x1\xa2"}, + {"掘", "\x1\xa3"}, + {"警", "\x1\xa4"}, + {"迎", "\x1\xa5"}, + {"撃", "\x1\xa6"}, + {"建", "\x1\xa7"}, + {"源", "\x1\xa8"}, + {"現", "\x1\xa9"}, + {"言", "\x1\xaa"}, + {"限", "\x1\xab"}, + {"個", "\x1\xac"}, + {"庫", "\x1\xad"}, + {"後", "\x1\xae"}, + {"語", "\x1\xaf"}, + {"護", "\x1\xb0"}, + {"交", "\x1\xb1"}, + {"功", "\x1\xb2"}, + {"向", "\x1\xb3"}, + {"工", "\x1\xb4"}, + {"攻", "\x1\xb5"}, + {"溝", "\x1\xb6"}, + {"行", "\x1\xb7"}, + {"鉱", "\x1\xb8"}, + {"降", "\x1\xb9"}, + {"合", "\x1\xba"}, + {"告", "\x1\xbb"}, + {"獄", "\x1\xbc"}, + {"彩", "\x1\xbd"}, + {"作", "\x1\xbe"}, + {"山", "\x1\xbf"}, + {"使", "\x1\xc0"}, + {"始", "\x1\xc1"}, + {"試", "\x1\xc2"}, + {"字", "\x1\xc3"}, + {"寺", "\x1\xc4"}, + {"時", "\x1\xc5"}, + {"示", "\x1\xc6"}, + {"自", "\x1\xc7"}, + {"式", "\x1\xc8"}, + {"矢", "\x1\xc9"}, + {"射", "\x1\xca"}, + {"者", "\x1\xcb"}, + {"守", "\x1\xcc"}, + {"手", "\x1\xcd"}, + {"終", "\x1\xce"}, + {"週", "\x1\xcf"}, + {"出", "\x1\xd0"}, + {"所", "\x1\xd1"}, + {"書", "\x1\xd2"}, + {"勝", "\x1\xd3"}, + {"章", "\x1\xd4"}, + {"上", "\x1\xd5"}, + {"乗", "\x1\xd6"}, + {"場", "\x1\xd7"}, + {"森", "\x1\xd8"}, + {"進", "\x1\xd9"}, + {"人", "\x1\xda"}, + {"水", "\x1\xdb"}, + {"数", "\x1\xdc"}, + {"制", "\x1\xdd"}, + {"性", "\x1\xde"}, + {"成", "\x1\xdf"}, + {"聖", "\x1\xe0"}, + {"石", "\x1\xe1"}, + {"跡", "\x1\xe2"}, + {"先", "\x1\xe3"}, + {"戦", "\x1\xe4"}, + {"船", "\x1\xe5"}, + {"選", "\x1\xe6"}, + {"走", "\x1\xe7"}, + {"送", "\x1\xe8"}, + {"像", "\x1\xe9"}, + {"造", "\x1\xea"}, + {"続", "\x1\xeb"}, + {"対", "\x1\xec"}, + {"袋", "\x1\xed"}, + {"台", "\x1\xee"}, + {"弾", "\x1\xef"}, + {"地", "\x1\xf0"}, + {"中", "\x1\xf1"}, + {"敵", "\x1\xf2"}, + {"転", "\x1\xf3"}, + {"電", "\x1\xf4"}, + {"塔", "\x1\xf5"}, + {"頭", "\x1\xf6"}, + {"動", "\x1\xf7"}, + {"内", "\x1\xf8"}, + {"日", "\x1\xf9"}, + {"入", "\x1\xfa"}, + {"年", "\x1\xfb"}, + {"能", "\x1\xfc"}, + {"廃", "\x1\xfd"}, + {"排", "\x1\xfe"}, + {"敗", "\x1\xff"}, + + {"発", "\x2\x10"}, + {"反", "\x2\x11"}, + {"必", "\x2\x12"}, + {"表", "\x2\x13"}, + {"武", "\x2\x14"}, + {"壁", "\x2\x15"}, + {"墓", "\x2\x16"}, + {"放", "\x2\x17"}, + {"方", "\x2\x18"}, + {"砲", "\x2\x19"}, + {"妨", "\x2\x1a"}, + {"北", "\x2\x1b"}, + {"本", "\x2\x1c"}, + {"幕", "\x2\x1d"}, + {"無", "\x2\x1e"}, + {"迷", "\x2\x1f"}, + {"面", "\x2\x20"}, + {"戻", "\x2\x21"}, + {"紋", "\x2\x22"}, + {"薬", "\x2\x23"}, + {"輸", "\x2\x24"}, + {"勇", "\x2\x25"}, + {"友", "\x2\x26"}, + {"遊", "\x2\x27"}, + {"容", "\x2\x28"}, + {"要", "\x2\x29"}, + {"利", "\x2\x2a"}, + {"了", "\x2\x2b"}, + {"量", "\x2\x2c"}, + {"力", "\x2\x2d"}, + {"練", "\x2\x2e"}, + {"連", "\x2\x2f"}, + {"録", "\x2\x30"}, + {"話", "\x2\x31"}, + {"墟", "\x2\x32"}, + {"脱", "\x2\x33"}, + // {"成", "\x2\x34"}, + {"旗", "\x2\x35"}, + {"破", "\x2\x36"}, + {"壊", "\x2\x37"}, + {"全", "\x2\x38"}, + {"滅", "\x2\x39"}, + {"機", "\x2\x3a"}, + {"仲", "\x2\x3b"}, + {"渓", "\x2\x3c"}, + {"谷", "\x2\x3d"}, + {"優", "\x2\x3e"}, + {"探", "\x2\x3f"}, + {"部", "\x2\x40"}, + {"索", "\x2\x41"}, + // {"乗", "\x2\x42"}, + {"前", "\x2\x43"}, + {"右", "\x2\x44"}, + {"左", "\x2\x45"}, + {"会", "\x2\x46"}, + {"高", "\x2\x47"}, + {"低", "\x2\x48"}, + {"押", "\x2\x49"}, + {"切", "\x2\x4a"}, + {"替", "\x2\x4b"}, + // {"対", "\x2\x4c"}, + {"秒", "\x2\x4d"}, + {"箱", "\x2\x4e"}, + {"泳", "\x2\x4f"}, + {"~", "\x2\x50"}, + + {"闇", "\x2\x56"}, + {"以", "\x2\x57"}, + {"屋", "\x2\x58"}, + {"俺", "\x2\x59"}, + {"化", "\x2\x5a"}, + {"界", "\x2\x5b"}, + {"感", "\x2\x5c"}, + {"気", "\x2\x5d"}, + {"却", "\x2\x5e"}, + {"曲", "\x2\x5f"}, + {"継", "\x2\x60"}, + {"権", "\x2\x61"}, + {"見", "\x2\x62"}, + {"古", "\x2\x63"}, + {"好", "\x2\x64"}, + // {"高", "\x2\x65"}, + {"才", "\x2\x66"}, + {"士", "\x2\x67"}, + {"子", "\x2\x68"}, + {"次", "\x2\x69"}, + {"主", "\x2\x6a"}, + {"種", "\x2\x6b"}, + {"讐", "\x2\x6c"}, + {"女", "\x2\x6d"}, + {"小", "\x2\x6e"}, + {"焼", "\x2\x6f"}, + {"証", "\x2\x70"}, + {"神", "\x2\x71"}, + {"身", "\x2\x72"}, + {"寸", "\x2\x73"}, + {"世", "\x2\x74"}, + {"想", "\x2\x75"}, + {"退", "\x2\x76"}, + {"第", "\x2\x77"}, + {"着", "\x2\x78"}, + {"天", "\x2\x79"}, + {"倒", "\x2\x7a"}, + {"到", "\x2\x7b"}, + {"突", "\x2\x7c"}, + {"爆", "\x2\x7d"}, + {"番", "\x2\x7e"}, + {"負", "\x2\x7f"}, + {"復", "\x2\x80"}, + {"物", "\x2\x81"}, + {"眠", "\x2\x82"}, + {"予", "\x2\x83"}, + {"用", "\x2\x84"}, + {"落", "\x2\x85"}, + {"緑", "\x2\x86"}, + + {"封", "\x2\x88"}, + {"印", "\x2\x89"}, + {"扉", "\x2\x8a"}, + {"最", "\x2\x8b"}, + {"刻", "\x2\x8c"}, + {"足", "\x2\x8d"}, +}; + +GameTextFontBank g_font_bank_jak3(GameTextVersion::JAK3, + &encode_info_jak3, + &replace_info_jak3, + &passthrus_jak3); diff --git a/common/util/font/dbs/font_db_jak3.h b/common/util/font/dbs/font_db_jak3.h new file mode 100644 index 0000000000..0a81844f1d --- /dev/null +++ b/common/util/font/dbs/font_db_jak3.h @@ -0,0 +1,14 @@ +#pragma once + +#include "common/util/font/font_utils.h" + +/*! + * ================================ + * GAME TEXT FONT BANK - JAK 3 + * ================================ + * This font is used in: + * - Jak 3 + */ +// TODO cyrillic +// TODO - current just using the jak 2 stuff (hopefully it's identical?) +extern GameTextFontBank g_font_bank_jak3; \ No newline at end of file diff --git a/common/util/font/font_utils.cpp b/common/util/font/font_utils.cpp new file mode 100644 index 0000000000..23fdeaa982 --- /dev/null +++ b/common/util/font/font_utils.cpp @@ -0,0 +1,365 @@ +/*! + * @file FontUtils.cpp + * + * Code for handling text and strings in Jak 1's "large font" format. + * + * MAKE SURE THIS FILE IS ENCODED IN UTF-8!!! The various strings here depend on it. + * Always verify the encoding if string detection suddenly goes awry. + */ + +#include "font_utils.h" + +#include +#include +#include + +#include "common/util/Assert.h" +#include "common/util/FileUtil.h" +#include "common/util/font/dbs/font_db_jak1.h" +#include "common/util/font/dbs/font_db_jak2.h" +#include "common/util/font/dbs/font_db_jak3.h" +#include "common/util/font/font_utils_korean.h" +#include "common/util/string_util.h" +#include "common/versions/versions.h" + +#include "fmt/format.h" + +void from_json(const json& j, KoreanLookupEntry& obj) { + json_deserialize_if_exists(defaultGlyph); + json_deserialize_if_exists(alternatives); +} + +std::map g_font_banks = { + {GameTextVersion::JAK1_V1, &g_font_bank_jak1_v1}, + {GameTextVersion::JAK1_V2, &g_font_bank_jak1_v2}, + {GameTextVersion::JAK2, &g_font_bank_jak2}, + {GameTextVersion::JAK3, &g_font_bank_jak3}}; + +const std::unordered_map sTextVerEnumMap = { + {"jak1-v1", GameTextVersion::JAK1_V1}, + {"jak1-v2", GameTextVersion::JAK1_V2}, + {"jak2", GameTextVersion::JAK2}, + {"jak3", GameTextVersion::JAK3}}; + +const std::string& get_text_version_name(GameTextVersion version) { + for (auto& [name, ver] : sTextVerEnumMap) { + if (ver == version) { + return name; + } + } + throw std::runtime_error(fmt::format("invalid text version {}", fmt::underlying(version))); +} + +GameTextVersion get_text_version_from_name(const std::string& name) { + return sTextVerEnumMap.at(name); +} + +GameTextFontBank::GameTextFontBank(GameTextVersion version, + std::vector* encode_info, + std::vector* replace_info, + std::unordered_set* passthrus) + : m_version(version), m_passthrus(passthrus) { + // Insert the encode and replacement info into a Trie, much faster lookups that way + for (const auto& encoding : *encode_info) { + m_encode_to_utf8_trie.insert(encoding.game_bytes, encoding); + m_encode_to_game_trie.insert(encoding.utf8, encoding); + } + for (const auto& replacement : *replace_info) { + m_replace_to_utf8_trie.insert(replacement.game_encoding, replacement); + m_replace_to_game_trie.insert(replacement.utf8_string, replacement); + } +} + +bool GameTextFontBank::is_language_id_korean(const int language_id) const { + if (m_version == GameTextVersion::JAK2 && language_id == 6) { + return true; + } else if (m_version == GameTextVersion::JAK3 && language_id == 7) { + return true; + } + return false; +} + +GameTextFontBank* get_font_bank(GameTextVersion version) { + return g_font_banks.at(version); +} + +GameTextFontBank* get_font_bank_from_game_version(GameVersion version) { + if (version == GameVersion::Jak1) { + // Jak 1 has been patched to use V2 + return get_font_bank(GameTextVersion::JAK1_V2); + } else if (version == GameVersion::Jak2) { + auto font_bank = get_font_bank(GameTextVersion::JAK2); + return font_bank; + } else if (version == GameVersion::Jak3) { + return get_font_bank(GameTextVersion::JAK3); + } else { + ASSERT_MSG(false, "Unsupported game for get_font_bank_from_game_version"); + } +} + +GameTextFontBank* get_font_bank(const std::string& name) { + if (auto it = sTextVerEnumMap.find(name); it == sTextVerEnumMap.end()) { + throw std::runtime_error(fmt::format("unknown text version {}", name)); + } else { + return get_font_bank(it->second); + } +} + +bool font_bank_exists(GameTextVersion version) { + return g_font_banks.find(version) != g_font_banks.cend(); +} + +std::string GameTextFontBank::replace_to_game(const std::string& str) const { + std::string newstr; + newstr.reserve(str.size()); + for (int i = 0; i < str.length();) { + const ReplaceInfo* remap = m_replace_to_game_trie.find_longest_prefix(str, i); + if (!remap) { + newstr.push_back(str[i]); + i += 1; + } else { + if (!remap->utf8_alternative.empty()) { + newstr.append(remap->utf8_alternative); + } else { + newstr.append(remap->game_encoding); + } + i += remap->utf8_string.size(); + } + } + return newstr; +} + +std::string GameTextFontBank::encode_utf8_to_game(const std::string& str) const { + std::string newstr; + newstr.reserve(str.size()); + for (int i = 0; i < str.length();) { + auto match = m_encode_to_game_trie.find_longest_prefix(str, i); + if (!match) { + newstr.push_back(str[i]); + i += 1; + } else { + for (auto b : match->game_bytes) { + newstr.push_back(b); + } + i += match->utf8.size(); + } + } + return newstr; +} + +/*! + * Turn a normal readable string into a string readable in the in-game font encoding and converts + * \cXX escape sequences + */ +std::string GameTextFontBank::convert_utf8_to_game(const std::string& str) const { + return encode_utf8_to_game(replace_to_game(str)); +} + +std::string GameTextFontBank::replace_to_utf8(const std::string& str) const { + std::string result; + result.reserve(str.size()); + for (size_t i = 0; i < str.size();) { + const ReplaceInfo* remap = m_replace_to_utf8_trie.find_longest_prefix(str, i); + if (!remap) { + result.push_back(str[i]); + i += 1; + } else { + result.append(remap->utf8_string); + i += remap->game_encoding.size(); + } + } + return result; +} + +bool GameTextFontBank::valid_char_range(const char& in) const { + if (m_version == GameTextVersion::JAK1_V1 || m_version == GameTextVersion::JAK1_V2) { + return ((in >= '0' && in <= '9') || (in >= 'A' && in <= 'Z') || + m_passthrus->find(in) != m_passthrus->end()) && + in != '\\'; + } else if (m_version == GameTextVersion::JAK2 || m_version == GameTextVersion::JAK3 || + m_version == GameTextVersion::JAKX) { + return ((in >= '0' && in <= '9') || (in >= 'A' && in <= 'Z') || (in >= 'a' && in <= 'z') || + m_passthrus->find(in) != m_passthrus->end()) && + in != '\\'; + } + return false; +} + +std::string GameTextFontBank::encode_game_to_utf8(const std::string& str) const { + std::string newstr; + newstr.reserve(str.size()); + for (size_t i = 0; i < str.size();) { + auto encoding = m_encode_to_utf8_trie.find_longest_prefix(str, i); + if (!encoding) { + // No match: copy valid characters as-is, or escape unknown bytes + unsigned char c = static_cast(str[i]); + if (valid_char_range(c) || c == '\n' || c == '\t' || c == '\\' || c == '"') { + newstr.push_back(c); + } else { + newstr += fmt::format("\\c{:02x}", c); + } + ++i; + } else { + // Found a match: append its UTF-8 sequence + newstr.append(encoding->utf8); + i += encoding->game_bytes.size(); // advance past matched game bytes + } + } + return newstr; +} + +std::string GameTextFontBank::convert_game_to_utf8(const char* in) const { + // Encode and apply replacement ONCE + std::string decoded = replace_to_utf8(encode_game_to_utf8(in)); + + // Escape special characters while writing directly into result + std::string result; + result.reserve(decoded.size()); + for (size_t i = 0; i < decoded.size(); ++i) { + char c = decoded[i]; + if (c == '\n') { + result += "\\n"; + } else if (c == '\t') { + result += "\\t"; + } else if (c == '\\') { + if (i < decoded.size() - 1 && decoded[i + 1] == 'c') { + result.push_back(c); // preserve \cXX + } else { + result += "\\\\"; + } + } else if (c == '"') { + result += "\\\""; + } else { + result.push_back(c); + } + } + + return result; +} + +std::string GameTextFontBank::convert_utf8_to_game_korean(const std::string& str) { + ASSERT_MSG(m_version == GameTextVersion::JAK2 || m_version == GameTextVersion::JAK3, + "Korean is not supported for any game other than Jak 2 and Jak 3 right now"); + if (!m_korean_db.has_value()) { + const auto db_file_path = + file_util::get_file_path({"game/assets/fonts/jak2_jak3_korean_db.json"}); + if (file_util::file_exists(db_file_path)) { + auto raw_data = file_util::read_text_file(db_file_path); + auto json_data = parse_commented_json(raw_data, "jak2_jak3_korean_db.json"); + std::unordered_map temp_db; + json_data.get_to(temp_db); + m_korean_db = temp_db; + } + } + + std::string output; + output.reserve(str.size()); + std::string non_korean_buffer = ""; + size_t i = 0; + while (i < str.size()) { + char32_t cp = str_util::next_utf8_char(str, i); + if (font_util_korean::is_korean_syllable(cp)) { + // flush any non-korean buffer + if (!non_korean_buffer.empty()) { + output += 0x3; + // encode / remap it + output += encode_utf8_to_game(replace_to_game(non_korean_buffer)); + non_korean_buffer = ""; + } + // write out the korean character + output += font_util_korean::game_encode_korean_syllable(str, cp, m_korean_db.value()); + } else { + non_korean_buffer += str_util::utf8_encode(cp); + } + } + // flush any non-korean buffer + if (!non_korean_buffer.empty()) { + output += 0x3; + // encode / remap it + output += encode_utf8_to_game(replace_to_game(non_korean_buffer)); + non_korean_buffer = ""; + } + return output; +} + +std::string GameTextFontBank::convert_korean_game_to_utf8(const char* in) const { + ASSERT_MSG(m_version == GameTextVersion::JAK2 || m_version == GameTextVersion::JAK3, + "Korean is not supported for any game other than Jak 2 and Jak 3 right now"); + // Korean strings are fully bitstrings, in other words, it's just a bunch of bytes + // Some info on the layout: + // - Every korean syllable block starts with a `4` + // - The following byte indicates how many glyphs are drawn for that syllable block + // - Each jamo that makes up the syllable block follows as a single byte + // - Unless the jamo is part of the "extra" texture page, in which case it's preceeded by a `5`. + // There are very few jamo that are and they are only applicable for the final consonant + // - The korean strings can contain non-korean characters. These are preceeded by a `3` + // - For example a space would be `3 20` + // - It might be more accurate to say that a 3 signifies "consume characters as normal until + // something else is encountered (ie. flags or more complex font encodings)" + std::string result; + std::string_view str(in); + + u64 index = 0; + u8 curr_byte = 0; + bool in_syllable_block = false; + std::string jamo_buffer = ""; + std::string non_korean_buffer = ""; + int num_syllable_glyphs = 0; + while (index < str.length()) { + curr_byte = str.at(index); + // new syllable block + if (curr_byte == 4) { + in_syllable_block = true; + if (index + 1 < str.length()) { + num_syllable_glyphs = str.at(index + 1); + index++; + } + index++; + // flush any non-korean characters + if (!non_korean_buffer.empty()) { + // handle remap + std::string remapped_str = replace_to_utf8(encode_game_to_utf8(non_korean_buffer)); + result += remapped_str; + non_korean_buffer = ""; + } + continue; + } + if (in_syllable_block) { + // extra page + std::string glyph_key; + u8 hex_byte = curr_byte; + if (curr_byte == 5 && index + 1 < str.length()) { + hex_byte = str.at(index + 1); + glyph_key = fmt::format("extra_0x{:02x}", hex_byte); + index++; + } else { + glyph_key = fmt::format("0x{:02x}", hex_byte); + } + const auto jamo_list = jamo_glyph_mappings_jak2.find(glyph_key); + ASSERT_MSG(jamo_list != jamo_glyph_mappings_jak2.end(), + fmt::format("{} not found in jamo glyph lookup table", glyph_key)); + for (const auto& jamo : jamo_list->second) { + jamo_buffer += jamo; + } + num_syllable_glyphs--; + if (num_syllable_glyphs == 0) { + in_syllable_block = false; + result += font_util_korean::compose_korean_containing_text(jamo_buffer); + jamo_buffer = ""; + } + } else { + if (curr_byte != 0x3) { + non_korean_buffer.push_back(curr_byte); + } + } + index++; + } + // flush any non-korean characters + if (!non_korean_buffer.empty()) { + // handle remap + std::string remapped_str = replace_to_utf8(encode_game_to_utf8(non_korean_buffer)); + result += remapped_str; + non_korean_buffer = ""; + } + return result; +} diff --git a/common/util/FontUtils.h b/common/util/font/font_utils.h similarity index 51% rename from common/util/FontUtils.h rename to common/util/font/font_utils.h index 5aa1627a22..a6934b1c5e 100644 --- a/common/util/FontUtils.h +++ b/common/util/font/font_utils.h @@ -1,23 +1,40 @@ #pragma once -/*! - * @file FontUtils.h - * - * Code for handling text and strings in Jak 1's "large font" format. - * - * MAKE SURE THIS FILE IS ENCODED IN UTF-8!!! The various strings here depend on it. - * Always verify the encoding if string detection suddenly goes awry. - */ - #include +#include #include #include #include #include #include "common/common_types.h" +#include "common/util/Trie.h" +#include "common/util/font/font_utils_korean.h" +#include "common/util/json_util.h" #include "common/versions/versions.h" +/*! + * What bytes a set of characters (UTF-8) correspond to. You can convert to and fro. + */ +struct EncodeInfo { + std::string utf8; + std::string game_bytes; +}; + +/*! + * Replace an unconventional string of characters with/from something more readable. + * For example, turns Ñ into N + ~ + a bunch of modifiers. + */ +struct ReplaceInfo { + std::string game_encoding; + std::string utf8_string; + // for some replacements, we want to replace with something different when going from utf8 than + // when we originally matched it this is mostly applicable for when we have to max a string with + // hex chars that have been converted into `\c00` format but we want to insert the actual raw hex + // bytes back. + std::string utf8_alternative = ""; +}; + // version of the game text file's text encoding. Not real, but we need to differentiate them // somehow, since the encoding changes. enum class GameTextVersion { @@ -28,44 +45,26 @@ enum class GameTextVersion { JAKX = 40 // jak x }; -extern const std::unordered_map sTextVerEnumMap; - -const std::string& get_text_version_name(GameTextVersion version); -GameTextVersion get_text_version_from_name(const std::string& name); - -/*! - * What bytes a set of characters (UTF-8) correspond to. You can convert to and fro. - */ -struct EncodeInfo { - std::string chars; - std::vector bytes; -}; -/*! - * Replace an unconventional string of characters with/from something more readable. - * For example, turns Ñ into N + ~ + a bunch of modifiers. - */ -struct ReplaceInfo { - std::string from; - std::string to; -}; - /*! * All the information to convert UTF-8 text into game text. */ class GameTextFontBank { GameTextVersion m_version; // the version of the game text. we determine this ourselves. - std::vector* m_encode_info; - std::vector* m_replace_info; + + Trie m_encode_to_utf8_trie; + Trie m_encode_to_game_trie; + Trie m_replace_to_utf8_trie; + Trie m_replace_to_game_trie; + std::unordered_set* m_passthrus; + // jamo=>6 orientations with their drawing info + std::optional> m_korean_db = + std::nullopt; - const EncodeInfo* find_encode_to_utf8(const char* in) const; - const EncodeInfo* find_encode_to_game(const std::string& in, int off = 0) const; - const ReplaceInfo* find_replace_to_utf8(const std::string& in, int off = 0) const; - const ReplaceInfo* find_replace_to_game(const std::string& in, int off = 0) const; - - std::string replace_to_utf8(std::string& str) const; - std::string replace_to_game(std::string& str) const; - std::string encode_utf8_to_game(std::string& str) const; + std::string replace_to_utf8(const std::string& str) const; + std::string replace_to_game(const std::string& str) const; + std::string encode_utf8_to_game(const std::string& str) const; + std::string encode_game_to_utf8(const std::string& str) const; public: GameTextFontBank(GameTextVersion version, @@ -73,26 +72,34 @@ class GameTextFontBank { std::vector* replace_info, std::unordered_set* passthrus); - const std::vector* encode_info() const { return m_encode_info; } - const std::vector* replace_info() const { return m_replace_info; } const std::unordered_set* passthrus() const { return m_passthrus; } GameTextVersion version() const { return m_version; } // TODO - methods would help make this code a lot better for different game versions // hacking it for now - bool valid_char_range(const char in) const; + bool valid_char_range(const char& in) const; + bool is_language_id_korean(const int language_id) const; - std::string convert_utf8_to_game(std::string str, bool escape = false) const; + std::string convert_utf8_to_game(const std::string& str) const; std::string convert_game_to_utf8(const char* in) const; + + std::string convert_utf8_to_game_korean(const std::string& str); + std::string convert_korean_game_to_utf8(const char* in) const; }; -extern GameTextFontBank g_font_bank_jak1_v1; -extern GameTextFontBank g_font_bank_jak1_v2; -extern GameTextFontBank g_font_bank_jak2; -extern std::map g_font_banks; +extern const std::unordered_map sTextVerEnumMap; +const std::string& get_text_version_name(GameTextVersion version); +GameTextVersion get_text_version_from_name(const std::string& name); -const GameTextFontBank* get_font_bank(GameTextVersion version); -const GameTextFontBank* get_font_bank_from_game_version(GameVersion version); -const GameTextFontBank* get_font_bank(const std::string& name); +/*! + * ======================== + * GAME TEXT FONT BANK LIST + * ======================== + * The list of available font banks and a couple of helper functions. + */ +extern std::map g_font_banks; +GameTextFontBank* get_font_bank(GameTextVersion version); +GameTextFontBank* get_font_bank_from_game_version(GameVersion version); +GameTextFontBank* get_font_bank(const std::string& name); bool font_bank_exists(GameTextVersion version); diff --git a/common/util/font/font_utils_korean.cpp b/common/util/font/font_utils_korean.cpp new file mode 100644 index 0000000000..6f7ef4ea19 --- /dev/null +++ b/common/util/font/font_utils_korean.cpp @@ -0,0 +1,403 @@ +/* + MIT License + + Copyright (c) 2017 Jonghwan Hyeon + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + + https://github.com/jonghwanhyeon/hangul-jamo/blob/main/LICENSE + + Code converted to C++ and deals with UTF-8 input +*/ + +#include "font_utils_korean.h" + +#include +#include +#include +#include + +#include "common/log/log.h" +#include "common/util/Assert.h" +#include "common/util/string_util.h" + +#include "fmt/format.h" + +// +// Reference: http://www.unicode.org/versions/Unicode8.0.0/ch03.pdf#G24646 +// + +const int BASE_OF_SYLLABLES = 0xAC00; + +const int BASE_OF_LEADING_CONSONANTS = 0x1100; +const int BASE_OF_VOWELS = 0x1161; +// One less than the beginning of the range of trailing consonants (0x11A8) +const int BASE_OF_TRAILING_CONSONANTS = 0x11A7; + +const int NUMBER_OF_LEADING_CONSONANTS = 19; +const int NUMBER_OF_VOWELS = 21; +// One more than the number of trailing consonants +const int NUMBER_OF_TRAILING_CONSONANTS = 28; + +const int NUMBER_OF_SYLLABLES_FOR_EACH_LEADING_CONSONANT = + NUMBER_OF_VOWELS * NUMBER_OF_TRAILING_CONSONANTS; +const int NUMBER_OF_SYLLABLES = + NUMBER_OF_LEADING_CONSONANTS * NUMBER_OF_SYLLABLES_FOR_EACH_LEADING_CONSONANT; + +// TODO - fix all of these, these generated wrong +const std::vector LEADING_CONSONANTS = {"ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ", "ㄹ", "ㅁ", + "ㅂ", "ㅃ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅉ", + "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"}; + +const std::unordered_map INDEX_BY_LEADING_CONSONANT = []() { + std::unordered_map m; + for (size_t i = 0; i < LEADING_CONSONANTS.size(); ++i) { + m[LEADING_CONSONANTS[i]] = static_cast(i); + } + return m; +}(); + +const std::vector VOWELS = {"ㅏ", "ㅐ", "ㅑ", "ㅒ", "ㅓ", "ㅔ", "ㅕ", + "ㅖ", "ㅗ", "ㅘ", "ㅙ", "ㅚ", "ㅛ", "ㅜ", + "ㅝ", "ㅞ", "ㅟ", "ㅠ", "ㅡ", "ㅢ", "ㅣ"}; + +const std::unordered_map INDEX_BY_VOWEL = []() { + std::unordered_map m; + for (size_t i = 0; i < VOWELS.size(); ++i) { + m[VOWELS[i]] = static_cast(i); + } + return m; +}(); + +const std::vector TRAILING_CONSONANTS = { + "", "ᆨ", "ᆩ", "ᆪ", "ᆫ", "ᆬ", "ᆭ", "ᆮ", "ᆯ", "ᆯ", "ᆱ", "ㄼ", "ㄽ", "ㄾ", + "ㄿ", "ㅀ", "ᆷ", "ᆸ", "ㅄ", "ᆺ", "ᆻ", "ᆼ", "ᆽ", "ᆾ", "ᆿ", "ᇀ", "ᇁ", "ᇂ"}; + +const std::unordered_map INDEX_BY_TRAILING_CONSONANT = []() { + std::unordered_map m; + for (size_t i = 0; i < TRAILING_CONSONANTS.size(); ++i) { + m[TRAILING_CONSONANTS[i]] = static_cast(i); + } + return m; +}(); + +bool font_util_korean::is_korean_syllable(char32_t syllable) { + int index_of_syllable = syllable - BASE_OF_SYLLABLES; + return 0 <= index_of_syllable && index_of_syllable < NUMBER_OF_SYLLABLES; +} + +inline bool is_jamo_character(const std::string& character) { + return (std::find(LEADING_CONSONANTS.begin(), LEADING_CONSONANTS.end(), character) != + LEADING_CONSONANTS.end()) || + (std::find(VOWELS.begin(), VOWELS.end(), character) != VOWELS.end()) || + (std::find(TRAILING_CONSONANTS.begin(), TRAILING_CONSONANTS.end(), character) != + TRAILING_CONSONANTS.end()); +} + +inline std::string codepoint_to_utf8(char32_t cp) { + std::string result; + if (cp <= 0x7F) { + result += static_cast(cp); + } else if (cp <= 0x7FF) { + result += static_cast(0xC0 | ((cp >> 6) & 0x1F)); + result += static_cast(0x80 | (cp & 0x3F)); + } else if (cp <= 0xFFFF) { + result += static_cast(0xE0 | ((cp >> 12) & 0x0F)); + result += static_cast(0x80 | ((cp >> 6) & 0x3F)); + result += static_cast(0x80 | (cp & 0x3F)); + } else if (cp <= 0x10FFFF) { + result += static_cast(0xF0 | ((cp >> 18) & 0x07)); + result += static_cast(0x80 | ((cp >> 12) & 0x3F)); + result += static_cast(0x80 | ((cp >> 6) & 0x3F)); + result += static_cast(0x80 | (cp & 0x3F)); + } + return result; +} + +inline std::string compose_jamo_characters(const std::string& leading_consonant, + const std::string& vowel, + const std::optional& trailing_consonant) { + const int index_of_leading_consonant = INDEX_BY_LEADING_CONSONANT.at(leading_consonant) * + NUMBER_OF_SYLLABLES_FOR_EACH_LEADING_CONSONANT; + const int index_of_vowel = INDEX_BY_VOWEL.at(vowel) * NUMBER_OF_TRAILING_CONSONANTS; + const int index_of_leading_consonant_and_vowel = index_of_leading_consonant + index_of_vowel; + + int index_of_trailing = trailing_consonant.has_value() + ? INDEX_BY_TRAILING_CONSONANT.at(trailing_consonant.value()) + : 0; + int index_of_syllable = index_of_leading_consonant_and_vowel + index_of_trailing; + + return codepoint_to_utf8(BASE_OF_SYLLABLES + index_of_syllable); +} + +std::vector utf8_to_codepoints(const std::string& text) { + std::vector codepoints; + size_t i = 0; + while (i < text.size()) { + char32_t cp = 0; + unsigned char c = text[i]; + if (c < 0x80) { + cp = c; + ++i; + } else if ((c >> 5) == 0x6) { + cp = ((c & 0x1F) << 6) | (text[i + 1] & 0x3F); + i += 2; + } else if ((c >> 4) == 0xE) { + cp = ((c & 0x0F) << 12) | ((text[i + 1] & 0x3F) << 6) | (text[i + 2] & 0x3F); + i += 3; + } else if ((c >> 3) == 0x1E) { + cp = ((c & 0x07) << 18) | ((text[i + 1] & 0x3F) << 12) | ((text[i + 2] & 0x3F) << 6) | + (text[i + 3] & 0x3F); + i += 4; + } else { + ++i; + } + codepoints.push_back(cp); + } + return codepoints; +} + +bool is_leading(char32_t c) { + // Replace with actual lookup (e.g. return LEADING_CONSONANTS.count(c) > 0;) + return (c >= 0x1100 && c <= 0x1112); +} + +bool is_vowel(char32_t c) { + return (c >= 0x1161 && c <= 0x1175); +} + +bool is_trailing(char32_t c) { + return (c >= 0x11A8 && c <= 0x11C2); +} + +// Compose jamo into a syllable block +char32_t compose_jamo(char32_t lead, char32_t vowel, std::optional trail = std::nullopt) { + char32_t l_index = lead - 0x1100; + char32_t v_index = vowel - 0x1161; + char32_t t_index = trail ? (*trail - 0x11A7) : 0; + return 0xAC00 + (l_index * 21 * 28) + (v_index * 28) + t_index; +} + +std::string font_util_korean::compose_korean_containing_text(const std::string& text) { + std::string output; + std::vector cps = utf8_to_codepoints(text); + + size_t i = 0; + while (i < cps.size()) { + char32_t first = cps[i]; + char32_t second = (i + 1 < cps.size()) ? cps[i + 1] : 0; + char32_t third = (i + 2 < cps.size()) ? cps[i + 2] : 0; + char32_t fourth = (i + 3 < cps.size()) ? cps[i + 3] : 0; + if (is_leading(first) && is_vowel(second) && is_leading(third) && is_vowel(fourth)) { + char32_t syllable = compose_jamo(first, second); + output += codepoint_to_utf8(syllable); + i += 2; // consume 2 codepoints + } else if (is_leading(first) && is_vowel(second) && is_trailing(third)) { + char32_t syllable = compose_jamo(first, second, third); + output += codepoint_to_utf8(syllable); + i += 3; // consume 3 codepoints + } else if (is_leading(first) && is_vowel(second)) { + char32_t syllable = compose_jamo(first, second); + output += codepoint_to_utf8(syllable); + i += 2; // consume 2 codepoints + } else { + output += codepoint_to_utf8(first); + i += 1; + } + } + + return output; +} + +// std::string font_util_korean::decompose_korean_containing_text(const std::string& text) { +// std::string output; +// size_t i = 0; +// while (i < text.size()) { +// char32_t cp = next_utf8_char(text, i); + +// if (is_syllable(cp)) { +// // Decompose Hangul syllable block into jamo +// char32_t SIndex = cp - 0xAC00; +// char32_t L = 0x1100 + SIndex / (21 * 28); +// char32_t V = 0x1161 + (SIndex % (21 * 28)) / 28; +// char32_t T = 0x11A7 + (SIndex % 28); + +// output += codepoint_to_utf8(L); +// output += codepoint_to_utf8(V); +// if (T != 0x11A7) { // has final consonant +// output += codepoint_to_utf8(T); +// } +// } else { +// // For other characters, re-encode as-is +// output += codepoint_to_utf8(cp); +// } +// } +// return output; +// } + +bool is_median_vowel_vertical(char32_t vowel) { + if ((vowel >= 0x1161 && vowel <= 0x1168) || vowel == 0x1175) { + return true; + } + return false; +} + +bool is_median_vowel_horizontal(char32_t vowel) { + if (vowel == 0x1169 || (vowel >= 0x116D && vowel <= 0x116E) || + (vowel >= 0x1172 && vowel <= 0x1173)) { + return true; + } + return false; +} + +bool is_median_vowel_combined(char32_t vowel) { + if (vowel >= 0x1161 && vowel <= 0x1175 && !is_median_vowel_vertical(vowel) && + !is_median_vowel_horizontal(vowel)) { + return true; + } + return false; +} + +std::string glyph_hex_string_to_int(const std::string& str) { + try { + std::string result; + if (str_util::starts_with(str, "extra_")) { + // handle glyphs on the secondary texture page + result += 0x5; + std::string temp = str; + str_util::replace(temp, "extra_", ""); + result += std::stoi(temp, nullptr, 0); + } else { + result += std::stoi(str, nullptr, 0); + } + return result; + } catch (std::exception& e) { + lg::error("Unable to convert hex_string_to_int: {}", str); + throw; + } +} + +std::string font_util_korean::game_encode_korean_syllable( + const std::string& context, + const char32_t cp, + const std::unordered_map& db) { + std::string output; + // Decompose Hangul syllable block into jamo + char32_t syllable_index = cp - BASE_OF_SYLLABLES; + char32_t initial = BASE_OF_LEADING_CONSONANTS + syllable_index / (21 * 28); + char32_t median = BASE_OF_VOWELS + (syllable_index % (21 * 28)) / 28; + char32_t final = BASE_OF_TRAILING_CONSONANTS + (syllable_index % 28); + + bool final_present = final != BASE_OF_TRAILING_CONSONANTS; + int orientation = -1; + // Figure out which orientation we are dealing with + if (!final_present) { + // orientations 0 - 2 + if (is_median_vowel_vertical(median)) { + orientation = 0; + } else if (is_median_vowel_horizontal(median)) { + orientation = 1; + } else if (is_median_vowel_combined(median)) { + orientation = 2; + } + } else { + // orientations 3 - 5 + if (is_median_vowel_vertical(median)) { + orientation = 3; + } else if (is_median_vowel_horizontal(median)) { + orientation = 4; + } else if (is_median_vowel_combined(median)) { + orientation = 5; + } + } + ASSERT_MSG(orientation != -1, + fmt::format("Unable to deduce drawing orientation for korean syllable block in '{}'", + context)); + + // now that we know the orientation, we can consult our lookup database to get the glyphs to + // use for all the involved jamo + // + // convert each jamo to utf-8 bytes since that is what our DB is encoded with. + // - first see if the jamo has an alternative drawing glyph, if not, use the default + // + // the order the glyphs are drawn in does not matter, as they all overlap anyway. + std::vector glyphs_to_draw = {}; + const auto initial_utf8 = codepoint_to_utf8(initial); + const auto median_utf8 = codepoint_to_utf8(median); + if (final == BASE_OF_TRAILING_CONSONANTS) { // no final consonant + const auto initial_alt_lookup_key = fmt::format(",{}", median_utf8); + const auto& initial_alts = db.at(initial_utf8).at(orientation).alternatives; + if (initial_alts.contains(initial_alt_lookup_key)) { + glyphs_to_draw.push_back(glyph_hex_string_to_int(initial_alts.at(initial_alt_lookup_key))); + } else { + glyphs_to_draw.push_back( + glyph_hex_string_to_int(db.at(initial_utf8).at(orientation).defaultGlyph)); + } + const auto median_alt_lookup_key = fmt::format("{},", initial_utf8); + const auto& median_alts = db.at(median_utf8).at(orientation).alternatives; + if (median_alts.contains(median_alt_lookup_key)) { + glyphs_to_draw.push_back(glyph_hex_string_to_int(median_alts.at(median_alt_lookup_key))); + } else { + glyphs_to_draw.push_back( + glyph_hex_string_to_int(db.at(median_utf8).at(orientation).defaultGlyph)); + } + } else { + const auto final_utf8 = codepoint_to_utf8(final); + const auto initial_alt_lookup_key = fmt::format(",{},{}", median_utf8, final_utf8); + const auto& initial_alts = db.at(initial_utf8).at(orientation).alternatives; + if (initial_alts.contains(initial_alt_lookup_key)) { + glyphs_to_draw.push_back(glyph_hex_string_to_int(initial_alts.at(initial_alt_lookup_key))); + } else { + glyphs_to_draw.push_back( + glyph_hex_string_to_int(db.at(initial_utf8).at(orientation).defaultGlyph)); + } + const auto median_alt_lookup_key = fmt::format("{},,{}", initial_utf8, final_utf8); + const auto& median_alts = db.at(median_utf8).at(orientation).alternatives; + if (median_alts.contains(median_alt_lookup_key)) { + glyphs_to_draw.push_back(glyph_hex_string_to_int(median_alts.at(median_alt_lookup_key))); + } else { + glyphs_to_draw.push_back( + glyph_hex_string_to_int(db.at(median_utf8).at(orientation).defaultGlyph)); + } + const auto final_alt_lookup_key = fmt::format("{},{},", initial_utf8, median_utf8); + const auto& final_alts = db.at(final_utf8).at(orientation).alternatives; + if (final_alts.contains(final_alt_lookup_key)) { + glyphs_to_draw.push_back(glyph_hex_string_to_int(final_alts.at(final_alt_lookup_key))); + } else { + glyphs_to_draw.push_back( + glyph_hex_string_to_int(db.at(final_utf8).at(orientation).defaultGlyph)); + } + } + + // Get rid of any duplicates in the glyphs + std::vector final_glyphs_to_draw = {}; + for (const auto& glyph : glyphs_to_draw) { + if (std::find(final_glyphs_to_draw.begin(), final_glyphs_to_draw.end(), glyph) == + final_glyphs_to_draw.end()) { + final_glyphs_to_draw.push_back(glyph); + } + } + + output += 0x4; + output += final_glyphs_to_draw.size(); + for (const auto& glyph : final_glyphs_to_draw) { + output += glyph; + } + return output; +} diff --git a/common/util/font/font_utils_korean.h b/common/util/font/font_utils_korean.h new file mode 100644 index 0000000000..7eefd9e549 --- /dev/null +++ b/common/util/font/font_utils_korean.h @@ -0,0 +1,54 @@ +/* + MIT License + + Copyright (c) 2017 Jonghwan Hyeon + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + + https://github.com/jonghwanhyeon/hangul-jamo/blob/main/LICENSE + + Code converted to C++ +*/ + +#pragma once + +#include + +#include "common/util/json_util.h" + +struct KoreanLookupEntry { + // glyph to use if no relevant alternative exists + std::string defaultGlyph; + // context=>glyph + // ie. ",\u1166" + // when wanting to draw a specific jamo, it's spot is indicated by the + std::unordered_map alternatives; +}; +void from_json(const json& j, KoreanLookupEntry& obj); + +typedef std::vector KoreanLookupOrientations; + +namespace font_util_korean { +bool is_korean_syllable(char32_t syllable); +std::string compose_korean_containing_text(const std::string& text); +std::string game_encode_korean_syllable( + const std::string& context, + const char32_t cp, + const std::unordered_map& db); +}; // namespace font_util_korean diff --git a/common/util/string_util.cpp b/common/util/string_util.cpp index b4fd766121..0ac67ed900 100644 --- a/common/util/string_util.cpp +++ b/common/util/string_util.cpp @@ -254,4 +254,47 @@ std::string pad_right(const std::string& input, const int width, const char padd return input + std::string(padding_width, padding_char); } } + +char32_t next_utf8_char(const std::string& s, size_t& i) { + char32_t cp = 0; + unsigned char c = s[i]; + if (c < 0x80) { // 1-byte ASCII + cp = c; + ++i; + } else if ((c >> 5) == 0x6) { // 2-byte + cp = ((c & 0x1F) << 6) | (s[i + 1] & 0x3F); + i += 2; + } else if ((c >> 4) == 0xE) { // 3-byte + cp = ((c & 0x0F) << 12) | ((s[i + 1] & 0x3F) << 6) | (s[i + 2] & 0x3F); + i += 3; + } else if ((c >> 3) == 0x1E) { // 4-byte + cp = ((c & 0x07) << 18) | ((s[i + 1] & 0x3F) << 12) | ((s[i + 2] & 0x3F) << 6) | + (s[i + 3] & 0x3F); + i += 4; + } else { + // invalid + ++i; + } + return cp; +} + +std::string utf8_encode(char32_t cp) { + std::string out; + if (cp <= 0x7F) { + out += static_cast(cp); + } else if (cp <= 0x7FF) { + out += static_cast(0xC0 | ((cp >> 6) & 0x1F)); + out += static_cast(0x80 | (cp & 0x3F)); + } else if (cp <= 0xFFFF) { + out += static_cast(0xE0 | ((cp >> 12) & 0x0F)); + out += static_cast(0x80 | ((cp >> 6) & 0x3F)); + out += static_cast(0x80 | (cp & 0x3F)); + } else if (cp <= 0x10FFFF) { + out += static_cast(0xF0 | ((cp >> 18) & 0x07)); + out += static_cast(0x80 | ((cp >> 12) & 0x3F)); + out += static_cast(0x80 | ((cp >> 6) & 0x3F)); + out += static_cast(0x80 | (cp & 0x3F)); + } + return out; +} } // namespace str_util diff --git a/common/util/string_util.h b/common/util/string_util.h index 6b321411d0..4e3567989b 100644 --- a/common/util/string_util.h +++ b/common/util/string_util.h @@ -36,4 +36,6 @@ std::string to_lower(const std::string& str); bool hex_char(char c); std::string titlize(const std::string& str); std::string pad_right(const std::string& input, const int width, const char padding_char); +char32_t next_utf8_char(const std::string& s, size_t& i); +std::string utf8_encode(char32_t cp); } // namespace str_util diff --git a/decompiler/data/game_subs.h b/decompiler/data/game_subs.h index 3d9f0c3c8c..91a06d06f2 100644 --- a/decompiler/data/game_subs.h +++ b/decompiler/data/game_subs.h @@ -6,7 +6,7 @@ #include #include "common/util/FileUtil.h" -#include "common/util/FontUtils.h" +#include "common/util/font/font_utils.h" namespace decompiler { struct ObjectFileData; diff --git a/decompiler/data/game_text.cpp b/decompiler/data/game_text.cpp index 1407dcb641..4c97e2b278 100644 --- a/decompiler/data/game_text.cpp +++ b/decompiler/data/game_text.cpp @@ -9,7 +9,8 @@ #include "common/goos/Reader.h" #include "common/util/BitUtils.h" -#include "common/util/FontUtils.h" +#include "common/util/font/font_utils.h" +#include "common/util/font/font_utils_korean.h" #include "common/util/print_float.h" #include "decompiler/ObjectFile/ObjectFileDB.h" @@ -113,7 +114,10 @@ GameTextResult process_game_text(ObjectFileData& data, GameTextVersion version) } // escape characters - if (font_bank_exists(version)) { + if (get_font_bank(version)->is_language_id_korean(language)) { + // If we are doing korean, we process it differently + result.text[text_id] = get_font_bank(version)->convert_korean_game_to_utf8(text.c_str()); + } else if (font_bank_exists(version)) { result.text[text_id] = get_font_bank(version)->convert_game_to_utf8(text.c_str()); } else { result.text[text_id] = goos::get_readable_string(text.c_str()); // HACK! diff --git a/decompiler/data/game_text.h b/decompiler/data/game_text.h index a1b73458f2..c0d883b06e 100644 --- a/decompiler/data/game_text.h +++ b/decompiler/data/game_text.h @@ -2,7 +2,7 @@ #include #include -#include "common/util/FontUtils.h" +#include "common/util/font/font_utils.h" namespace decompiler { struct ObjectFileData; diff --git a/game/assets/fonts/jak2_jak3_korean_db.json b/game/assets/fonts/jak2_jak3_korean_db.json new file mode 100644 index 0000000000..47240aa621 --- /dev/null +++ b/game/assets/fonts/jak2_jak3_korean_db.json @@ -0,0 +1,11014 @@ +{ + "\u1100": [ + { + "defaultGlyph": "0x06", + "alternatives": { + ",\u1166": "0x33", + ",\u1168": "0x33", + ",\u1162": "0x33", + ",\u1164": "0x33" + } + }, + { + "defaultGlyph": "0x5e", + "alternatives": {} + }, + { + "defaultGlyph": "0x8b", + "alternatives": { + ",\u116b": "0xb3" + } + }, + { + "defaultGlyph": "0x06", + "alternatives": { + ",\u1166,\u11bb": "0x33", + ",\u1166,\u11b7": "0x33", + ",\u1166,\u11ba": "0x33", + ",\u1166,\u11ab": "0x33", + ",\u1164,\u11a8": "0x33", + ",\u1164,\u11a9": "0x33", + ",\u1164,\u11aa": "0x33", + ",\u1164,\u11ab": "0x33", + ",\u1164,\u11ac": "0x33", + ",\u1164,\u11ad": "0x33", + ",\u1164,\u11ae": "0x33", + ",\u1164,\u11af": "0x33", + ",\u1164,\u11b0": "0x33", + ",\u1164,\u11b1": "0x33", + ",\u1164,\u11b2": "0x33", + ",\u1164,\u11b3": "0x33", + ",\u1164,\u11b4": "0x33", + ",\u1164,\u11b5": "0x33", + ",\u1164,\u11b6": "0x33", + ",\u1164,\u11b7": "0x33", + ",\u1164,\u11b8": "0x33", + ",\u1164,\u11b9": "0x33", + ",\u1164,\u11ba": "0x33", + ",\u1164,\u11bb": "0x33", + ",\u1164,\u11bc": "0x33", + ",\u1164,\u11bd": "0x33", + ",\u1164,\u11be": "0x33", + ",\u1164,\u11bf": "0x33", + ",\u1164,\u11c0": "0x33", + ",\u1164,\u11c1": "0x33", + ",\u1164,\u11c2": "0x33", + ",\u1166,\u11a8": "0x33", + ",\u1166,\u11a9": "0x33", + ",\u1166,\u11aa": "0x33", + ",\u1166,\u11ac": "0x33", + ",\u1166,\u11ad": "0x33", + ",\u1166,\u11ae": "0x33", + ",\u1166,\u11af": "0x33", + ",\u1166,\u11b0": "0x33", + ",\u1166,\u11b1": "0x33", + ",\u1166,\u11b2": "0x33", + ",\u1166,\u11b3": "0x33", + ",\u1166,\u11b4": "0x33", + ",\u1166,\u11b5": "0x33", + ",\u1166,\u11b6": "0x33", + ",\u1166,\u11b8": "0x33", + ",\u1166,\u11b9": "0x33", + ",\u1166,\u11bc": "0x33", + ",\u1166,\u11bd": "0x33", + ",\u1166,\u11be": "0x33", + ",\u1166,\u11bf": "0x33", + ",\u1166,\u11c0": "0x33", + ",\u1166,\u11c1": "0x33", + ",\u1166,\u11c2": "0x33", + ",\u1168,\u11a8": "0x33", + ",\u1168,\u11a9": "0x33", + ",\u1168,\u11aa": "0x33", + ",\u1168,\u11ab": "0x33", + ",\u1168,\u11ac": "0x33", + ",\u1168,\u11ad": "0x33", + ",\u1168,\u11ae": "0x33", + ",\u1168,\u11af": "0x33", + ",\u1168,\u11b0": "0x33", + ",\u1168,\u11b1": "0x33", + ",\u1168,\u11b2": "0x33", + ",\u1168,\u11b3": "0x33", + ",\u1168,\u11b4": "0x33", + ",\u1168,\u11b5": "0x33", + ",\u1168,\u11b6": "0x33", + ",\u1168,\u11b7": "0x33", + ",\u1168,\u11b8": "0x33", + ",\u1168,\u11b9": "0x33", + ",\u1168,\u11ba": "0x33", + ",\u1168,\u11bb": "0x33", + ",\u1168,\u11bc": "0x33", + ",\u1168,\u11bd": "0x33", + ",\u1168,\u11be": "0x33", + ",\u1168,\u11bf": "0x33", + ",\u1168,\u11c0": "0x33", + ",\u1168,\u11c1": "0x33", + ",\u1168,\u11c2": "0x33" + } + }, + { + "defaultGlyph": "0x5e", + "alternatives": {} + }, + { + "defaultGlyph": "0x8b", + "alternatives": { + ",\u116b,\u11ab": "0xae", + ",\u1174,\u11a8": "0xae", + ",\u1174,\u11a9": "0xae", + ",\u1174,\u11aa": "0xae", + ",\u1174,\u11ab": "0xae", + ",\u1174,\u11ac": "0xae", + ",\u1174,\u11ad": "0xae", + ",\u1174,\u11ae": "0xae", + ",\u1174,\u11af": "0xae", + ",\u1174,\u11b0": "0xae", + ",\u1174,\u11b1": "0xae", + ",\u1174,\u11b2": "0xae", + ",\u1174,\u11b3": "0xae", + ",\u1174,\u11b4": "0xae", + ",\u1174,\u11b5": "0xae", + ",\u1174,\u11b6": "0xae", + ",\u1174,\u11b7": "0xae", + ",\u1174,\u11b8": "0xae", + ",\u1174,\u11b9": "0xae", + ",\u1174,\u11ba": "0xae", + ",\u1174,\u11bb": "0xae", + ",\u1174,\u11bc": "0xae", + ",\u1174,\u11bd": "0xae", + ",\u1174,\u11be": "0xae", + ",\u1174,\u11bf": "0xae", + ",\u1174,\u11c0": "0xae", + ",\u1174,\u11c1": "0xae", + ",\u1174,\u11c2": "0xae" + } + } + ], + "\u1101": [ + { + "defaultGlyph": "0x34", + "alternatives": { + ",\u1162": "0x34", + ",\u1166": "0x34", + ",\u1175": "0x07" + } + }, + { + "defaultGlyph": "0x68", + "alternatives": { + ",\u1169": "0x66", + ",\u116d": "0x67" + } + }, + { + "defaultGlyph": "0xb3", + "alternatives": { + ",\u116b": "0x64", + ",\u116f": "0x91" + } + }, + { + "defaultGlyph": "0x34", + "alternatives": { + ",\u1162,\u11af": "0x34" + } + }, + { + "defaultGlyph": "0x65", + "alternatives": { + ",\u1169,\u11bd": "0x65", + ",\u1169,\u11a8": "0x65", + ",\u1169,\u11af": "0x65", + ",\u1169,\u11b7": "0x65", + ",\u1169,\u11bc": "0x65", + ",\u116d,\u11a8": "0x68", + ",\u116d,\u11a9": "0x68", + ",\u116d,\u11aa": "0x68", + ",\u116d,\u11ab": "0x68", + ",\u116d,\u11ac": "0x68", + ",\u116d,\u11ad": "0x68", + ",\u116d,\u11ae": "0x68", + ",\u116d,\u11af": "0x68", + ",\u116d,\u11b0": "0x68", + ",\u116d,\u11b1": "0x68", + ",\u116d,\u11b2": "0x68", + ",\u116d,\u11b3": "0x68", + ",\u116d,\u11b4": "0x68", + ",\u116d,\u11b5": "0x68", + ",\u116d,\u11b6": "0x68", + ",\u116d,\u11b7": "0x68", + ",\u116d,\u11b8": "0x68", + ",\u116d,\u11b9": "0x68", + ",\u116d,\u11ba": "0x68", + ",\u116d,\u11bb": "0x68", + ",\u116d,\u11bc": "0x68", + ",\u116d,\u11bd": "0x68", + ",\u116d,\u11be": "0x68", + ",\u116d,\u11bf": "0x68", + ",\u116d,\u11c0": "0x68", + ",\u116d,\u11c1": "0x68", + ",\u116d,\u11c2": "0x68", + ",\u116e,\u11a8": "0x68", + ",\u116e,\u11a9": "0x68", + ",\u116e,\u11aa": "0x68", + ",\u116e,\u11ab": "0x68", + ",\u116e,\u11ac": "0x68", + ",\u116e,\u11ad": "0x68", + ",\u116e,\u11ae": "0x68", + ",\u116e,\u11af": "0x68", + ",\u116e,\u11b0": "0x68", + ",\u116e,\u11b1": "0x68", + ",\u116e,\u11b2": "0x68", + ",\u116e,\u11b3": "0x68", + ",\u116e,\u11b4": "0x68", + ",\u116e,\u11b5": "0x68", + ",\u116e,\u11b6": "0x68", + ",\u116e,\u11b7": "0x68", + ",\u116e,\u11b8": "0x68", + ",\u116e,\u11b9": "0x68", + ",\u116e,\u11ba": "0x68", + ",\u116e,\u11bb": "0x68", + ",\u116e,\u11bc": "0x68", + ",\u116e,\u11bd": "0x68", + ",\u116e,\u11be": "0x68", + ",\u116e,\u11bf": "0x68", + ",\u116e,\u11c0": "0x68", + ",\u116e,\u11c1": "0x68", + ",\u116e,\u11c2": "0x68", + ",\u1172,\u11a8": "0x68", + ",\u1172,\u11a9": "0x68", + ",\u1172,\u11aa": "0x68", + ",\u1172,\u11ab": "0x68", + ",\u1172,\u11ac": "0x68", + ",\u1172,\u11ad": "0x68", + ",\u1172,\u11ae": "0x68", + ",\u1172,\u11af": "0x68", + ",\u1172,\u11b0": "0x68", + ",\u1172,\u11b1": "0x68", + ",\u1172,\u11b2": "0x68", + ",\u1172,\u11b3": "0x68", + ",\u1172,\u11b4": "0x68", + ",\u1172,\u11b5": "0x68", + ",\u1172,\u11b6": "0x68", + ",\u1172,\u11b7": "0x68", + ",\u1172,\u11b8": "0x68", + ",\u1172,\u11b9": "0x68", + ",\u1172,\u11ba": "0x68", + ",\u1172,\u11bb": "0x68", + ",\u1172,\u11bc": "0x68", + ",\u1172,\u11bd": "0x68", + ",\u1172,\u11be": "0x68", + ",\u1172,\u11bf": "0x68", + ",\u1172,\u11c0": "0x68", + ",\u1172,\u11c1": "0x68", + ",\u1172,\u11c2": "0x68", + ",\u1173,\u11a8": "0x68", + ",\u1173,\u11a9": "0x68", + ",\u1173,\u11aa": "0x68", + ",\u1173,\u11ab": "0x68", + ",\u1173,\u11ac": "0x68", + ",\u1173,\u11ad": "0x68", + ",\u1173,\u11ae": "0x68", + ",\u1173,\u11af": "0x68", + ",\u1173,\u11b0": "0x68", + ",\u1173,\u11b1": "0x68", + ",\u1173,\u11b2": "0x68", + ",\u1173,\u11b3": "0x68", + ",\u1173,\u11b4": "0x68", + ",\u1173,\u11b5": "0x68", + ",\u1173,\u11b6": "0x68", + ",\u1173,\u11b7": "0x68", + ",\u1173,\u11b8": "0x68", + ",\u1173,\u11b9": "0x68", + ",\u1173,\u11ba": "0x68", + ",\u1173,\u11bb": "0x68", + ",\u1173,\u11bc": "0x68", + ",\u1173,\u11bd": "0x68", + ",\u1173,\u11be": "0x68", + ",\u1173,\u11bf": "0x68", + ",\u1173,\u11c0": "0x68", + ",\u1173,\u11c1": "0x68", + ",\u1173,\u11c2": "0x68" + } + }, + { + "defaultGlyph": "0x91", + "alternatives": { + ",\u1171,\u11b8": "0x91", + ",\u116a,\u11a8": "0x8f", + ",\u116a,\u11a9": "0x8f", + ",\u116a,\u11aa": "0x8f", + ",\u116a,\u11ab": "0x8f", + ",\u116a,\u11ac": "0x8f", + ",\u116a,\u11ad": "0x8f", + ",\u116a,\u11ae": "0x8f", + ",\u116a,\u11af": "0x8f", + ",\u116a,\u11b0": "0x8f", + ",\u116a,\u11b1": "0x8f", + ",\u116a,\u11b2": "0x8f", + ",\u116a,\u11b3": "0x8f", + ",\u116a,\u11b4": "0x8f", + ",\u116a,\u11b5": "0x8f", + ",\u116a,\u11b6": "0x8f", + ",\u116a,\u11b7": "0x8f", + ",\u116a,\u11b8": "0x8f", + ",\u116a,\u11b9": "0x8f", + ",\u116a,\u11ba": "0x8f", + ",\u116a,\u11bb": "0x8f", + ",\u116a,\u11bc": "0x8f", + ",\u116a,\u11bd": "0x8f", + ",\u116a,\u11be": "0x8f", + ",\u116a,\u11bf": "0x8f", + ",\u116a,\u11c0": "0x8f", + ",\u116a,\u11c1": "0x8f", + ",\u116a,\u11c2": "0x8f", + ",\u116b,\u11a8": "0x64", + ",\u116b,\u11a9": "0x64", + ",\u116b,\u11aa": "0x64", + ",\u116b,\u11ab": "0x64", + ",\u116b,\u11ac": "0x64", + ",\u116b,\u11ad": "0x64", + ",\u116b,\u11ae": "0x64", + ",\u116b,\u11af": "0x64", + ",\u116b,\u11b0": "0x64", + ",\u116b,\u11b1": "0x64", + ",\u116b,\u11b2": "0x64", + ",\u116b,\u11b3": "0x64", + ",\u116b,\u11b4": "0x64", + ",\u116b,\u11b5": "0x64", + ",\u116b,\u11b6": "0x64", + ",\u116b,\u11b7": "0x64", + ",\u116b,\u11b8": "0x64", + ",\u116b,\u11b9": "0x64", + ",\u116b,\u11ba": "0x64", + ",\u116b,\u11bb": "0x64", + ",\u116b,\u11bc": "0x64", + ",\u116b,\u11bd": "0x64", + ",\u116b,\u11be": "0x64", + ",\u116b,\u11bf": "0x64", + ",\u116b,\u11c0": "0x64", + ",\u116b,\u11c1": "0x64", + ",\u116b,\u11c2": "0x64", + ",\u1170,\u11a8": "0xb3", + ",\u1170,\u11a9": "0xb3", + ",\u1170,\u11aa": "0xb3", + ",\u1170,\u11ab": "0xb3", + ",\u1170,\u11ac": "0xb3", + ",\u1170,\u11ad": "0xb3", + ",\u1170,\u11ae": "0xb3", + ",\u1170,\u11af": "0xb3", + ",\u1170,\u11b0": "0xb3", + ",\u1170,\u11b1": "0xb3", + ",\u1170,\u11b2": "0xb3", + ",\u1170,\u11b3": "0xb3", + ",\u1170,\u11b4": "0xb3", + ",\u1170,\u11b5": "0xb3", + ",\u1170,\u11b6": "0xb3", + ",\u1170,\u11b7": "0xb3", + ",\u1170,\u11b8": "0xb3", + ",\u1170,\u11b9": "0xb3", + ",\u1170,\u11ba": "0xb3", + ",\u1170,\u11bb": "0xb3", + ",\u1170,\u11bc": "0xb3", + ",\u1170,\u11bd": "0xb3", + ",\u1170,\u11be": "0xb3", + ",\u1170,\u11bf": "0xb3", + ",\u1170,\u11c0": "0xb3", + ",\u1170,\u11c1": "0xb3", + ",\u1170,\u11c2": "0xb3", + ",\u116c,\u11a8": "0x8f", + ",\u116c,\u11a9": "0x8f", + ",\u116c,\u11aa": "0x8f", + ",\u116c,\u11ab": "0x8f", + ",\u116c,\u11ac": "0x8f", + ",\u116c,\u11ad": "0x8f", + ",\u116c,\u11ae": "0x8f", + ",\u116c,\u11af": "0x8f", + ",\u116c,\u11b0": "0x8f", + ",\u116c,\u11b1": "0x8f", + ",\u116c,\u11b2": "0x8f", + ",\u116c,\u11b3": "0x8f", + ",\u116c,\u11b4": "0x8f", + ",\u116c,\u11b5": "0x8f", + ",\u116c,\u11b6": "0x8f", + ",\u116c,\u11b7": "0x8f", + ",\u116c,\u11b8": "0x8f", + ",\u116c,\u11b9": "0x8f", + ",\u116c,\u11ba": "0x8f", + ",\u116c,\u11bb": "0x8f", + ",\u116c,\u11bc": "0x8f", + ",\u116c,\u11bd": "0x8f", + ",\u116c,\u11be": "0x8f", + ",\u116c,\u11bf": "0x8f", + ",\u116c,\u11c0": "0x8f", + ",\u116c,\u11c1": "0x8f", + ",\u116c,\u11c2": "0x8f" + } + } + ], + "\u1102": [ + { + "defaultGlyph": "0x08", + "alternatives": { + ",\u1162": "0x35", + ",\u1165": "0x1f", + ",\u1167": "0x1f", + ",\u1166": "0x4a", + ",\u1161": "0x1f", + ",\u1163": "0x1f", + ",\u1168": "0x4a", + ",\u1164": "0x35" + } + }, + { + "defaultGlyph": "0x69", + "alternatives": {} + }, + { + "defaultGlyph": "0x92", + "alternatives": { + ",\u116b": "0xb4", + ",\u1170": "0xb4" + } + }, + { + "defaultGlyph": "0x08", + "alternatives": { + ",\u1165,\u11c2": "0x1f", + ",\u1165,\u11af": "0x1f", + ",\u1167,\u11ab": "0x1f", + ",\u1165,\u11b7": "0x1f", + ",\u1167,\u11bc": "0x1f", + ",\u1167,\u11b7": "0x1f", + ",\u1165,\u11ab": "0x1f", + ",\u1167,\u11bb": "0x1f", + ",\u1162,\u11ab": "0x35", + ",\u1162,\u11b7": "0x35", + ",\u1162,\u11bb": "0x35", + ",\u1162,\u11af": "0x35", + ",\u1162,\u11a8": "0x35", + ",\u1162,\u11a9": "0x35", + ",\u1162,\u11aa": "0x35", + ",\u1162,\u11ac": "0x35", + ",\u1162,\u11ad": "0x35", + ",\u1162,\u11ae": "0x35", + ",\u1162,\u11b0": "0x35", + ",\u1162,\u11b1": "0x35", + ",\u1162,\u11b2": "0x35", + ",\u1162,\u11b3": "0x35", + ",\u1162,\u11b4": "0x35", + ",\u1162,\u11b5": "0x35", + ",\u1162,\u11b6": "0x35", + ",\u1162,\u11b8": "0x35", + ",\u1162,\u11b9": "0x35", + ",\u1162,\u11ba": "0x35", + ",\u1162,\u11bc": "0x35", + ",\u1162,\u11bd": "0x35", + ",\u1162,\u11be": "0x35", + ",\u1162,\u11bf": "0x35", + ",\u1162,\u11c0": "0x35", + ",\u1162,\u11c1": "0x35", + ",\u1162,\u11c2": "0x35", + ",\u1164,\u11a8": "0x35", + ",\u1164,\u11a9": "0x35", + ",\u1164,\u11aa": "0x35", + ",\u1164,\u11ab": "0x35", + ",\u1164,\u11ac": "0x35", + ",\u1164,\u11ad": "0x35", + ",\u1164,\u11ae": "0x35", + ",\u1164,\u11af": "0x35", + ",\u1164,\u11b0": "0x35", + ",\u1164,\u11b1": "0x35", + ",\u1164,\u11b2": "0x35", + ",\u1164,\u11b3": "0x35", + ",\u1164,\u11b4": "0x35", + ",\u1164,\u11b5": "0x35", + ",\u1164,\u11b6": "0x35", + ",\u1164,\u11b7": "0x35", + ",\u1164,\u11b8": "0x35", + ",\u1164,\u11b9": "0x35", + ",\u1164,\u11ba": "0x35", + ",\u1164,\u11bb": "0x35", + ",\u1164,\u11bc": "0x35", + ",\u1164,\u11bd": "0x35", + ",\u1164,\u11be": "0x35", + ",\u1164,\u11bf": "0x35", + ",\u1164,\u11c0": "0x35", + ",\u1164,\u11c1": "0x35", + ",\u1164,\u11c2": "0x35", + ",\u1166,\u11a8": "0x35", + ",\u1166,\u11a9": "0x35", + ",\u1166,\u11aa": "0x35", + ",\u1166,\u11ab": "0x35", + ",\u1166,\u11ac": "0x35", + ",\u1166,\u11ad": "0x35", + ",\u1166,\u11ae": "0x35", + ",\u1166,\u11af": "0x35", + ",\u1166,\u11b0": "0x35", + ",\u1166,\u11b1": "0x35", + ",\u1166,\u11b2": "0x35", + ",\u1166,\u11b3": "0x35", + ",\u1166,\u11b4": "0x35", + ",\u1166,\u11b5": "0x35", + ",\u1166,\u11b6": "0x35", + ",\u1166,\u11b7": "0x35", + ",\u1166,\u11b8": "0x35", + ",\u1166,\u11b9": "0x35", + ",\u1166,\u11ba": "0x35", + ",\u1166,\u11bb": "0x35", + ",\u1166,\u11bc": "0x35", + ",\u1166,\u11bd": "0x35", + ",\u1166,\u11be": "0x35", + ",\u1166,\u11bf": "0x35", + ",\u1166,\u11c0": "0x35", + ",\u1166,\u11c1": "0x35", + ",\u1166,\u11c2": "0x35", + ",\u1167,\u11a8": "0x1f", + ",\u1167,\u11a9": "0x1f", + ",\u1167,\u11aa": "0x1f", + ",\u1167,\u11ac": "0x1f", + ",\u1167,\u11ad": "0x1f", + ",\u1167,\u11ae": "0x1f", + ",\u1167,\u11af": "0x1f", + ",\u1167,\u11b0": "0x1f", + ",\u1167,\u11b1": "0x1f", + ",\u1167,\u11b2": "0x1f", + ",\u1167,\u11b3": "0x1f", + ",\u1167,\u11b4": "0x1f", + ",\u1167,\u11b5": "0x1f", + ",\u1167,\u11b6": "0x1f", + ",\u1167,\u11b8": "0x1f", + ",\u1167,\u11b9": "0x1f", + ",\u1167,\u11ba": "0x1f", + ",\u1167,\u11bd": "0x1f", + ",\u1167,\u11be": "0x1f", + ",\u1167,\u11bf": "0x1f", + ",\u1167,\u11c0": "0x1f", + ",\u1167,\u11c1": "0x1f", + ",\u1167,\u11c2": "0x1f", + ",\u1165,\u11a8": "0x1f", + ",\u1165,\u11a9": "0x1f", + ",\u1165,\u11aa": "0x1f", + ",\u1165,\u11ac": "0x1f", + ",\u1165,\u11ad": "0x1f", + ",\u1165,\u11ae": "0x1f", + ",\u1165,\u11b0": "0x1f", + ",\u1165,\u11b1": "0x1f", + ",\u1165,\u11b2": "0x1f", + ",\u1165,\u11b3": "0x1f", + ",\u1165,\u11b4": "0x1f", + ",\u1165,\u11b5": "0x1f", + ",\u1165,\u11b6": "0x1f", + ",\u1165,\u11b8": "0x1f", + ",\u1165,\u11b9": "0x1f", + ",\u1165,\u11ba": "0x1f", + ",\u1165,\u11bb": "0x1f", + ",\u1165,\u11bc": "0x1f", + ",\u1165,\u11bd": "0x1f", + ",\u1165,\u11be": "0x1f", + ",\u1165,\u11bf": "0x1f", + ",\u1165,\u11c0": "0x1f", + ",\u1165,\u11c1": "0x1f", + ",\u1168,\u11a8": "0x4a", + ",\u1168,\u11a9": "0x4a", + ",\u1168,\u11aa": "0x4a", + ",\u1168,\u11ab": "0x4a", + ",\u1168,\u11ac": "0x4a", + ",\u1168,\u11ad": "0x4a", + ",\u1168,\u11ae": "0x4a", + ",\u1168,\u11af": "0x4a", + ",\u1168,\u11b0": "0x4a", + ",\u1168,\u11b1": "0x4a", + ",\u1168,\u11b2": "0x4a", + ",\u1168,\u11b3": "0x4a", + ",\u1168,\u11b4": "0x4a", + ",\u1168,\u11b5": "0x4a", + ",\u1168,\u11b6": "0x4a", + ",\u1168,\u11b7": "0x4a", + ",\u1168,\u11b8": "0x4a", + ",\u1168,\u11b9": "0x4a", + ",\u1168,\u11ba": "0x4a", + ",\u1168,\u11bb": "0x4a", + ",\u1168,\u11bc": "0x4a", + ",\u1168,\u11bd": "0x4a", + ",\u1168,\u11be": "0x4a", + ",\u1168,\u11bf": "0x4a", + ",\u1168,\u11c0": "0x4a", + ",\u1168,\u11c1": "0x4a", + ",\u1168,\u11c2": "0x4a" + } + }, + { + "defaultGlyph": "0x69", + "alternatives": {} + }, + { + "defaultGlyph": "0x92", + "alternatives": { + ",\u116a,\u11a8": "0xb4", + ",\u116a,\u11a9": "0xb4", + ",\u116a,\u11aa": "0xb4", + ",\u116a,\u11ab": "0xb4", + ",\u116a,\u11ac": "0xb4", + ",\u116a,\u11ad": "0xb4", + ",\u116a,\u11ae": "0xb4", + ",\u116a,\u11af": "0xb4", + ",\u116a,\u11b0": "0xb4", + ",\u116a,\u11b1": "0xb4", + ",\u116a,\u11b2": "0xb4", + ",\u116a,\u11b3": "0xb4", + ",\u116a,\u11b4": "0xb4", + ",\u116a,\u11b5": "0xb4", + ",\u116a,\u11b6": "0xb4", + ",\u116a,\u11b7": "0xb4", + ",\u116a,\u11b8": "0xb4", + ",\u116a,\u11b9": "0xb4", + ",\u116a,\u11ba": "0xb4", + ",\u116a,\u11bb": "0xb4", + ",\u116a,\u11bc": "0xb4", + ",\u116a,\u11bd": "0xb4", + ",\u116a,\u11be": "0xb4", + ",\u116a,\u11bf": "0xb4", + ",\u116a,\u11c0": "0xb4", + ",\u116a,\u11c1": "0xb4", + ",\u116a,\u11c2": "0xb4", + ",\u116b,\u11a8": "0xb4", + ",\u116b,\u11a9": "0xb4", + ",\u116b,\u11aa": "0xb4", + ",\u116b,\u11ab": "0xb4", + ",\u116b,\u11ac": "0xb4", + ",\u116b,\u11ad": "0xb4", + ",\u116b,\u11ae": "0xb4", + ",\u116b,\u11af": "0xb4", + ",\u116b,\u11b0": "0xb4", + ",\u116b,\u11b1": "0xb4", + ",\u116b,\u11b2": "0xb4", + ",\u116b,\u11b3": "0xb4", + ",\u116b,\u11b4": "0xb4", + ",\u116b,\u11b5": "0xb4", + ",\u116b,\u11b6": "0xb4", + ",\u116b,\u11b7": "0xb4", + ",\u116b,\u11b8": "0xb4", + ",\u116b,\u11b9": "0xb4", + ",\u116b,\u11ba": "0xb4", + ",\u116b,\u11bb": "0xb4", + ",\u116b,\u11bc": "0xb4", + ",\u116b,\u11bd": "0xb4", + ",\u116b,\u11be": "0xb4", + ",\u116b,\u11bf": "0xb4", + ",\u116b,\u11c0": "0xb4", + ",\u116b,\u11c1": "0xb4", + ",\u116b,\u11c2": "0xb4", + ",\u1170,\u11a8": "0xb4", + ",\u1170,\u11a9": "0xb4", + ",\u1170,\u11aa": "0xb4", + ",\u1170,\u11ab": "0xb4", + ",\u1170,\u11ac": "0xb4", + ",\u1170,\u11ad": "0xb4", + ",\u1170,\u11ae": "0xb4", + ",\u1170,\u11af": "0xb4", + ",\u1170,\u11b0": "0xb4", + ",\u1170,\u11b1": "0xb4", + ",\u1170,\u11b2": "0xb4", + ",\u1170,\u11b3": "0xb4", + ",\u1170,\u11b4": "0xb4", + ",\u1170,\u11b5": "0xb4", + ",\u1170,\u11b6": "0xb4", + ",\u1170,\u11b7": "0xb4", + ",\u1170,\u11b8": "0xb4", + ",\u1170,\u11b9": "0xb4", + ",\u1170,\u11ba": "0xb4", + ",\u1170,\u11bb": "0xb4", + ",\u1170,\u11bc": "0xb4", + ",\u1170,\u11bd": "0xb4", + ",\u1170,\u11be": "0xb4", + ",\u1170,\u11bf": "0xb4", + ",\u1170,\u11c0": "0xb4", + ",\u1170,\u11c1": "0xb4", + ",\u1170,\u11c2": "0xb4" + } + } + ], + "\u1103": [ + { + "defaultGlyph": "0x09", + "alternatives": { + ",\u1166": "0x51", + ",\u1162": "0x36", + ",\u1165": "0x26", + ",\u1167": "0x36", + ",\u1161": "0x26", + ",\u1164": "0x36", + ",\u1163": "0x26", + ",\u1168": "0x51" + } + }, + { + "defaultGlyph": "0x70", + "alternatives": {} + }, + { + "defaultGlyph": "0x93", + "alternatives": { + ",\u116b": "0xb5", + ",\u116a": "0xb5", + ",\u1170": "0xb5" + } + }, + { + "defaultGlyph": "0x09", + "alternatives": { + ",\u1165,\u11c1": "0x26", + ",\u1165,\u11b7": "0x26", + ",\u1165,\u11ab": "0x26", + ",\u1165,\u11af": "0x26", + ",\u1165,\u11bc": "0x26", + ",\u1165,\u11be": "0x26", + ",\u1165,\u11a8": "0x26", + ",\u1166,\u11a8": "0x51", + ",\u1162,\u11a8": "0x36", + ",\u1162,\u11bb": "0x36", + ",\u1162,\u11a9": "0x36", + ",\u1162,\u11aa": "0x36", + ",\u1162,\u11ab": "0x36", + ",\u1162,\u11ac": "0x36", + ",\u1162,\u11ad": "0x36", + ",\u1162,\u11ae": "0x36", + ",\u1162,\u11af": "0x36", + ",\u1162,\u11b0": "0x36", + ",\u1162,\u11b1": "0x36", + ",\u1162,\u11b2": "0x36", + ",\u1162,\u11b3": "0x36", + ",\u1162,\u11b4": "0x36", + ",\u1162,\u11b5": "0x36", + ",\u1162,\u11b6": "0x36", + ",\u1162,\u11b7": "0x36", + ",\u1162,\u11b8": "0x36", + ",\u1162,\u11b9": "0x36", + ",\u1162,\u11ba": "0x36", + ",\u1162,\u11bc": "0x36", + ",\u1162,\u11bd": "0x36", + ",\u1162,\u11be": "0x36", + ",\u1162,\u11bf": "0x36", + ",\u1162,\u11c0": "0x36", + ",\u1162,\u11c1": "0x36", + ",\u1162,\u11c2": "0x36", + ",\u1164,\u11a8": "0x36", + ",\u1164,\u11a9": "0x36", + ",\u1164,\u11aa": "0x36", + ",\u1164,\u11ab": "0x36", + ",\u1164,\u11ac": "0x36", + ",\u1164,\u11ad": "0x36", + ",\u1164,\u11ae": "0x36", + ",\u1164,\u11af": "0x36", + ",\u1164,\u11b0": "0x36", + ",\u1164,\u11b1": "0x36", + ",\u1164,\u11b2": "0x36", + ",\u1164,\u11b3": "0x36", + ",\u1164,\u11b4": "0x36", + ",\u1164,\u11b5": "0x36", + ",\u1164,\u11b6": "0x36", + ",\u1164,\u11b7": "0x36", + ",\u1164,\u11b8": "0x36", + ",\u1164,\u11b9": "0x36", + ",\u1164,\u11ba": "0x36", + ",\u1164,\u11bb": "0x36", + ",\u1164,\u11bc": "0x36", + ",\u1164,\u11bd": "0x36", + ",\u1164,\u11be": "0x36", + ",\u1164,\u11bf": "0x36", + ",\u1164,\u11c0": "0x36", + ",\u1164,\u11c1": "0x36", + ",\u1164,\u11c2": "0x36", + ",\u1166,\u11a9": "0x51", + ",\u1166,\u11aa": "0x51", + ",\u1166,\u11ab": "0x51", + ",\u1166,\u11ac": "0x51", + ",\u1166,\u11ad": "0x51", + ",\u1166,\u11ae": "0x51", + ",\u1166,\u11af": "0x51", + ",\u1166,\u11b0": "0x51", + ",\u1166,\u11b1": "0x51", + ",\u1166,\u11b2": "0x51", + ",\u1166,\u11b3": "0x51", + ",\u1166,\u11b4": "0x51", + ",\u1166,\u11b5": "0x51", + ",\u1166,\u11b6": "0x51", + ",\u1166,\u11b7": "0x51", + ",\u1166,\u11b8": "0x51", + ",\u1166,\u11b9": "0x51", + ",\u1166,\u11ba": "0x51", + ",\u1166,\u11bb": "0x51", + ",\u1166,\u11bc": "0x51", + ",\u1166,\u11bd": "0x51", + ",\u1166,\u11be": "0x51", + ",\u1166,\u11bf": "0x51", + ",\u1166,\u11c0": "0x51", + ",\u1166,\u11c1": "0x51", + ",\u1166,\u11c2": "0x51", + ",\u1167,\u11a8": "0x26", + ",\u1167,\u11a9": "0x26", + ",\u1167,\u11aa": "0x26", + ",\u1167,\u11ab": "0x26", + ",\u1167,\u11ac": "0x26", + ",\u1167,\u11ad": "0x26", + ",\u1167,\u11ae": "0x26", + ",\u1167,\u11af": "0x26", + ",\u1167,\u11b0": "0x26", + ",\u1167,\u11b1": "0x26", + ",\u1167,\u11b2": "0x26", + ",\u1167,\u11b3": "0x26", + ",\u1167,\u11b4": "0x26", + ",\u1167,\u11b5": "0x26", + ",\u1167,\u11b6": "0x26", + ",\u1167,\u11b7": "0x26", + ",\u1167,\u11b8": "0x26", + ",\u1167,\u11b9": "0x26", + ",\u1167,\u11ba": "0x26", + ",\u1167,\u11bb": "0x26", + ",\u1167,\u11bc": "0x26", + ",\u1167,\u11bd": "0x26", + ",\u1167,\u11be": "0x26", + ",\u1167,\u11bf": "0x26", + ",\u1167,\u11c0": "0x26", + ",\u1167,\u11c1": "0x26", + ",\u1167,\u11c2": "0x26", + ",\u1168,\u11a8": "0x51", + ",\u1168,\u11a9": "0x51", + ",\u1168,\u11aa": "0x51", + ",\u1168,\u11ab": "0x51", + ",\u1168,\u11ac": "0x51", + ",\u1168,\u11ad": "0x51", + ",\u1168,\u11ae": "0x51", + ",\u1168,\u11af": "0x51", + ",\u1168,\u11b0": "0x51", + ",\u1168,\u11b1": "0x51", + ",\u1168,\u11b2": "0x51", + ",\u1168,\u11b3": "0x51", + ",\u1168,\u11b4": "0x51", + ",\u1168,\u11b5": "0x51", + ",\u1168,\u11b6": "0x51", + ",\u1168,\u11b7": "0x51", + ",\u1168,\u11b8": "0x51", + ",\u1168,\u11b9": "0x51", + ",\u1168,\u11ba": "0x51", + ",\u1168,\u11bb": "0x51", + ",\u1168,\u11bc": "0x51", + ",\u1168,\u11bd": "0x51", + ",\u1168,\u11be": "0x51", + ",\u1168,\u11bf": "0x51", + ",\u1168,\u11c0": "0x51", + ",\u1168,\u11c1": "0x51", + ",\u1168,\u11c2": "0x51" + } + }, + { + "defaultGlyph": "0x70", + "alternatives": {} + }, + { + "defaultGlyph": "0x93", + "alternatives": { + ",\u116b,\u11bb": "0xb5", + ",\u116a,\u11a8": "0xb5", + ",\u116a,\u11a9": "0xb5", + ",\u116a,\u11aa": "0xb5", + ",\u116a,\u11ab": "0xb5", + ",\u116a,\u11ac": "0xb5", + ",\u116a,\u11ad": "0xb5", + ",\u116a,\u11ae": "0xb5", + ",\u116a,\u11af": "0xb5", + ",\u116a,\u11b0": "0xb5", + ",\u116a,\u11b1": "0xb5", + ",\u116a,\u11b2": "0xb5", + ",\u116a,\u11b3": "0xb5", + ",\u116a,\u11b4": "0xb5", + ",\u116a,\u11b5": "0xb5", + ",\u116a,\u11b6": "0xb5", + ",\u116a,\u11b7": "0xb5", + ",\u116a,\u11b8": "0xb5", + ",\u116a,\u11b9": "0xb5", + ",\u116a,\u11ba": "0xb5", + ",\u116a,\u11bb": "0xb5", + ",\u116a,\u11bc": "0xb5", + ",\u116a,\u11bd": "0xb5", + ",\u116a,\u11be": "0xb5", + ",\u116a,\u11bf": "0xb5", + ",\u116a,\u11c0": "0xb5", + ",\u116a,\u11c1": "0xb5", + ",\u116a,\u11c2": "0xb5", + ",\u116b,\u11a8": "0xb5", + ",\u116b,\u11a9": "0xb5", + ",\u116b,\u11aa": "0xb5", + ",\u116b,\u11ab": "0xb5", + ",\u116b,\u11ac": "0xb5", + ",\u116b,\u11ad": "0xb5", + ",\u116b,\u11ae": "0xb5", + ",\u116b,\u11af": "0xb5", + ",\u116b,\u11b0": "0xb5", + ",\u116b,\u11b1": "0xb5", + ",\u116b,\u11b2": "0xb5", + ",\u116b,\u11b3": "0xb5", + ",\u116b,\u11b4": "0xb5", + ",\u116b,\u11b5": "0xb5", + ",\u116b,\u11b6": "0xb5", + ",\u116b,\u11b7": "0xb5", + ",\u116b,\u11b8": "0xb5", + ",\u116b,\u11b9": "0xb5", + ",\u116b,\u11ba": "0xb5", + ",\u116b,\u11bc": "0xb5", + ",\u116b,\u11bd": "0xb5", + ",\u116b,\u11be": "0xb5", + ",\u116b,\u11bf": "0xb5", + ",\u116b,\u11c0": "0xb5", + ",\u116b,\u11c1": "0xb5", + ",\u116b,\u11c2": "0xb5", + ",\u1170,\u11a8": "0xb5", + ",\u1170,\u11a9": "0xb5", + ",\u1170,\u11aa": "0xb5", + ",\u1170,\u11ab": "0xb5", + ",\u1170,\u11ac": "0xb5", + ",\u1170,\u11ad": "0xb5", + ",\u1170,\u11ae": "0xb5", + ",\u1170,\u11af": "0xb5", + ",\u1170,\u11b0": "0xb5", + ",\u1170,\u11b1": "0xb5", + ",\u1170,\u11b2": "0xb5", + ",\u1170,\u11b3": "0xb5", + ",\u1170,\u11b4": "0xb5", + ",\u1170,\u11b5": "0xb5", + ",\u1170,\u11b6": "0xb5", + ",\u1170,\u11b7": "0xb5", + ",\u1170,\u11b8": "0xb5", + ",\u1170,\u11b9": "0xb5", + ",\u1170,\u11ba": "0xb5", + ",\u1170,\u11bb": "0xb5", + ",\u1170,\u11bc": "0xb5", + ",\u1170,\u11bd": "0xb5", + ",\u1170,\u11be": "0xb5", + ",\u1170,\u11bf": "0xb5", + ",\u1170,\u11c0": "0xb5", + ",\u1170,\u11c1": "0xb5", + ",\u1170,\u11c2": "0xb5" + } + } + ], + "\u1104": [ + { + "defaultGlyph": "0x37", + "alternatives": { + ",\u1165": "0x27", + ",\u1161": "0x27", + ",\u1166": "0x52", + ",\u1162": "0x52", + ",\u1164": "0x52", + ",\u1163": "0x27", + ",\u1167": "0x27", + ",\u1168": "0x52", + ",\u1175": "0x27" + } + }, + { + "defaultGlyph": "0x71", + "alternatives": {} + }, + { + "defaultGlyph": "0x94", + "alternatives": { + ",\u116a": "0xb6", + ",\u116b": "0xb6", + ",\u1170": "0xb6" + } + }, + { + "defaultGlyph": "0x0a", + "alternatives": { + ",\u1161,\u11bc": "0x0a", + ",\u1161,\u11af": "0x0a", + ",\u1161,\u11ba": "0x0a", + ",\u1161,\u11a8": "0x0a", + ",\u1165,\u11a8": "0x27", + ",\u1165,\u11c2": "0x27", + ",\u1165,\u11ab": "0x27", + ",\u1165,\u11af": "0x27", + ",\u1162,\u11a8": "0x52", + ",\u1162,\u11a9": "0x52", + ",\u1162,\u11aa": "0x52", + ",\u1162,\u11ab": "0x52", + ",\u1162,\u11ac": "0x52", + ",\u1162,\u11ad": "0x52", + ",\u1162,\u11ae": "0x52", + ",\u1162,\u11af": "0x52", + ",\u1162,\u11b0": "0x52", + ",\u1162,\u11b1": "0x52", + ",\u1162,\u11b2": "0x52", + ",\u1162,\u11b3": "0x52", + ",\u1162,\u11b4": "0x52", + ",\u1162,\u11b5": "0x52", + ",\u1162,\u11b6": "0x52", + ",\u1162,\u11b7": "0x52", + ",\u1162,\u11b8": "0x52", + ",\u1162,\u11b9": "0x52", + ",\u1162,\u11ba": "0x52", + ",\u1162,\u11bb": "0x52", + ",\u1162,\u11bc": "0x52", + ",\u1162,\u11bd": "0x52", + ",\u1162,\u11be": "0x52", + ",\u1162,\u11bf": "0x52", + ",\u1162,\u11c0": "0x52", + ",\u1162,\u11c1": "0x52", + ",\u1162,\u11c2": "0x52", + ",\u1163,\u11a8": "0x52", + ",\u1163,\u11a9": "0x52", + ",\u1163,\u11aa": "0x52", + ",\u1163,\u11ab": "0x52", + ",\u1163,\u11ac": "0x52", + ",\u1163,\u11ad": "0x52", + ",\u1163,\u11ae": "0x52", + ",\u1163,\u11af": "0x52", + ",\u1163,\u11b0": "0x52", + ",\u1163,\u11b1": "0x52", + ",\u1163,\u11b2": "0x52", + ",\u1163,\u11b3": "0x52", + ",\u1163,\u11b4": "0x52", + ",\u1163,\u11b5": "0x52", + ",\u1163,\u11b6": "0x52", + ",\u1163,\u11b7": "0x52", + ",\u1163,\u11b8": "0x52", + ",\u1163,\u11b9": "0x52", + ",\u1163,\u11ba": "0x52", + ",\u1163,\u11bb": "0x52", + ",\u1163,\u11bc": "0x52", + ",\u1163,\u11bd": "0x52", + ",\u1163,\u11be": "0x52", + ",\u1163,\u11bf": "0x52", + ",\u1163,\u11c0": "0x52", + ",\u1163,\u11c1": "0x52", + ",\u1163,\u11c2": "0x52", + ",\u1164,\u11a8": "0x52", + ",\u1164,\u11a9": "0x52", + ",\u1164,\u11aa": "0x52", + ",\u1164,\u11ab": "0x52", + ",\u1164,\u11ac": "0x52", + ",\u1164,\u11ad": "0x52", + ",\u1164,\u11ae": "0x52", + ",\u1164,\u11af": "0x52", + ",\u1164,\u11b0": "0x52", + ",\u1164,\u11b1": "0x52", + ",\u1164,\u11b2": "0x52", + ",\u1164,\u11b3": "0x52", + ",\u1164,\u11b4": "0x52", + ",\u1164,\u11b5": "0x52", + ",\u1164,\u11b6": "0x52", + ",\u1164,\u11b7": "0x52", + ",\u1164,\u11b8": "0x52", + ",\u1164,\u11b9": "0x52", + ",\u1164,\u11ba": "0x52", + ",\u1164,\u11bb": "0x52", + ",\u1164,\u11bc": "0x52", + ",\u1164,\u11bd": "0x52", + ",\u1164,\u11be": "0x52", + ",\u1164,\u11bf": "0x52", + ",\u1164,\u11c0": "0x52", + ",\u1164,\u11c1": "0x52", + ",\u1164,\u11c2": "0x52", + ",\u1166,\u11a8": "0x52", + ",\u1166,\u11a9": "0x52", + ",\u1166,\u11aa": "0x52", + ",\u1166,\u11ab": "0x52", + ",\u1166,\u11ac": "0x52", + ",\u1166,\u11ad": "0x52", + ",\u1166,\u11ae": "0x52", + ",\u1166,\u11af": "0x52", + ",\u1166,\u11b0": "0x52", + ",\u1166,\u11b1": "0x52", + ",\u1166,\u11b2": "0x52", + ",\u1166,\u11b3": "0x52", + ",\u1166,\u11b4": "0x52", + ",\u1166,\u11b5": "0x52", + ",\u1166,\u11b6": "0x52", + ",\u1166,\u11b7": "0x52", + ",\u1166,\u11b8": "0x52", + ",\u1166,\u11b9": "0x52", + ",\u1166,\u11ba": "0x52", + ",\u1166,\u11bb": "0x52", + ",\u1166,\u11bc": "0x52", + ",\u1166,\u11bd": "0x52", + ",\u1166,\u11be": "0x52", + ",\u1166,\u11bf": "0x52", + ",\u1166,\u11c0": "0x52", + ",\u1166,\u11c1": "0x52", + ",\u1166,\u11c2": "0x52", + ",\u1167,\u11a8": "0x52", + ",\u1167,\u11a9": "0x52", + ",\u1167,\u11aa": "0x52", + ",\u1167,\u11ab": "0x52", + ",\u1167,\u11ac": "0x52", + ",\u1167,\u11ad": "0x52", + ",\u1167,\u11ae": "0x52", + ",\u1167,\u11af": "0x52", + ",\u1167,\u11b0": "0x52", + ",\u1167,\u11b1": "0x52", + ",\u1167,\u11b2": "0x52", + ",\u1167,\u11b3": "0x52", + ",\u1167,\u11b4": "0x52", + ",\u1167,\u11b5": "0x52", + ",\u1167,\u11b6": "0x52", + ",\u1167,\u11b7": "0x52", + ",\u1167,\u11b8": "0x52", + ",\u1167,\u11b9": "0x52", + ",\u1167,\u11ba": "0x52", + ",\u1167,\u11bb": "0x52", + ",\u1167,\u11bc": "0x52", + ",\u1167,\u11bd": "0x52", + ",\u1167,\u11be": "0x52", + ",\u1167,\u11bf": "0x52", + ",\u1167,\u11c0": "0x52", + ",\u1167,\u11c1": "0x52", + ",\u1167,\u11c2": "0x52", + ",\u1168,\u11a8": "0x52", + ",\u1168,\u11a9": "0x52", + ",\u1168,\u11aa": "0x52", + ",\u1168,\u11ab": "0x52", + ",\u1168,\u11ac": "0x52", + ",\u1168,\u11ad": "0x52", + ",\u1168,\u11ae": "0x52", + ",\u1168,\u11af": "0x52", + ",\u1168,\u11b0": "0x52", + ",\u1168,\u11b1": "0x52", + ",\u1168,\u11b2": "0x52", + ",\u1168,\u11b3": "0x52", + ",\u1168,\u11b4": "0x52", + ",\u1168,\u11b5": "0x52", + ",\u1168,\u11b6": "0x52", + ",\u1168,\u11b7": "0x52", + ",\u1168,\u11b8": "0x52", + ",\u1168,\u11b9": "0x52", + ",\u1168,\u11ba": "0x52", + ",\u1168,\u11bb": "0x52", + ",\u1168,\u11bc": "0x52", + ",\u1168,\u11bd": "0x52", + ",\u1168,\u11be": "0x52", + ",\u1168,\u11bf": "0x52", + ",\u1168,\u11c0": "0x52", + ",\u1168,\u11c1": "0x52", + ",\u1168,\u11c2": "0x52" + } + }, + { + "defaultGlyph": "0x71", + "alternatives": {} + }, + { + "defaultGlyph": "0x94", + "alternatives": { + ",\u116a,\u11a8": "0xb6", + ",\u116a,\u11a9": "0xb6", + ",\u116a,\u11aa": "0xb6", + ",\u116a,\u11ab": "0xb6", + ",\u116a,\u11ac": "0xb6", + ",\u116a,\u11ad": "0xb6", + ",\u116a,\u11ae": "0xb6", + ",\u116a,\u11af": "0xb6", + ",\u116a,\u11b0": "0xb6", + ",\u116a,\u11b1": "0xb6", + ",\u116a,\u11b2": "0xb6", + ",\u116a,\u11b3": "0xb6", + ",\u116a,\u11b4": "0xb6", + ",\u116a,\u11b5": "0xb6", + ",\u116a,\u11b6": "0xb6", + ",\u116a,\u11b7": "0xb6", + ",\u116a,\u11b8": "0xb6", + ",\u116a,\u11b9": "0xb6", + ",\u116a,\u11ba": "0xb6", + ",\u116a,\u11bb": "0xb6", + ",\u116a,\u11bc": "0xb6", + ",\u116a,\u11bd": "0xb6", + ",\u116a,\u11be": "0xb6", + ",\u116a,\u11bf": "0xb6", + ",\u116a,\u11c0": "0xb6", + ",\u116a,\u11c1": "0xb6", + ",\u116a,\u11c2": "0xb6", + ",\u116b,\u11a8": "0xb6", + ",\u116b,\u11a9": "0xb6", + ",\u116b,\u11aa": "0xb6", + ",\u116b,\u11ab": "0xb6", + ",\u116b,\u11ac": "0xb6", + ",\u116b,\u11ad": "0xb6", + ",\u116b,\u11ae": "0xb6", + ",\u116b,\u11af": "0xb6", + ",\u116b,\u11b0": "0xb6", + ",\u116b,\u11b1": "0xb6", + ",\u116b,\u11b2": "0xb6", + ",\u116b,\u11b3": "0xb6", + ",\u116b,\u11b4": "0xb6", + ",\u116b,\u11b5": "0xb6", + ",\u116b,\u11b6": "0xb6", + ",\u116b,\u11b7": "0xb6", + ",\u116b,\u11b8": "0xb6", + ",\u116b,\u11b9": "0xb6", + ",\u116b,\u11ba": "0xb6", + ",\u116b,\u11bb": "0xb6", + ",\u116b,\u11bc": "0xb6", + ",\u116b,\u11bd": "0xb6", + ",\u116b,\u11be": "0xb6", + ",\u116b,\u11bf": "0xb6", + ",\u116b,\u11c0": "0xb6", + ",\u116b,\u11c1": "0xb6", + ",\u116b,\u11c2": "0xb6", + ",\u1170,\u11a8": "0xb6", + ",\u1170,\u11a9": "0xb6", + ",\u1170,\u11aa": "0xb6", + ",\u1170,\u11ab": "0xb6", + ",\u1170,\u11ac": "0xb6", + ",\u1170,\u11ad": "0xb6", + ",\u1170,\u11ae": "0xb6", + ",\u1170,\u11af": "0xb6", + ",\u1170,\u11b0": "0xb6", + ",\u1170,\u11b1": "0xb6", + ",\u1170,\u11b2": "0xb6", + ",\u1170,\u11b3": "0xb6", + ",\u1170,\u11b4": "0xb6", + ",\u1170,\u11b5": "0xb6", + ",\u1170,\u11b6": "0xb6", + ",\u1170,\u11b7": "0xb6", + ",\u1170,\u11b8": "0xb6", + ",\u1170,\u11b9": "0xb6", + ",\u1170,\u11ba": "0xb6", + ",\u1170,\u11bb": "0xb6", + ",\u1170,\u11bc": "0xb6", + ",\u1170,\u11bd": "0xb6", + ",\u1170,\u11be": "0xb6", + ",\u1170,\u11bf": "0xb6", + ",\u1170,\u11c0": "0xb6", + ",\u1170,\u11c1": "0xb6", + ",\u1170,\u11c2": "0xb6" + } + } + ], + "\u1105": [ + { + "defaultGlyph": "0x53", + "alternatives": { + ",\u1161": "0x0b", + ",\u1175": "0x0b", + ",\u1162": "0x38", + ",\u1165": "0x28", + ",\u1167": "0x28", + ",\u1163": "0x0b", + ",\u1164": "0x38" + } + }, + { + "defaultGlyph": "0x72", + "alternatives": {} + }, + { + "defaultGlyph": "0x95", + "alternatives": { + ",\u116a": "0xb7", + ",\u116b": "0xb7", + ",\u1170": "0xb7" + } + }, + { + "defaultGlyph": "0x28", + "alternatives": { + ",\u1175,\u11ba": "0x0b", + ",\u1175,\u11ab": "0x0b", + ",\u1161,\u11b8": "0x0b", + ",\u1175,\u11b8": "0x0b", + ",\u1175,\u11af": "0x0b", + ",\u1161,\u11b7": "0x0b", + ",\u1161,\u11ab": "0x0b", + ",\u1161,\u11a8": "0x0b", + ",\u1175,\u11b7": "0x0b", + ",\u1161,\u11bc": "0x0b", + ",\u1161,\u11af": "0x0b", + ",\u1161,\u11bb": "0x0b", + ",\u1175,\u11bc": "0x0b", + ",\u1163,\u11bc": "0x0b", + ",\u1162,\u11b8": "0x38", + ",\u1162,\u11ba": "0x38", + ",\u1162,\u11ab": "0x38", + ",\u1162,\u11b7": "0x38", + ",\u1162,\u11bb": "0x38", + ",\u1162,\u11a8": "0x38", + ",\u1166,\u11ab": "0x53", + ",\u1166,\u11ba": "0x53", + ",\u1166,\u11b7": "0x53", + ",\u1175,\u11a8": "0x0b", + ",\u1175,\u11a9": "0x0b", + ",\u1175,\u11aa": "0x0b", + ",\u1175,\u11ac": "0x0b", + ",\u1175,\u11ad": "0x0b", + ",\u1175,\u11ae": "0x0b", + ",\u1175,\u11b0": "0x0b", + ",\u1175,\u11b1": "0x0b", + ",\u1175,\u11b2": "0x0b", + ",\u1175,\u11b3": "0x0b", + ",\u1175,\u11b4": "0x0b", + ",\u1175,\u11b5": "0x0b", + ",\u1175,\u11b6": "0x0b", + ",\u1175,\u11b9": "0x0b", + ",\u1175,\u11bb": "0x0b", + ",\u1175,\u11bd": "0x0b", + ",\u1175,\u11be": "0x0b", + ",\u1175,\u11bf": "0x0b", + ",\u1175,\u11c0": "0x0b", + ",\u1175,\u11c1": "0x0b", + ",\u1175,\u11c2": "0x0b", + ",\u1161,\u11a9": "0x0b", + ",\u1161,\u11aa": "0x0b", + ",\u1161,\u11ac": "0x0b", + ",\u1161,\u11ad": "0x0b", + ",\u1161,\u11ae": "0x0b", + ",\u1161,\u11b0": "0x0b", + ",\u1161,\u11b1": "0x0b", + ",\u1161,\u11b2": "0x0b", + ",\u1161,\u11b3": "0x0b", + ",\u1161,\u11b4": "0x0b", + ",\u1161,\u11b5": "0x0b", + ",\u1161,\u11b6": "0x0b", + ",\u1161,\u11b9": "0x0b", + ",\u1161,\u11ba": "0x0b", + ",\u1161,\u11bd": "0x0b", + ",\u1161,\u11be": "0x0b", + ",\u1161,\u11bf": "0x0b", + ",\u1161,\u11c0": "0x0b", + ",\u1161,\u11c1": "0x0b", + ",\u1161,\u11c2": "0x0b", + ",\u1162,\u11a9": "0x38", + ",\u1162,\u11aa": "0x38", + ",\u1162,\u11ac": "0x38", + ",\u1162,\u11ad": "0x38", + ",\u1162,\u11ae": "0x38", + ",\u1162,\u11af": "0x38", + ",\u1162,\u11b0": "0x38", + ",\u1162,\u11b1": "0x38", + ",\u1162,\u11b2": "0x38", + ",\u1162,\u11b3": "0x38", + ",\u1162,\u11b4": "0x38", + ",\u1162,\u11b5": "0x38", + ",\u1162,\u11b6": "0x38", + ",\u1162,\u11b9": "0x38", + ",\u1162,\u11bc": "0x38", + ",\u1162,\u11bd": "0x38", + ",\u1162,\u11be": "0x38", + ",\u1162,\u11bf": "0x38", + ",\u1162,\u11c0": "0x38", + ",\u1162,\u11c1": "0x38", + ",\u1162,\u11c2": "0x38", + ",\u1164,\u11a8": "0x38", + ",\u1164,\u11a9": "0x38", + ",\u1164,\u11aa": "0x38", + ",\u1164,\u11ab": "0x38", + ",\u1164,\u11ac": "0x38", + ",\u1164,\u11ad": "0x38", + ",\u1164,\u11ae": "0x38", + ",\u1164,\u11af": "0x38", + ",\u1164,\u11b0": "0x38", + ",\u1164,\u11b1": "0x38", + ",\u1164,\u11b2": "0x38", + ",\u1164,\u11b3": "0x38", + ",\u1164,\u11b4": "0x38", + ",\u1164,\u11b5": "0x38", + ",\u1164,\u11b6": "0x38", + ",\u1164,\u11b7": "0x38", + ",\u1164,\u11b8": "0x38", + ",\u1164,\u11b9": "0x38", + ",\u1164,\u11ba": "0x38", + ",\u1164,\u11bb": "0x38", + ",\u1164,\u11bc": "0x38", + ",\u1164,\u11bd": "0x38", + ",\u1164,\u11be": "0x38", + ",\u1164,\u11bf": "0x38", + ",\u1164,\u11c0": "0x38", + ",\u1164,\u11c1": "0x38", + ",\u1164,\u11c2": "0x38", + ",\u1166,\u11a8": "0x53", + ",\u1166,\u11a9": "0x53", + ",\u1166,\u11aa": "0x53", + ",\u1166,\u11ac": "0x53", + ",\u1166,\u11ad": "0x53", + ",\u1166,\u11ae": "0x53", + ",\u1166,\u11af": "0x53", + ",\u1166,\u11b0": "0x53", + ",\u1166,\u11b1": "0x53", + ",\u1166,\u11b2": "0x53", + ",\u1166,\u11b3": "0x53", + ",\u1166,\u11b4": "0x53", + ",\u1166,\u11b5": "0x53", + ",\u1166,\u11b6": "0x53", + ",\u1166,\u11b8": "0x53", + ",\u1166,\u11b9": "0x53", + ",\u1166,\u11bb": "0x53", + ",\u1166,\u11bc": "0x53", + ",\u1166,\u11bd": "0x53", + ",\u1166,\u11be": "0x53", + ",\u1166,\u11bf": "0x53", + ",\u1166,\u11c0": "0x53", + ",\u1166,\u11c1": "0x53", + ",\u1166,\u11c2": "0x53", + ",\u1168,\u11a8": "0x53", + ",\u1168,\u11a9": "0x53", + ",\u1168,\u11aa": "0x53", + ",\u1168,\u11ab": "0x53", + ",\u1168,\u11ac": "0x53", + ",\u1168,\u11ad": "0x53", + ",\u1168,\u11ae": "0x53", + ",\u1168,\u11af": "0x53", + ",\u1168,\u11b0": "0x53", + ",\u1168,\u11b1": "0x53", + ",\u1168,\u11b2": "0x53", + ",\u1168,\u11b3": "0x53", + ",\u1168,\u11b4": "0x53", + ",\u1168,\u11b5": "0x53", + ",\u1168,\u11b6": "0x53", + ",\u1168,\u11b7": "0x53", + ",\u1168,\u11b8": "0x53", + ",\u1168,\u11b9": "0x53", + ",\u1168,\u11ba": "0x53", + ",\u1168,\u11bb": "0x53", + ",\u1168,\u11bc": "0x53", + ",\u1168,\u11bd": "0x53", + ",\u1168,\u11be": "0x53", + ",\u1168,\u11bf": "0x53", + ",\u1168,\u11c0": "0x53", + ",\u1168,\u11c1": "0x53", + ",\u1168,\u11c2": "0x53" + } + }, + { + "defaultGlyph": "0x72", + "alternatives": {} + }, + { + "defaultGlyph": "0x95", + "alternatives": { + ",\u116a,\u11a8": "0xb7", + ",\u116a,\u11a9": "0xb7", + ",\u116a,\u11aa": "0xb7", + ",\u116a,\u11ab": "0xb7", + ",\u116a,\u11ac": "0xb7", + ",\u116a,\u11ad": "0xb7", + ",\u116a,\u11ae": "0xb7", + ",\u116a,\u11af": "0xb7", + ",\u116a,\u11b0": "0xb7", + ",\u116a,\u11b1": "0xb7", + ",\u116a,\u11b2": "0xb7", + ",\u116a,\u11b3": "0xb7", + ",\u116a,\u11b4": "0xb7", + ",\u116a,\u11b5": "0xb7", + ",\u116a,\u11b6": "0xb7", + ",\u116a,\u11b7": "0xb7", + ",\u116a,\u11b8": "0xb7", + ",\u116a,\u11b9": "0xb7", + ",\u116a,\u11ba": "0xb7", + ",\u116a,\u11bb": "0xb7", + ",\u116a,\u11bc": "0xb7", + ",\u116a,\u11bd": "0xb7", + ",\u116a,\u11be": "0xb7", + ",\u116a,\u11bf": "0xb7", + ",\u116a,\u11c0": "0xb7", + ",\u116a,\u11c1": "0xb7", + ",\u116a,\u11c2": "0xb7", + ",\u116b,\u11a8": "0xb7", + ",\u116b,\u11a9": "0xb7", + ",\u116b,\u11aa": "0xb7", + ",\u116b,\u11ab": "0xb7", + ",\u116b,\u11ac": "0xb7", + ",\u116b,\u11ad": "0xb7", + ",\u116b,\u11ae": "0xb7", + ",\u116b,\u11af": "0xb7", + ",\u116b,\u11b0": "0xb7", + ",\u116b,\u11b1": "0xb7", + ",\u116b,\u11b2": "0xb7", + ",\u116b,\u11b3": "0xb7", + ",\u116b,\u11b4": "0xb7", + ",\u116b,\u11b5": "0xb7", + ",\u116b,\u11b6": "0xb7", + ",\u116b,\u11b7": "0xb7", + ",\u116b,\u11b8": "0xb7", + ",\u116b,\u11b9": "0xb7", + ",\u116b,\u11ba": "0xb7", + ",\u116b,\u11bb": "0xb7", + ",\u116b,\u11bc": "0xb7", + ",\u116b,\u11bd": "0xb7", + ",\u116b,\u11be": "0xb7", + ",\u116b,\u11bf": "0xb7", + ",\u116b,\u11c0": "0xb7", + ",\u116b,\u11c1": "0xb7", + ",\u116b,\u11c2": "0xb7", + ",\u1170,\u11a8": "0xb7", + ",\u1170,\u11a9": "0xb7", + ",\u1170,\u11aa": "0xb7", + ",\u1170,\u11ab": "0xb7", + ",\u1170,\u11ac": "0xb7", + ",\u1170,\u11ad": "0xb7", + ",\u1170,\u11ae": "0xb7", + ",\u1170,\u11af": "0xb7", + ",\u1170,\u11b0": "0xb7", + ",\u1170,\u11b1": "0xb7", + ",\u1170,\u11b2": "0xb7", + ",\u1170,\u11b3": "0xb7", + ",\u1170,\u11b4": "0xb7", + ",\u1170,\u11b5": "0xb7", + ",\u1170,\u11b6": "0xb7", + ",\u1170,\u11b7": "0xb7", + ",\u1170,\u11b8": "0xb7", + ",\u1170,\u11b9": "0xb7", + ",\u1170,\u11ba": "0xb7", + ",\u1170,\u11bb": "0xb7", + ",\u1170,\u11bc": "0xb7", + ",\u1170,\u11bd": "0xb7", + ",\u1170,\u11be": "0xb7", + ",\u1170,\u11bf": "0xb7", + ",\u1170,\u11c0": "0xb7", + ",\u1170,\u11c1": "0xb7", + ",\u1170,\u11c2": "0xb7" + } + } + ], + "\u1106": [ + { + "defaultGlyph": "0x0c", + "alternatives": { + ",\u1166": "0x39", + ",\u1162": "0x39", + ",\u1164": "0x39", + ",\u1168": "0x39" + } + }, + { + "defaultGlyph": "0x73", + "alternatives": {} + }, + { + "defaultGlyph": "0x96", + "alternatives": { + ",\u116a": "0xb2", + ",\u116b": "0xb2", + ",\u1170": "0xb2" + } + }, + { + "defaultGlyph": "0x0c", + "alternatives": { + ",\u1162,\u11ba": "0x39", + ",\u1166,\u11ba": "0x39", + ",\u1162,\u11bc": "0x39", + ",\u1162,\u11ab": "0x39", + ",\u1162,\u11bd": "0x39", + ",\u1162,\u11bb": "0x39", + ",\u1162,\u11b7": "0x39", + ",\u1162,\u11a8": "0x39", + ",\u1162,\u11a9": "0x39", + ",\u1162,\u11aa": "0x39", + ",\u1162,\u11ac": "0x39", + ",\u1162,\u11ad": "0x39", + ",\u1162,\u11ae": "0x39", + ",\u1162,\u11af": "0x39", + ",\u1162,\u11b0": "0x39", + ",\u1162,\u11b1": "0x39", + ",\u1162,\u11b2": "0x39", + ",\u1162,\u11b3": "0x39", + ",\u1162,\u11b4": "0x39", + ",\u1162,\u11b5": "0x39", + ",\u1162,\u11b6": "0x39", + ",\u1162,\u11b8": "0x39", + ",\u1162,\u11b9": "0x39", + ",\u1162,\u11be": "0x39", + ",\u1162,\u11bf": "0x39", + ",\u1162,\u11c0": "0x39", + ",\u1162,\u11c1": "0x39", + ",\u1162,\u11c2": "0x39", + ",\u1164,\u11a8": "0x39", + ",\u1164,\u11a9": "0x39", + ",\u1164,\u11aa": "0x39", + ",\u1164,\u11ab": "0x39", + ",\u1164,\u11ac": "0x39", + ",\u1164,\u11ad": "0x39", + ",\u1164,\u11ae": "0x39", + ",\u1164,\u11af": "0x39", + ",\u1164,\u11b0": "0x39", + ",\u1164,\u11b1": "0x39", + ",\u1164,\u11b2": "0x39", + ",\u1164,\u11b3": "0x39", + ",\u1164,\u11b4": "0x39", + ",\u1164,\u11b5": "0x39", + ",\u1164,\u11b6": "0x39", + ",\u1164,\u11b7": "0x39", + ",\u1164,\u11b8": "0x39", + ",\u1164,\u11b9": "0x39", + ",\u1164,\u11ba": "0x39", + ",\u1164,\u11bb": "0x39", + ",\u1164,\u11bc": "0x39", + ",\u1164,\u11bd": "0x39", + ",\u1164,\u11be": "0x39", + ",\u1164,\u11bf": "0x39", + ",\u1164,\u11c0": "0x39", + ",\u1164,\u11c1": "0x39", + ",\u1164,\u11c2": "0x39", + ",\u1166,\u11a8": "0x39", + ",\u1166,\u11a9": "0x39", + ",\u1166,\u11aa": "0x39", + ",\u1166,\u11ab": "0x39", + ",\u1166,\u11ac": "0x39", + ",\u1166,\u11ad": "0x39", + ",\u1166,\u11ae": "0x39", + ",\u1166,\u11af": "0x39", + ",\u1166,\u11b0": "0x39", + ",\u1166,\u11b1": "0x39", + ",\u1166,\u11b2": "0x39", + ",\u1166,\u11b3": "0x39", + ",\u1166,\u11b4": "0x39", + ",\u1166,\u11b5": "0x39", + ",\u1166,\u11b6": "0x39", + ",\u1166,\u11b7": "0x39", + ",\u1166,\u11b8": "0x39", + ",\u1166,\u11b9": "0x39", + ",\u1166,\u11bb": "0x39", + ",\u1166,\u11bc": "0x39", + ",\u1166,\u11bd": "0x39", + ",\u1166,\u11be": "0x39", + ",\u1166,\u11bf": "0x39", + ",\u1166,\u11c0": "0x39", + ",\u1166,\u11c1": "0x39", + ",\u1166,\u11c2": "0x39", + ",\u1168,\u11a8": "0x39", + ",\u1168,\u11a9": "0x39", + ",\u1168,\u11aa": "0x39", + ",\u1168,\u11ab": "0x39", + ",\u1168,\u11ac": "0x39", + ",\u1168,\u11ad": "0x39", + ",\u1168,\u11ae": "0x39", + ",\u1168,\u11af": "0x39", + ",\u1168,\u11b0": "0x39", + ",\u1168,\u11b1": "0x39", + ",\u1168,\u11b2": "0x39", + ",\u1168,\u11b3": "0x39", + ",\u1168,\u11b4": "0x39", + ",\u1168,\u11b5": "0x39", + ",\u1168,\u11b6": "0x39", + ",\u1168,\u11b7": "0x39", + ",\u1168,\u11b8": "0x39", + ",\u1168,\u11b9": "0x39", + ",\u1168,\u11ba": "0x39", + ",\u1168,\u11bb": "0x39", + ",\u1168,\u11bc": "0x39", + ",\u1168,\u11bd": "0x39", + ",\u1168,\u11be": "0x39", + ",\u1168,\u11bf": "0x39", + ",\u1168,\u11c0": "0x39", + ",\u1168,\u11c1": "0x39", + ",\u1168,\u11c2": "0x39" + } + }, + { + "defaultGlyph": "0x73", + "alternatives": {} + }, + { + "defaultGlyph": "0x96", + "alternatives": { + ",\u116a,\u11a8": "0xb2", + ",\u116a,\u11a9": "0xb2", + ",\u116a,\u11aa": "0xb2", + ",\u116a,\u11ab": "0xb2", + ",\u116a,\u11ac": "0xb2", + ",\u116a,\u11ad": "0xb2", + ",\u116a,\u11ae": "0xb2", + ",\u116a,\u11af": "0xb2", + ",\u116a,\u11b0": "0xb2", + ",\u116a,\u11b1": "0xb2", + ",\u116a,\u11b2": "0xb2", + ",\u116a,\u11b3": "0xb2", + ",\u116a,\u11b4": "0xb2", + ",\u116a,\u11b5": "0xb2", + ",\u116a,\u11b6": "0xb2", + ",\u116a,\u11b7": "0xb2", + ",\u116a,\u11b8": "0xb2", + ",\u116a,\u11b9": "0xb2", + ",\u116a,\u11ba": "0xb2", + ",\u116a,\u11bb": "0xb2", + ",\u116a,\u11bc": "0xb2", + ",\u116a,\u11bd": "0xb2", + ",\u116a,\u11be": "0xb2", + ",\u116a,\u11bf": "0xb2", + ",\u116a,\u11c0": "0xb2", + ",\u116a,\u11c1": "0xb2", + ",\u116a,\u11c2": "0xb2", + ",\u116b,\u11a8": "0xb2", + ",\u116b,\u11a9": "0xb2", + ",\u116b,\u11aa": "0xb2", + ",\u116b,\u11ab": "0xb2", + ",\u116b,\u11ac": "0xb2", + ",\u116b,\u11ad": "0xb2", + ",\u116b,\u11ae": "0xb2", + ",\u116b,\u11af": "0xb2", + ",\u116b,\u11b0": "0xb2", + ",\u116b,\u11b1": "0xb2", + ",\u116b,\u11b2": "0xb2", + ",\u116b,\u11b3": "0xb2", + ",\u116b,\u11b4": "0xb2", + ",\u116b,\u11b5": "0xb2", + ",\u116b,\u11b6": "0xb2", + ",\u116b,\u11b7": "0xb2", + ",\u116b,\u11b8": "0xb2", + ",\u116b,\u11b9": "0xb2", + ",\u116b,\u11ba": "0xb2", + ",\u116b,\u11bb": "0xb2", + ",\u116b,\u11bc": "0xb2", + ",\u116b,\u11bd": "0xb2", + ",\u116b,\u11be": "0xb2", + ",\u116b,\u11bf": "0xb2", + ",\u116b,\u11c0": "0xb2", + ",\u116b,\u11c1": "0xb2", + ",\u116b,\u11c2": "0xb2", + ",\u1170,\u11a8": "0xb2", + ",\u1170,\u11a9": "0xb2", + ",\u1170,\u11aa": "0xb2", + ",\u1170,\u11ab": "0xb2", + ",\u1170,\u11ac": "0xb2", + ",\u1170,\u11ad": "0xb2", + ",\u1170,\u11ae": "0xb2", + ",\u1170,\u11af": "0xb2", + ",\u1170,\u11b0": "0xb2", + ",\u1170,\u11b1": "0xb2", + ",\u1170,\u11b2": "0xb2", + ",\u1170,\u11b3": "0xb2", + ",\u1170,\u11b4": "0xb2", + ",\u1170,\u11b5": "0xb2", + ",\u1170,\u11b6": "0xb2", + ",\u1170,\u11b7": "0xb2", + ",\u1170,\u11b8": "0xb2", + ",\u1170,\u11b9": "0xb2", + ",\u1170,\u11ba": "0xb2", + ",\u1170,\u11bb": "0xb2", + ",\u1170,\u11bc": "0xb2", + ",\u1170,\u11bd": "0xb2", + ",\u1170,\u11be": "0xb2", + ",\u1170,\u11bf": "0xb2", + ",\u1170,\u11c0": "0xb2", + ",\u1170,\u11c1": "0xb2", + ",\u1170,\u11c2": "0xb2" + } + } + ], + "\u1107": [ + { + "defaultGlyph": "0x0d", + "alternatives": { + ",\u1162": "0x3a", + ",\u1166": "0x3a", + ",\u1164": "0x3a", + ",\u1168": "0x3a" + } + }, + { + "defaultGlyph": "0x74", + "alternatives": {} + }, + { + "defaultGlyph": "0x97", + "alternatives": { + ",\u116a": "0xb8", + ",\u116b": "0xb8", + ",\u1170": "0xb8" + } + }, + { + "defaultGlyph": "0x0d", + "alternatives": { + ",\u1166,\u11af": "0x3a", + ",\u1162,\u11af": "0x3a", + ",\u1166,\u11ab": "0x3a", + ",\u1162,\u11b7": "0x3a", + ",\u1162,\u11ba": "0x3a", + ",\u1162,\u11a8": "0x3a", + ",\u1162,\u11a9": "0x3a", + ",\u1162,\u11aa": "0x3a", + ",\u1162,\u11ab": "0x3a", + ",\u1162,\u11ac": "0x3a", + ",\u1162,\u11ad": "0x3a", + ",\u1162,\u11ae": "0x3a", + ",\u1162,\u11b0": "0x3a", + ",\u1162,\u11b1": "0x3a", + ",\u1162,\u11b2": "0x3a", + ",\u1162,\u11b3": "0x3a", + ",\u1162,\u11b4": "0x3a", + ",\u1162,\u11b5": "0x3a", + ",\u1162,\u11b6": "0x3a", + ",\u1162,\u11b8": "0x3a", + ",\u1162,\u11b9": "0x3a", + ",\u1162,\u11bb": "0x3a", + ",\u1162,\u11bc": "0x3a", + ",\u1162,\u11bd": "0x3a", + ",\u1162,\u11be": "0x3a", + ",\u1162,\u11bf": "0x3a", + ",\u1162,\u11c0": "0x3a", + ",\u1162,\u11c1": "0x3a", + ",\u1162,\u11c2": "0x3a", + ",\u1164,\u11a8": "0x3a", + ",\u1164,\u11a9": "0x3a", + ",\u1164,\u11aa": "0x3a", + ",\u1164,\u11ab": "0x3a", + ",\u1164,\u11ac": "0x3a", + ",\u1164,\u11ad": "0x3a", + ",\u1164,\u11ae": "0x3a", + ",\u1164,\u11af": "0x3a", + ",\u1164,\u11b0": "0x3a", + ",\u1164,\u11b1": "0x3a", + ",\u1164,\u11b2": "0x3a", + ",\u1164,\u11b3": "0x3a", + ",\u1164,\u11b4": "0x3a", + ",\u1164,\u11b5": "0x3a", + ",\u1164,\u11b6": "0x3a", + ",\u1164,\u11b7": "0x3a", + ",\u1164,\u11b8": "0x3a", + ",\u1164,\u11b9": "0x3a", + ",\u1164,\u11ba": "0x3a", + ",\u1164,\u11bb": "0x3a", + ",\u1164,\u11bc": "0x3a", + ",\u1164,\u11bd": "0x3a", + ",\u1164,\u11be": "0x3a", + ",\u1164,\u11bf": "0x3a", + ",\u1164,\u11c0": "0x3a", + ",\u1164,\u11c1": "0x3a", + ",\u1164,\u11c2": "0x3a", + ",\u1166,\u11a8": "0x3a", + ",\u1166,\u11a9": "0x3a", + ",\u1166,\u11aa": "0x3a", + ",\u1166,\u11ac": "0x3a", + ",\u1166,\u11ad": "0x3a", + ",\u1166,\u11ae": "0x3a", + ",\u1166,\u11b0": "0x3a", + ",\u1166,\u11b1": "0x3a", + ",\u1166,\u11b2": "0x3a", + ",\u1166,\u11b3": "0x3a", + ",\u1166,\u11b4": "0x3a", + ",\u1166,\u11b5": "0x3a", + ",\u1166,\u11b6": "0x3a", + ",\u1166,\u11b7": "0x3a", + ",\u1166,\u11b8": "0x3a", + ",\u1166,\u11b9": "0x3a", + ",\u1166,\u11ba": "0x3a", + ",\u1166,\u11bb": "0x3a", + ",\u1166,\u11bc": "0x3a", + ",\u1166,\u11bd": "0x3a", + ",\u1166,\u11be": "0x3a", + ",\u1166,\u11bf": "0x3a", + ",\u1166,\u11c0": "0x3a", + ",\u1166,\u11c1": "0x3a", + ",\u1166,\u11c2": "0x3a", + ",\u1168,\u11a8": "0x3a", + ",\u1168,\u11a9": "0x3a", + ",\u1168,\u11aa": "0x3a", + ",\u1168,\u11ab": "0x3a", + ",\u1168,\u11ac": "0x3a", + ",\u1168,\u11ad": "0x3a", + ",\u1168,\u11ae": "0x3a", + ",\u1168,\u11af": "0x3a", + ",\u1168,\u11b0": "0x3a", + ",\u1168,\u11b1": "0x3a", + ",\u1168,\u11b2": "0x3a", + ",\u1168,\u11b3": "0x3a", + ",\u1168,\u11b4": "0x3a", + ",\u1168,\u11b5": "0x3a", + ",\u1168,\u11b6": "0x3a", + ",\u1168,\u11b7": "0x3a", + ",\u1168,\u11b8": "0x3a", + ",\u1168,\u11b9": "0x3a", + ",\u1168,\u11ba": "0x3a", + ",\u1168,\u11bb": "0x3a", + ",\u1168,\u11bc": "0x3a", + ",\u1168,\u11bd": "0x3a", + ",\u1168,\u11be": "0x3a", + ",\u1168,\u11bf": "0x3a", + ",\u1168,\u11c0": "0x3a", + ",\u1168,\u11c1": "0x3a", + ",\u1168,\u11c2": "0x3a" + } + }, + { + "defaultGlyph": "0x74", + "alternatives": {} + }, + { + "defaultGlyph": "0x97", + "alternatives": { + ",\u116a,\u11a8": "0xb8", + ",\u116a,\u11a9": "0xb8", + ",\u116a,\u11aa": "0xb8", + ",\u116a,\u11ab": "0xb8", + ",\u116a,\u11ac": "0xb8", + ",\u116a,\u11ad": "0xb8", + ",\u116a,\u11ae": "0xb8", + ",\u116a,\u11af": "0xb8", + ",\u116a,\u11b0": "0xb8", + ",\u116a,\u11b1": "0xb8", + ",\u116a,\u11b2": "0xb8", + ",\u116a,\u11b3": "0xb8", + ",\u116a,\u11b4": "0xb8", + ",\u116a,\u11b5": "0xb8", + ",\u116a,\u11b6": "0xb8", + ",\u116a,\u11b7": "0xb8", + ",\u116a,\u11b8": "0xb8", + ",\u116a,\u11b9": "0xb8", + ",\u116a,\u11ba": "0xb8", + ",\u116a,\u11bb": "0xb8", + ",\u116a,\u11bc": "0xb8", + ",\u116a,\u11bd": "0xb8", + ",\u116a,\u11be": "0xb8", + ",\u116a,\u11bf": "0xb8", + ",\u116a,\u11c0": "0xb8", + ",\u116a,\u11c1": "0xb8", + ",\u116a,\u11c2": "0xb8", + ",\u116b,\u11a8": "0xb8", + ",\u116b,\u11a9": "0xb8", + ",\u116b,\u11aa": "0xb8", + ",\u116b,\u11ab": "0xb8", + ",\u116b,\u11ac": "0xb8", + ",\u116b,\u11ad": "0xb8", + ",\u116b,\u11ae": "0xb8", + ",\u116b,\u11af": "0xb8", + ",\u116b,\u11b0": "0xb8", + ",\u116b,\u11b1": "0xb8", + ",\u116b,\u11b2": "0xb8", + ",\u116b,\u11b3": "0xb8", + ",\u116b,\u11b4": "0xb8", + ",\u116b,\u11b5": "0xb8", + ",\u116b,\u11b6": "0xb8", + ",\u116b,\u11b7": "0xb8", + ",\u116b,\u11b8": "0xb8", + ",\u116b,\u11b9": "0xb8", + ",\u116b,\u11ba": "0xb8", + ",\u116b,\u11bb": "0xb8", + ",\u116b,\u11bc": "0xb8", + ",\u116b,\u11bd": "0xb8", + ",\u116b,\u11be": "0xb8", + ",\u116b,\u11bf": "0xb8", + ",\u116b,\u11c0": "0xb8", + ",\u116b,\u11c1": "0xb8", + ",\u116b,\u11c2": "0xb8", + ",\u1170,\u11a8": "0xb8", + ",\u1170,\u11a9": "0xb8", + ",\u1170,\u11aa": "0xb8", + ",\u1170,\u11ab": "0xb8", + ",\u1170,\u11ac": "0xb8", + ",\u1170,\u11ad": "0xb8", + ",\u1170,\u11ae": "0xb8", + ",\u1170,\u11af": "0xb8", + ",\u1170,\u11b0": "0xb8", + ",\u1170,\u11b1": "0xb8", + ",\u1170,\u11b2": "0xb8", + ",\u1170,\u11b3": "0xb8", + ",\u1170,\u11b4": "0xb8", + ",\u1170,\u11b5": "0xb8", + ",\u1170,\u11b6": "0xb8", + ",\u1170,\u11b7": "0xb8", + ",\u1170,\u11b8": "0xb8", + ",\u1170,\u11b9": "0xb8", + ",\u1170,\u11ba": "0xb8", + ",\u1170,\u11bb": "0xb8", + ",\u1170,\u11bc": "0xb8", + ",\u1170,\u11bd": "0xb8", + ",\u1170,\u11be": "0xb8", + ",\u1170,\u11bf": "0xb8", + ",\u1170,\u11c0": "0xb8", + ",\u1170,\u11c1": "0xb8", + ",\u1170,\u11c2": "0xb8" + } + } + ], + "\u1108": [ + { + "defaultGlyph": "0x3b", + "alternatives": { + ",\u1162": "0x3b", + ",\u1165": "0x0e", + ",\u1175": "0x0e" + } + }, + { + "defaultGlyph": "0x75", + "alternatives": {} + }, + { + "defaultGlyph": "0x98", + "alternatives": {} + }, + { + "defaultGlyph": "0x0e", + "alternatives": { + ",\u1162,\u11bb": "0x3b", + ",\u1162,\u11a8": "0x3b", + ",\u1162,\u11a9": "0x3b", + ",\u1162,\u11aa": "0x3b", + ",\u1162,\u11ab": "0x3b", + ",\u1162,\u11ac": "0x3b", + ",\u1162,\u11ad": "0x3b", + ",\u1162,\u11ae": "0x3b", + ",\u1162,\u11af": "0x3b", + ",\u1162,\u11b0": "0x3b", + ",\u1162,\u11b1": "0x3b", + ",\u1162,\u11b2": "0x3b", + ",\u1162,\u11b3": "0x3b", + ",\u1162,\u11b4": "0x3b", + ",\u1162,\u11b5": "0x3b", + ",\u1162,\u11b6": "0x3b", + ",\u1162,\u11b7": "0x3b", + ",\u1162,\u11b8": "0x3b", + ",\u1162,\u11b9": "0x3b", + ",\u1162,\u11ba": "0x3b", + ",\u1162,\u11bc": "0x3b", + ",\u1162,\u11bd": "0x3b", + ",\u1162,\u11be": "0x3b", + ",\u1162,\u11bf": "0x3b", + ",\u1162,\u11c0": "0x3b", + ",\u1162,\u11c1": "0x3b", + ",\u1162,\u11c2": "0x3b", + ",\u1163,\u11a8": "0x3b", + ",\u1163,\u11a9": "0x3b", + ",\u1163,\u11aa": "0x3b", + ",\u1163,\u11ab": "0x3b", + ",\u1163,\u11ac": "0x3b", + ",\u1163,\u11ad": "0x3b", + ",\u1163,\u11ae": "0x3b", + ",\u1163,\u11af": "0x3b", + ",\u1163,\u11b0": "0x3b", + ",\u1163,\u11b1": "0x3b", + ",\u1163,\u11b2": "0x3b", + ",\u1163,\u11b3": "0x3b", + ",\u1163,\u11b4": "0x3b", + ",\u1163,\u11b5": "0x3b", + ",\u1163,\u11b6": "0x3b", + ",\u1163,\u11b7": "0x3b", + ",\u1163,\u11b8": "0x3b", + ",\u1163,\u11b9": "0x3b", + ",\u1163,\u11ba": "0x3b", + ",\u1163,\u11bb": "0x3b", + ",\u1163,\u11bc": "0x3b", + ",\u1163,\u11bd": "0x3b", + ",\u1163,\u11be": "0x3b", + ",\u1163,\u11bf": "0x3b", + ",\u1163,\u11c0": "0x3b", + ",\u1163,\u11c1": "0x3b", + ",\u1163,\u11c2": "0x3b", + ",\u1164,\u11a8": "0x3b", + ",\u1164,\u11a9": "0x3b", + ",\u1164,\u11aa": "0x3b", + ",\u1164,\u11ab": "0x3b", + ",\u1164,\u11ac": "0x3b", + ",\u1164,\u11ad": "0x3b", + ",\u1164,\u11ae": "0x3b", + ",\u1164,\u11af": "0x3b", + ",\u1164,\u11b0": "0x3b", + ",\u1164,\u11b1": "0x3b", + ",\u1164,\u11b2": "0x3b", + ",\u1164,\u11b3": "0x3b", + ",\u1164,\u11b4": "0x3b", + ",\u1164,\u11b5": "0x3b", + ",\u1164,\u11b6": "0x3b", + ",\u1164,\u11b7": "0x3b", + ",\u1164,\u11b8": "0x3b", + ",\u1164,\u11b9": "0x3b", + ",\u1164,\u11ba": "0x3b", + ",\u1164,\u11bb": "0x3b", + ",\u1164,\u11bc": "0x3b", + ",\u1164,\u11bd": "0x3b", + ",\u1164,\u11be": "0x3b", + ",\u1164,\u11bf": "0x3b", + ",\u1164,\u11c0": "0x3b", + ",\u1164,\u11c1": "0x3b", + ",\u1164,\u11c2": "0x3b", + ",\u1166,\u11a8": "0x3b", + ",\u1166,\u11a9": "0x3b", + ",\u1166,\u11aa": "0x3b", + ",\u1166,\u11ab": "0x3b", + ",\u1166,\u11ac": "0x3b", + ",\u1166,\u11ad": "0x3b", + ",\u1166,\u11ae": "0x3b", + ",\u1166,\u11af": "0x3b", + ",\u1166,\u11b0": "0x3b", + ",\u1166,\u11b1": "0x3b", + ",\u1166,\u11b2": "0x3b", + ",\u1166,\u11b3": "0x3b", + ",\u1166,\u11b4": "0x3b", + ",\u1166,\u11b5": "0x3b", + ",\u1166,\u11b6": "0x3b", + ",\u1166,\u11b7": "0x3b", + ",\u1166,\u11b8": "0x3b", + ",\u1166,\u11b9": "0x3b", + ",\u1166,\u11ba": "0x3b", + ",\u1166,\u11bb": "0x3b", + ",\u1166,\u11bc": "0x3b", + ",\u1166,\u11bd": "0x3b", + ",\u1166,\u11be": "0x3b", + ",\u1166,\u11bf": "0x3b", + ",\u1166,\u11c0": "0x3b", + ",\u1166,\u11c1": "0x3b", + ",\u1166,\u11c2": "0x3b", + ",\u1167,\u11a8": "0x3b", + ",\u1167,\u11a9": "0x3b", + ",\u1167,\u11aa": "0x3b", + ",\u1167,\u11ab": "0x3b", + ",\u1167,\u11ac": "0x3b", + ",\u1167,\u11ad": "0x3b", + ",\u1167,\u11ae": "0x3b", + ",\u1167,\u11af": "0x3b", + ",\u1167,\u11b0": "0x3b", + ",\u1167,\u11b1": "0x3b", + ",\u1167,\u11b2": "0x3b", + ",\u1167,\u11b3": "0x3b", + ",\u1167,\u11b4": "0x3b", + ",\u1167,\u11b5": "0x3b", + ",\u1167,\u11b6": "0x3b", + ",\u1167,\u11b7": "0x3b", + ",\u1167,\u11b8": "0x3b", + ",\u1167,\u11b9": "0x3b", + ",\u1167,\u11ba": "0x3b", + ",\u1167,\u11bb": "0x3b", + ",\u1167,\u11bc": "0x3b", + ",\u1167,\u11bd": "0x3b", + ",\u1167,\u11be": "0x3b", + ",\u1167,\u11bf": "0x3b", + ",\u1167,\u11c0": "0x3b", + ",\u1167,\u11c1": "0x3b", + ",\u1167,\u11c2": "0x3b", + ",\u1168,\u11a8": "0x3b", + ",\u1168,\u11a9": "0x3b", + ",\u1168,\u11aa": "0x3b", + ",\u1168,\u11ab": "0x3b", + ",\u1168,\u11ac": "0x3b", + ",\u1168,\u11ad": "0x3b", + ",\u1168,\u11ae": "0x3b", + ",\u1168,\u11af": "0x3b", + ",\u1168,\u11b0": "0x3b", + ",\u1168,\u11b1": "0x3b", + ",\u1168,\u11b2": "0x3b", + ",\u1168,\u11b3": "0x3b", + ",\u1168,\u11b4": "0x3b", + ",\u1168,\u11b5": "0x3b", + ",\u1168,\u11b6": "0x3b", + ",\u1168,\u11b7": "0x3b", + ",\u1168,\u11b8": "0x3b", + ",\u1168,\u11b9": "0x3b", + ",\u1168,\u11ba": "0x3b", + ",\u1168,\u11bb": "0x3b", + ",\u1168,\u11bc": "0x3b", + ",\u1168,\u11bd": "0x3b", + ",\u1168,\u11be": "0x3b", + ",\u1168,\u11bf": "0x3b", + ",\u1168,\u11c0": "0x3b", + ",\u1168,\u11c1": "0x3b", + ",\u1168,\u11c2": "0x3b" + } + }, + { + "defaultGlyph": "0x75", + "alternatives": {} + }, + { + "defaultGlyph": "0x98", + "alternatives": {} + } + ], + "\u1109": [ + { + "defaultGlyph": "0x20", + "alternatives": { + ",\u1162": "0x4b", + ",\u1166": "0x4b", + ",\u1164": "0x4b", + ",\u1168": "0x4b" + } + }, + { + "defaultGlyph": "0x76", + "alternatives": {} + }, + { + "defaultGlyph": "0x99", + "alternatives": { + ",\u116b": "0xb9", + ",\u116a": "0xb9", + ",\u1170": "0xb9" + } + }, + { + "defaultGlyph": "0x20", + "alternatives": { + ",\u1166,\u11ba": "0x4b", + ",\u1162,\u11bc": "0x4b", + ",\u1162,\u11a8": "0x4b", + ",\u1166,\u11b7": "0x4b", + ",\u1166,\u11a8": "0x4b", + ",\u1162,\u11ab": "0x4b", + ",\u1166,\u11ab": "0x4b", + ",\u1162,\u11a9": "0x4b", + ",\u1162,\u11aa": "0x4b", + ",\u1162,\u11ac": "0x4b", + ",\u1162,\u11ad": "0x4b", + ",\u1162,\u11ae": "0x4b", + ",\u1162,\u11af": "0x4b", + ",\u1162,\u11b0": "0x4b", + ",\u1162,\u11b1": "0x4b", + ",\u1162,\u11b2": "0x4b", + ",\u1162,\u11b3": "0x4b", + ",\u1162,\u11b4": "0x4b", + ",\u1162,\u11b5": "0x4b", + ",\u1162,\u11b6": "0x4b", + ",\u1162,\u11b7": "0x4b", + ",\u1162,\u11b8": "0x4b", + ",\u1162,\u11b9": "0x4b", + ",\u1162,\u11ba": "0x4b", + ",\u1162,\u11bb": "0x4b", + ",\u1162,\u11bd": "0x4b", + ",\u1162,\u11be": "0x4b", + ",\u1162,\u11bf": "0x4b", + ",\u1162,\u11c0": "0x4b", + ",\u1162,\u11c1": "0x4b", + ",\u1162,\u11c2": "0x4b", + ",\u1164,\u11a8": "0x4b", + ",\u1164,\u11a9": "0x4b", + ",\u1164,\u11aa": "0x4b", + ",\u1164,\u11ab": "0x4b", + ",\u1164,\u11ac": "0x4b", + ",\u1164,\u11ad": "0x4b", + ",\u1164,\u11ae": "0x4b", + ",\u1164,\u11af": "0x4b", + ",\u1164,\u11b0": "0x4b", + ",\u1164,\u11b1": "0x4b", + ",\u1164,\u11b2": "0x4b", + ",\u1164,\u11b3": "0x4b", + ",\u1164,\u11b4": "0x4b", + ",\u1164,\u11b5": "0x4b", + ",\u1164,\u11b6": "0x4b", + ",\u1164,\u11b7": "0x4b", + ",\u1164,\u11b8": "0x4b", + ",\u1164,\u11b9": "0x4b", + ",\u1164,\u11ba": "0x4b", + ",\u1164,\u11bb": "0x4b", + ",\u1164,\u11bc": "0x4b", + ",\u1164,\u11bd": "0x4b", + ",\u1164,\u11be": "0x4b", + ",\u1164,\u11bf": "0x4b", + ",\u1164,\u11c0": "0x4b", + ",\u1164,\u11c1": "0x4b", + ",\u1164,\u11c2": "0x4b", + ",\u1166,\u11a9": "0x4b", + ",\u1166,\u11aa": "0x4b", + ",\u1166,\u11ac": "0x4b", + ",\u1166,\u11ad": "0x4b", + ",\u1166,\u11ae": "0x4b", + ",\u1166,\u11af": "0x4b", + ",\u1166,\u11b0": "0x4b", + ",\u1166,\u11b1": "0x4b", + ",\u1166,\u11b2": "0x4b", + ",\u1166,\u11b3": "0x4b", + ",\u1166,\u11b4": "0x4b", + ",\u1166,\u11b5": "0x4b", + ",\u1166,\u11b6": "0x4b", + ",\u1166,\u11b8": "0x4b", + ",\u1166,\u11b9": "0x4b", + ",\u1166,\u11bb": "0x4b", + ",\u1166,\u11bc": "0x4b", + ",\u1166,\u11bd": "0x4b", + ",\u1166,\u11be": "0x4b", + ",\u1166,\u11bf": "0x4b", + ",\u1166,\u11c0": "0x4b", + ",\u1166,\u11c1": "0x4b", + ",\u1166,\u11c2": "0x4b", + ",\u1168,\u11a8": "0x4b", + ",\u1168,\u11a9": "0x4b", + ",\u1168,\u11aa": "0x4b", + ",\u1168,\u11ab": "0x4b", + ",\u1168,\u11ac": "0x4b", + ",\u1168,\u11ad": "0x4b", + ",\u1168,\u11ae": "0x4b", + ",\u1168,\u11af": "0x4b", + ",\u1168,\u11b0": "0x4b", + ",\u1168,\u11b1": "0x4b", + ",\u1168,\u11b2": "0x4b", + ",\u1168,\u11b3": "0x4b", + ",\u1168,\u11b4": "0x4b", + ",\u1168,\u11b5": "0x4b", + ",\u1168,\u11b6": "0x4b", + ",\u1168,\u11b7": "0x4b", + ",\u1168,\u11b8": "0x4b", + ",\u1168,\u11b9": "0x4b", + ",\u1168,\u11ba": "0x4b", + ",\u1168,\u11bb": "0x4b", + ",\u1168,\u11bc": "0x4b", + ",\u1168,\u11bd": "0x4b", + ",\u1168,\u11be": "0x4b", + ",\u1168,\u11bf": "0x4b", + ",\u1168,\u11c0": "0x4b", + ",\u1168,\u11c1": "0x4b", + ",\u1168,\u11c2": "0x4b" + } + }, + { + "defaultGlyph": "0x76", + "alternatives": {} + }, + { + "defaultGlyph": "0x99", + "alternatives": { + ",\u116a,\u11a8": "0xb9", + ",\u116a,\u11a9": "0xb9", + ",\u116a,\u11aa": "0xb9", + ",\u116a,\u11ab": "0xb9", + ",\u116a,\u11ac": "0xb9", + ",\u116a,\u11ad": "0xb9", + ",\u116a,\u11ae": "0xb9", + ",\u116a,\u11af": "0xb9", + ",\u116a,\u11b0": "0xb9", + ",\u116a,\u11b1": "0xb9", + ",\u116a,\u11b2": "0xb9", + ",\u116a,\u11b3": "0xb9", + ",\u116a,\u11b4": "0xb9", + ",\u116a,\u11b5": "0xb9", + ",\u116a,\u11b6": "0xb9", + ",\u116a,\u11b7": "0xb9", + ",\u116a,\u11b8": "0xb9", + ",\u116a,\u11b9": "0xb9", + ",\u116a,\u11ba": "0xb9", + ",\u116a,\u11bb": "0xb9", + ",\u116a,\u11bc": "0xb9", + ",\u116a,\u11bd": "0xb9", + ",\u116a,\u11be": "0xb9", + ",\u116a,\u11bf": "0xb9", + ",\u116a,\u11c0": "0xb9", + ",\u116a,\u11c1": "0xb9", + ",\u116a,\u11c2": "0xb9", + ",\u116b,\u11a8": "0xb9", + ",\u116b,\u11a9": "0xb9", + ",\u116b,\u11aa": "0xb9", + ",\u116b,\u11ab": "0xb9", + ",\u116b,\u11ac": "0xb9", + ",\u116b,\u11ad": "0xb9", + ",\u116b,\u11ae": "0xb9", + ",\u116b,\u11af": "0xb9", + ",\u116b,\u11b0": "0xb9", + ",\u116b,\u11b1": "0xb9", + ",\u116b,\u11b2": "0xb9", + ",\u116b,\u11b3": "0xb9", + ",\u116b,\u11b4": "0xb9", + ",\u116b,\u11b5": "0xb9", + ",\u116b,\u11b6": "0xb9", + ",\u116b,\u11b7": "0xb9", + ",\u116b,\u11b8": "0xb9", + ",\u116b,\u11b9": "0xb9", + ",\u116b,\u11ba": "0xb9", + ",\u116b,\u11bb": "0xb9", + ",\u116b,\u11bc": "0xb9", + ",\u116b,\u11bd": "0xb9", + ",\u116b,\u11be": "0xb9", + ",\u116b,\u11bf": "0xb9", + ",\u116b,\u11c0": "0xb9", + ",\u116b,\u11c1": "0xb9", + ",\u116b,\u11c2": "0xb9", + ",\u1170,\u11a8": "0xb9", + ",\u1170,\u11a9": "0xb9", + ",\u1170,\u11aa": "0xb9", + ",\u1170,\u11ab": "0xb9", + ",\u1170,\u11ac": "0xb9", + ",\u1170,\u11ad": "0xb9", + ",\u1170,\u11ae": "0xb9", + ",\u1170,\u11af": "0xb9", + ",\u1170,\u11b0": "0xb9", + ",\u1170,\u11b1": "0xb9", + ",\u1170,\u11b2": "0xb9", + ",\u1170,\u11b3": "0xb9", + ",\u1170,\u11b4": "0xb9", + ",\u1170,\u11b5": "0xb9", + ",\u1170,\u11b6": "0xb9", + ",\u1170,\u11b7": "0xb9", + ",\u1170,\u11b8": "0xb9", + ",\u1170,\u11b9": "0xb9", + ",\u1170,\u11ba": "0xb9", + ",\u1170,\u11bb": "0xb9", + ",\u1170,\u11bc": "0xb9", + ",\u1170,\u11bd": "0xb9", + ",\u1170,\u11be": "0xb9", + ",\u1170,\u11bf": "0xb9", + ",\u1170,\u11c0": "0xb9", + ",\u1170,\u11c1": "0xb9", + ",\u1170,\u11c2": "0xb9" + } + } + ], + "\u110a": [ + { + "defaultGlyph": "0x21", + "alternatives": { + ",\u1166": "0x4c", + ",\u1162": "0x4c", + ",\u1164": "0x4c", + ",\u1165": "0x4c", + ",\u1167": "0x4c", + ",\u1168": "0x4c" + } + }, + { + "defaultGlyph": "0x77", + "alternatives": {} + }, + { + "defaultGlyph": "0x9a", + "alternatives": { + ",\u116a": "0xba", + ",\u116b": "0xba", + ",\u1170": "0xba" + } + }, + { + "defaultGlyph": "0x21", + "alternatives": { + ",\u1166,\u11ab": "0x4c", + ",\u1162,\u11a8": "0x4c", + ",\u1162,\u11a9": "0x4c", + ",\u1162,\u11aa": "0x4c", + ",\u1162,\u11ab": "0x4c", + ",\u1162,\u11ac": "0x4c", + ",\u1162,\u11ad": "0x4c", + ",\u1162,\u11ae": "0x4c", + ",\u1162,\u11af": "0x4c", + ",\u1162,\u11b0": "0x4c", + ",\u1162,\u11b1": "0x4c", + ",\u1162,\u11b2": "0x4c", + ",\u1162,\u11b3": "0x4c", + ",\u1162,\u11b4": "0x4c", + ",\u1162,\u11b5": "0x4c", + ",\u1162,\u11b6": "0x4c", + ",\u1162,\u11b7": "0x4c", + ",\u1162,\u11b8": "0x4c", + ",\u1162,\u11b9": "0x4c", + ",\u1162,\u11ba": "0x4c", + ",\u1162,\u11bb": "0x4c", + ",\u1162,\u11bc": "0x4c", + ",\u1162,\u11bd": "0x4c", + ",\u1162,\u11be": "0x4c", + ",\u1162,\u11bf": "0x4c", + ",\u1162,\u11c0": "0x4c", + ",\u1162,\u11c1": "0x4c", + ",\u1162,\u11c2": "0x4c", + ",\u1163,\u11a8": "0x4c", + ",\u1163,\u11a9": "0x4c", + ",\u1163,\u11aa": "0x4c", + ",\u1163,\u11ab": "0x4c", + ",\u1163,\u11ac": "0x4c", + ",\u1163,\u11ad": "0x4c", + ",\u1163,\u11ae": "0x4c", + ",\u1163,\u11af": "0x4c", + ",\u1163,\u11b0": "0x4c", + ",\u1163,\u11b1": "0x4c", + ",\u1163,\u11b2": "0x4c", + ",\u1163,\u11b3": "0x4c", + ",\u1163,\u11b4": "0x4c", + ",\u1163,\u11b5": "0x4c", + ",\u1163,\u11b6": "0x4c", + ",\u1163,\u11b7": "0x4c", + ",\u1163,\u11b8": "0x4c", + ",\u1163,\u11b9": "0x4c", + ",\u1163,\u11ba": "0x4c", + ",\u1163,\u11bb": "0x4c", + ",\u1163,\u11bc": "0x4c", + ",\u1163,\u11bd": "0x4c", + ",\u1163,\u11be": "0x4c", + ",\u1163,\u11bf": "0x4c", + ",\u1163,\u11c0": "0x4c", + ",\u1163,\u11c1": "0x4c", + ",\u1163,\u11c2": "0x4c", + ",\u1164,\u11a8": "0x4c", + ",\u1164,\u11a9": "0x4c", + ",\u1164,\u11aa": "0x4c", + ",\u1164,\u11ab": "0x4c", + ",\u1164,\u11ac": "0x4c", + ",\u1164,\u11ad": "0x4c", + ",\u1164,\u11ae": "0x4c", + ",\u1164,\u11af": "0x4c", + ",\u1164,\u11b0": "0x4c", + ",\u1164,\u11b1": "0x4c", + ",\u1164,\u11b2": "0x4c", + ",\u1164,\u11b3": "0x4c", + ",\u1164,\u11b4": "0x4c", + ",\u1164,\u11b5": "0x4c", + ",\u1164,\u11b6": "0x4c", + ",\u1164,\u11b7": "0x4c", + ",\u1164,\u11b8": "0x4c", + ",\u1164,\u11b9": "0x4c", + ",\u1164,\u11ba": "0x4c", + ",\u1164,\u11bb": "0x4c", + ",\u1164,\u11bc": "0x4c", + ",\u1164,\u11bd": "0x4c", + ",\u1164,\u11be": "0x4c", + ",\u1164,\u11bf": "0x4c", + ",\u1164,\u11c0": "0x4c", + ",\u1164,\u11c1": "0x4c", + ",\u1164,\u11c2": "0x4c", + ",\u1166,\u11a8": "0x4c", + ",\u1166,\u11a9": "0x4c", + ",\u1166,\u11aa": "0x4c", + ",\u1166,\u11ac": "0x4c", + ",\u1166,\u11ad": "0x4c", + ",\u1166,\u11ae": "0x4c", + ",\u1166,\u11af": "0x4c", + ",\u1166,\u11b0": "0x4c", + ",\u1166,\u11b1": "0x4c", + ",\u1166,\u11b2": "0x4c", + ",\u1166,\u11b3": "0x4c", + ",\u1166,\u11b4": "0x4c", + ",\u1166,\u11b5": "0x4c", + ",\u1166,\u11b6": "0x4c", + ",\u1166,\u11b7": "0x4c", + ",\u1166,\u11b8": "0x4c", + ",\u1166,\u11b9": "0x4c", + ",\u1166,\u11ba": "0x4c", + ",\u1166,\u11bb": "0x4c", + ",\u1166,\u11bc": "0x4c", + ",\u1166,\u11bd": "0x4c", + ",\u1166,\u11be": "0x4c", + ",\u1166,\u11bf": "0x4c", + ",\u1166,\u11c0": "0x4c", + ",\u1166,\u11c1": "0x4c", + ",\u1166,\u11c2": "0x4c", + ",\u1167,\u11a8": "0x4c", + ",\u1167,\u11a9": "0x4c", + ",\u1167,\u11aa": "0x4c", + ",\u1167,\u11ab": "0x4c", + ",\u1167,\u11ac": "0x4c", + ",\u1167,\u11ad": "0x4c", + ",\u1167,\u11ae": "0x4c", + ",\u1167,\u11af": "0x4c", + ",\u1167,\u11b0": "0x4c", + ",\u1167,\u11b1": "0x4c", + ",\u1167,\u11b2": "0x4c", + ",\u1167,\u11b3": "0x4c", + ",\u1167,\u11b4": "0x4c", + ",\u1167,\u11b5": "0x4c", + ",\u1167,\u11b6": "0x4c", + ",\u1167,\u11b7": "0x4c", + ",\u1167,\u11b8": "0x4c", + ",\u1167,\u11b9": "0x4c", + ",\u1167,\u11ba": "0x4c", + ",\u1167,\u11bb": "0x4c", + ",\u1167,\u11bc": "0x4c", + ",\u1167,\u11bd": "0x4c", + ",\u1167,\u11be": "0x4c", + ",\u1167,\u11bf": "0x4c", + ",\u1167,\u11c0": "0x4c", + ",\u1167,\u11c1": "0x4c", + ",\u1167,\u11c2": "0x4c", + ",\u1168,\u11a8": "0x4c", + ",\u1168,\u11a9": "0x4c", + ",\u1168,\u11aa": "0x4c", + ",\u1168,\u11ab": "0x4c", + ",\u1168,\u11ac": "0x4c", + ",\u1168,\u11ad": "0x4c", + ",\u1168,\u11ae": "0x4c", + ",\u1168,\u11af": "0x4c", + ",\u1168,\u11b0": "0x4c", + ",\u1168,\u11b1": "0x4c", + ",\u1168,\u11b2": "0x4c", + ",\u1168,\u11b3": "0x4c", + ",\u1168,\u11b4": "0x4c", + ",\u1168,\u11b5": "0x4c", + ",\u1168,\u11b6": "0x4c", + ",\u1168,\u11b7": "0x4c", + ",\u1168,\u11b8": "0x4c", + ",\u1168,\u11b9": "0x4c", + ",\u1168,\u11ba": "0x4c", + ",\u1168,\u11bb": "0x4c", + ",\u1168,\u11bc": "0x4c", + ",\u1168,\u11bd": "0x4c", + ",\u1168,\u11be": "0x4c", + ",\u1168,\u11bf": "0x4c", + ",\u1168,\u11c0": "0x4c", + ",\u1168,\u11c1": "0x4c", + ",\u1168,\u11c2": "0x4c" + } + }, + { + "defaultGlyph": "0x77", + "alternatives": {} + }, + { + "defaultGlyph": "0x9a", + "alternatives": { + ",\u116a,\u11a8": "0xba", + ",\u116a,\u11a9": "0xba", + ",\u116a,\u11aa": "0xba", + ",\u116a,\u11ab": "0xba", + ",\u116a,\u11ac": "0xba", + ",\u116a,\u11ad": "0xba", + ",\u116a,\u11ae": "0xba", + ",\u116a,\u11af": "0xba", + ",\u116a,\u11b0": "0xba", + ",\u116a,\u11b1": "0xba", + ",\u116a,\u11b2": "0xba", + ",\u116a,\u11b3": "0xba", + ",\u116a,\u11b4": "0xba", + ",\u116a,\u11b5": "0xba", + ",\u116a,\u11b6": "0xba", + ",\u116a,\u11b7": "0xba", + ",\u116a,\u11b8": "0xba", + ",\u116a,\u11b9": "0xba", + ",\u116a,\u11ba": "0xba", + ",\u116a,\u11bb": "0xba", + ",\u116a,\u11bc": "0xba", + ",\u116a,\u11bd": "0xba", + ",\u116a,\u11be": "0xba", + ",\u116a,\u11bf": "0xba", + ",\u116a,\u11c0": "0xba", + ",\u116a,\u11c1": "0xba", + ",\u116a,\u11c2": "0xba", + ",\u116b,\u11a8": "0xba", + ",\u116b,\u11a9": "0xba", + ",\u116b,\u11aa": "0xba", + ",\u116b,\u11ab": "0xba", + ",\u116b,\u11ac": "0xba", + ",\u116b,\u11ad": "0xba", + ",\u116b,\u11ae": "0xba", + ",\u116b,\u11af": "0xba", + ",\u116b,\u11b0": "0xba", + ",\u116b,\u11b1": "0xba", + ",\u116b,\u11b2": "0xba", + ",\u116b,\u11b3": "0xba", + ",\u116b,\u11b4": "0xba", + ",\u116b,\u11b5": "0xba", + ",\u116b,\u11b6": "0xba", + ",\u116b,\u11b7": "0xba", + ",\u116b,\u11b8": "0xba", + ",\u116b,\u11b9": "0xba", + ",\u116b,\u11ba": "0xba", + ",\u116b,\u11bb": "0xba", + ",\u116b,\u11bc": "0xba", + ",\u116b,\u11bd": "0xba", + ",\u116b,\u11be": "0xba", + ",\u116b,\u11bf": "0xba", + ",\u116b,\u11c0": "0xba", + ",\u116b,\u11c1": "0xba", + ",\u116b,\u11c2": "0xba", + ",\u1170,\u11a8": "0xba", + ",\u1170,\u11a9": "0xba", + ",\u1170,\u11aa": "0xba", + ",\u1170,\u11ab": "0xba", + ",\u1170,\u11ac": "0xba", + ",\u1170,\u11ad": "0xba", + ",\u1170,\u11ae": "0xba", + ",\u1170,\u11af": "0xba", + ",\u1170,\u11b0": "0xba", + ",\u1170,\u11b1": "0xba", + ",\u1170,\u11b2": "0xba", + ",\u1170,\u11b3": "0xba", + ",\u1170,\u11b4": "0xba", + ",\u1170,\u11b5": "0xba", + ",\u1170,\u11b6": "0xba", + ",\u1170,\u11b7": "0xba", + ",\u1170,\u11b8": "0xba", + ",\u1170,\u11b9": "0xba", + ",\u1170,\u11ba": "0xba", + ",\u1170,\u11bb": "0xba", + ",\u1170,\u11bc": "0xba", + ",\u1170,\u11bd": "0xba", + ",\u1170,\u11be": "0xba", + ",\u1170,\u11bf": "0xba", + ",\u1170,\u11c0": "0xba", + ",\u1170,\u11c1": "0xba", + ",\u1170,\u11c2": "0xba" + } + } + ], + "\u110b": [ + { + "defaultGlyph": "0x0f", + "alternatives": { + ",\u1168": "0x3c", + ",\u1166": "0x3c", + ",\u1162": "0x3c", + ",\u1164": "0x3c" + } + }, + { + "defaultGlyph": "0x78", + "alternatives": {} + }, + { + "defaultGlyph": "0x9b", + "alternatives": { + ",\u116b": "0xbb", + ",\u1170": "0xbb", + ",\u116a": "0xbb" + } + }, + { + "defaultGlyph": "0x0f", + "alternatives": { + ",\u1166,\u11af": "0x3c", + ",\u1168,\u11ba": "0x3c", + ",\u1166,\u1100": "0x3c", + ",\u1166,\u11ab": "0x3c", + ",\u1162,\u11af": "0x3c", + ",\u1162,\u11a8": "0x3c", + ",\u1162,\u11a9": "0x3c", + ",\u1162,\u11aa": "0x3c", + ",\u1162,\u11ab": "0x3c", + ",\u1162,\u11ac": "0x3c", + ",\u1162,\u11ad": "0x3c", + ",\u1162,\u11ae": "0x3c", + ",\u1162,\u11b0": "0x3c", + ",\u1162,\u11b1": "0x3c", + ",\u1162,\u11b2": "0x3c", + ",\u1162,\u11b3": "0x3c", + ",\u1162,\u11b4": "0x3c", + ",\u1162,\u11b5": "0x3c", + ",\u1162,\u11b6": "0x3c", + ",\u1162,\u11b7": "0x3c", + ",\u1162,\u11b8": "0x3c", + ",\u1162,\u11b9": "0x3c", + ",\u1162,\u11ba": "0x3c", + ",\u1162,\u11bb": "0x3c", + ",\u1162,\u11bc": "0x3c", + ",\u1162,\u11bd": "0x3c", + ",\u1162,\u11be": "0x3c", + ",\u1162,\u11bf": "0x3c", + ",\u1162,\u11c0": "0x3c", + ",\u1162,\u11c1": "0x3c", + ",\u1162,\u11c2": "0x3c", + ",\u1164,\u11a8": "0x3c", + ",\u1164,\u11a9": "0x3c", + ",\u1164,\u11aa": "0x3c", + ",\u1164,\u11ab": "0x3c", + ",\u1164,\u11ac": "0x3c", + ",\u1164,\u11ad": "0x3c", + ",\u1164,\u11ae": "0x3c", + ",\u1164,\u11af": "0x3c", + ",\u1164,\u11b0": "0x3c", + ",\u1164,\u11b1": "0x3c", + ",\u1164,\u11b2": "0x3c", + ",\u1164,\u11b3": "0x3c", + ",\u1164,\u11b4": "0x3c", + ",\u1164,\u11b5": "0x3c", + ",\u1164,\u11b6": "0x3c", + ",\u1164,\u11b7": "0x3c", + ",\u1164,\u11b8": "0x3c", + ",\u1164,\u11b9": "0x3c", + ",\u1164,\u11ba": "0x3c", + ",\u1164,\u11bb": "0x3c", + ",\u1164,\u11bc": "0x3c", + ",\u1164,\u11bd": "0x3c", + ",\u1164,\u11be": "0x3c", + ",\u1164,\u11bf": "0x3c", + ",\u1164,\u11c0": "0x3c", + ",\u1164,\u11c1": "0x3c", + ",\u1164,\u11c2": "0x3c", + ",\u1166,\u11a8": "0x3c", + ",\u1166,\u11a9": "0x3c", + ",\u1166,\u11aa": "0x3c", + ",\u1166,\u11ac": "0x3c", + ",\u1166,\u11ad": "0x3c", + ",\u1166,\u11ae": "0x3c", + ",\u1166,\u11b0": "0x3c", + ",\u1166,\u11b1": "0x3c", + ",\u1166,\u11b2": "0x3c", + ",\u1166,\u11b3": "0x3c", + ",\u1166,\u11b4": "0x3c", + ",\u1166,\u11b5": "0x3c", + ",\u1166,\u11b6": "0x3c", + ",\u1166,\u11b7": "0x3c", + ",\u1166,\u11b8": "0x3c", + ",\u1166,\u11b9": "0x3c", + ",\u1166,\u11ba": "0x3c", + ",\u1166,\u11bb": "0x3c", + ",\u1166,\u11bc": "0x3c", + ",\u1166,\u11bd": "0x3c", + ",\u1166,\u11be": "0x3c", + ",\u1166,\u11bf": "0x3c", + ",\u1166,\u11c0": "0x3c", + ",\u1166,\u11c1": "0x3c", + ",\u1166,\u11c2": "0x3c", + ",\u1168,\u11a8": "0x3c", + ",\u1168,\u11a9": "0x3c", + ",\u1168,\u11aa": "0x3c", + ",\u1168,\u11ab": "0x3c", + ",\u1168,\u11ac": "0x3c", + ",\u1168,\u11ad": "0x3c", + ",\u1168,\u11ae": "0x3c", + ",\u1168,\u11af": "0x3c", + ",\u1168,\u11b0": "0x3c", + ",\u1168,\u11b1": "0x3c", + ",\u1168,\u11b2": "0x3c", + ",\u1168,\u11b3": "0x3c", + ",\u1168,\u11b4": "0x3c", + ",\u1168,\u11b5": "0x3c", + ",\u1168,\u11b6": "0x3c", + ",\u1168,\u11b7": "0x3c", + ",\u1168,\u11b8": "0x3c", + ",\u1168,\u11b9": "0x3c", + ",\u1168,\u11bb": "0x3c", + ",\u1168,\u11bc": "0x3c", + ",\u1168,\u11bd": "0x3c", + ",\u1168,\u11be": "0x3c", + ",\u1168,\u11bf": "0x3c", + ",\u1168,\u11c0": "0x3c", + ",\u1168,\u11c1": "0x3c", + ",\u1168,\u11c2": "0x3c" + } + }, + { + "defaultGlyph": "0x78", + "alternatives": {} + }, + { + "defaultGlyph": "0x9b", + "alternatives": { + ",\u1170,\u11a8": "0xbb", + ",\u116a,\u11a8": "0xbb", + ",\u116a,\u11a9": "0xbb", + ",\u116a,\u11aa": "0xbb", + ",\u116a,\u11ab": "0xbb", + ",\u116a,\u11ac": "0xbb", + ",\u116a,\u11ad": "0xbb", + ",\u116a,\u11ae": "0xbb", + ",\u116a,\u11af": "0xbb", + ",\u116a,\u11b0": "0xbb", + ",\u116a,\u11b1": "0xbb", + ",\u116a,\u11b2": "0xbb", + ",\u116a,\u11b3": "0xbb", + ",\u116a,\u11b4": "0xbb", + ",\u116a,\u11b5": "0xbb", + ",\u116a,\u11b6": "0xbb", + ",\u116a,\u11b7": "0xbb", + ",\u116a,\u11b8": "0xbb", + ",\u116a,\u11b9": "0xbb", + ",\u116a,\u11ba": "0xbb", + ",\u116a,\u11bb": "0xbb", + ",\u116a,\u11bc": "0xbb", + ",\u116a,\u11bd": "0xbb", + ",\u116a,\u11be": "0xbb", + ",\u116a,\u11bf": "0xbb", + ",\u116a,\u11c0": "0xbb", + ",\u116a,\u11c1": "0xbb", + ",\u116a,\u11c2": "0xbb", + ",\u116b,\u11a8": "0xbb", + ",\u116b,\u11a9": "0xbb", + ",\u116b,\u11aa": "0xbb", + ",\u116b,\u11ab": "0xbb", + ",\u116b,\u11ac": "0xbb", + ",\u116b,\u11ad": "0xbb", + ",\u116b,\u11ae": "0xbb", + ",\u116b,\u11af": "0xbb", + ",\u116b,\u11b0": "0xbb", + ",\u116b,\u11b1": "0xbb", + ",\u116b,\u11b2": "0xbb", + ",\u116b,\u11b3": "0xbb", + ",\u116b,\u11b4": "0xbb", + ",\u116b,\u11b5": "0xbb", + ",\u116b,\u11b6": "0xbb", + ",\u116b,\u11b7": "0xbb", + ",\u116b,\u11b8": "0xbb", + ",\u116b,\u11b9": "0xbb", + ",\u116b,\u11ba": "0xbb", + ",\u116b,\u11bb": "0xbb", + ",\u116b,\u11bc": "0xbb", + ",\u116b,\u11bd": "0xbb", + ",\u116b,\u11be": "0xbb", + ",\u116b,\u11bf": "0xbb", + ",\u116b,\u11c0": "0xbb", + ",\u116b,\u11c1": "0xbb", + ",\u116b,\u11c2": "0xbb", + ",\u1170,\u11a9": "0xbb", + ",\u1170,\u11aa": "0xbb", + ",\u1170,\u11ab": "0xbb", + ",\u1170,\u11ac": "0xbb", + ",\u1170,\u11ad": "0xbb", + ",\u1170,\u11ae": "0xbb", + ",\u1170,\u11af": "0xbb", + ",\u1170,\u11b0": "0xbb", + ",\u1170,\u11b1": "0xbb", + ",\u1170,\u11b2": "0xbb", + ",\u1170,\u11b3": "0xbb", + ",\u1170,\u11b4": "0xbb", + ",\u1170,\u11b5": "0xbb", + ",\u1170,\u11b6": "0xbb", + ",\u1170,\u11b7": "0xbb", + ",\u1170,\u11b8": "0xbb", + ",\u1170,\u11b9": "0xbb", + ",\u1170,\u11ba": "0xbb", + ",\u1170,\u11bb": "0xbb", + ",\u1170,\u11bc": "0xbb", + ",\u1170,\u11bd": "0xbb", + ",\u1170,\u11be": "0xbb", + ",\u1170,\u11bf": "0xbb", + ",\u1170,\u11c0": "0xbb", + ",\u1170,\u11c1": "0xbb", + ",\u1170,\u11c2": "0xbb" + } + } + ], + "\u110c": [ + { + "defaultGlyph": "0x10", + "alternatives": { + ",\u1166": "0x3d", + ",\u1162": "0x3d", + ",\u1164": "0x3d", + ",\u1168": "0x3d" + } + }, + { + "defaultGlyph": "0x79", + "alternatives": {} + }, + { + "defaultGlyph": "0x9c", + "alternatives": { + ",\u116a": "0xbc", + ",\u116b": "0xbc", + ",\u1170": "0xbc" + } + }, + { + "defaultGlyph": "0x10", + "alternatives": { + ",\u1162,\u11a8": "0x3d", + ",\u1166,\u11ba": "0x3d", + ",\u1162,\u11bc": "0x3d", + ",\u1166,\u11ab": "0x3d", + ",\u1166,\u11a8": "0x3d", + ",\u1166,\u11af": "0x3d", + ",\u1162,\u11ba": "0x3d", + ",\u1162,\u11a9": "0x3d", + ",\u1162,\u11aa": "0x3d", + ",\u1162,\u11ab": "0x3d", + ",\u1162,\u11ac": "0x3d", + ",\u1162,\u11ad": "0x3d", + ",\u1162,\u11ae": "0x3d", + ",\u1162,\u11af": "0x3d", + ",\u1162,\u11b0": "0x3d", + ",\u1162,\u11b1": "0x3d", + ",\u1162,\u11b2": "0x3d", + ",\u1162,\u11b3": "0x3d", + ",\u1162,\u11b4": "0x3d", + ",\u1162,\u11b5": "0x3d", + ",\u1162,\u11b6": "0x3d", + ",\u1162,\u11b7": "0x3d", + ",\u1162,\u11b8": "0x3d", + ",\u1162,\u11b9": "0x3d", + ",\u1162,\u11bb": "0x3d", + ",\u1162,\u11bd": "0x3d", + ",\u1162,\u11be": "0x3d", + ",\u1162,\u11bf": "0x3d", + ",\u1162,\u11c0": "0x3d", + ",\u1162,\u11c1": "0x3d", + ",\u1162,\u11c2": "0x3d", + ",\u1164,\u11a8": "0x3d", + ",\u1164,\u11a9": "0x3d", + ",\u1164,\u11aa": "0x3d", + ",\u1164,\u11ab": "0x3d", + ",\u1164,\u11ac": "0x3d", + ",\u1164,\u11ad": "0x3d", + ",\u1164,\u11ae": "0x3d", + ",\u1164,\u11af": "0x3d", + ",\u1164,\u11b0": "0x3d", + ",\u1164,\u11b1": "0x3d", + ",\u1164,\u11b2": "0x3d", + ",\u1164,\u11b3": "0x3d", + ",\u1164,\u11b4": "0x3d", + ",\u1164,\u11b5": "0x3d", + ",\u1164,\u11b6": "0x3d", + ",\u1164,\u11b7": "0x3d", + ",\u1164,\u11b8": "0x3d", + ",\u1164,\u11b9": "0x3d", + ",\u1164,\u11ba": "0x3d", + ",\u1164,\u11bb": "0x3d", + ",\u1164,\u11bc": "0x3d", + ",\u1164,\u11bd": "0x3d", + ",\u1164,\u11be": "0x3d", + ",\u1164,\u11bf": "0x3d", + ",\u1164,\u11c0": "0x3d", + ",\u1164,\u11c1": "0x3d", + ",\u1164,\u11c2": "0x3d", + ",\u1166,\u11a9": "0x3d", + ",\u1166,\u11aa": "0x3d", + ",\u1166,\u11ac": "0x3d", + ",\u1166,\u11ad": "0x3d", + ",\u1166,\u11ae": "0x3d", + ",\u1166,\u11b0": "0x3d", + ",\u1166,\u11b1": "0x3d", + ",\u1166,\u11b2": "0x3d", + ",\u1166,\u11b3": "0x3d", + ",\u1166,\u11b4": "0x3d", + ",\u1166,\u11b5": "0x3d", + ",\u1166,\u11b6": "0x3d", + ",\u1166,\u11b7": "0x3d", + ",\u1166,\u11b8": "0x3d", + ",\u1166,\u11b9": "0x3d", + ",\u1166,\u11bb": "0x3d", + ",\u1166,\u11bc": "0x3d", + ",\u1166,\u11bd": "0x3d", + ",\u1166,\u11be": "0x3d", + ",\u1166,\u11bf": "0x3d", + ",\u1166,\u11c0": "0x3d", + ",\u1166,\u11c1": "0x3d", + ",\u1166,\u11c2": "0x3d", + ",\u1168,\u11a8": "0x3d", + ",\u1168,\u11a9": "0x3d", + ",\u1168,\u11aa": "0x3d", + ",\u1168,\u11ab": "0x3d", + ",\u1168,\u11ac": "0x3d", + ",\u1168,\u11ad": "0x3d", + ",\u1168,\u11ae": "0x3d", + ",\u1168,\u11af": "0x3d", + ",\u1168,\u11b0": "0x3d", + ",\u1168,\u11b1": "0x3d", + ",\u1168,\u11b2": "0x3d", + ",\u1168,\u11b3": "0x3d", + ",\u1168,\u11b4": "0x3d", + ",\u1168,\u11b5": "0x3d", + ",\u1168,\u11b6": "0x3d", + ",\u1168,\u11b7": "0x3d", + ",\u1168,\u11b8": "0x3d", + ",\u1168,\u11b9": "0x3d", + ",\u1168,\u11ba": "0x3d", + ",\u1168,\u11bb": "0x3d", + ",\u1168,\u11bc": "0x3d", + ",\u1168,\u11bd": "0x3d", + ",\u1168,\u11be": "0x3d", + ",\u1168,\u11bf": "0x3d", + ",\u1168,\u11c0": "0x3d", + ",\u1168,\u11c1": "0x3d", + ",\u1168,\u11c2": "0x3d" + } + }, + { + "defaultGlyph": "0x79", + "alternatives": {} + }, + { + "defaultGlyph": "0x9c", + "alternatives": { + ",\u116a,\u11a8": "0xbc", + ",\u116a,\u11a9": "0xbc", + ",\u116a,\u11aa": "0xbc", + ",\u116a,\u11ab": "0xbc", + ",\u116a,\u11ac": "0xbc", + ",\u116a,\u11ad": "0xbc", + ",\u116a,\u11ae": "0xbc", + ",\u116a,\u11af": "0xbc", + ",\u116a,\u11b0": "0xbc", + ",\u116a,\u11b1": "0xbc", + ",\u116a,\u11b2": "0xbc", + ",\u116a,\u11b3": "0xbc", + ",\u116a,\u11b4": "0xbc", + ",\u116a,\u11b5": "0xbc", + ",\u116a,\u11b6": "0xbc", + ",\u116a,\u11b7": "0xbc", + ",\u116a,\u11b8": "0xbc", + ",\u116a,\u11b9": "0xbc", + ",\u116a,\u11ba": "0xbc", + ",\u116a,\u11bb": "0xbc", + ",\u116a,\u11bc": "0xbc", + ",\u116a,\u11bd": "0xbc", + ",\u116a,\u11be": "0xbc", + ",\u116a,\u11bf": "0xbc", + ",\u116a,\u11c0": "0xbc", + ",\u116a,\u11c1": "0xbc", + ",\u116a,\u11c2": "0xbc", + ",\u116b,\u11a8": "0xbc", + ",\u116b,\u11a9": "0xbc", + ",\u116b,\u11aa": "0xbc", + ",\u116b,\u11ab": "0xbc", + ",\u116b,\u11ac": "0xbc", + ",\u116b,\u11ad": "0xbc", + ",\u116b,\u11ae": "0xbc", + ",\u116b,\u11af": "0xbc", + ",\u116b,\u11b0": "0xbc", + ",\u116b,\u11b1": "0xbc", + ",\u116b,\u11b2": "0xbc", + ",\u116b,\u11b3": "0xbc", + ",\u116b,\u11b4": "0xbc", + ",\u116b,\u11b5": "0xbc", + ",\u116b,\u11b6": "0xbc", + ",\u116b,\u11b7": "0xbc", + ",\u116b,\u11b8": "0xbc", + ",\u116b,\u11b9": "0xbc", + ",\u116b,\u11ba": "0xbc", + ",\u116b,\u11bb": "0xbc", + ",\u116b,\u11bc": "0xbc", + ",\u116b,\u11bd": "0xbc", + ",\u116b,\u11be": "0xbc", + ",\u116b,\u11bf": "0xbc", + ",\u116b,\u11c0": "0xbc", + ",\u116b,\u11c1": "0xbc", + ",\u116b,\u11c2": "0xbc", + ",\u1170,\u11a8": "0xbc", + ",\u1170,\u11a9": "0xbc", + ",\u1170,\u11aa": "0xbc", + ",\u1170,\u11ab": "0xbc", + ",\u1170,\u11ac": "0xbc", + ",\u1170,\u11ad": "0xbc", + ",\u1170,\u11ae": "0xbc", + ",\u1170,\u11af": "0xbc", + ",\u1170,\u11b0": "0xbc", + ",\u1170,\u11b1": "0xbc", + ",\u1170,\u11b2": "0xbc", + ",\u1170,\u11b3": "0xbc", + ",\u1170,\u11b4": "0xbc", + ",\u1170,\u11b5": "0xbc", + ",\u1170,\u11b6": "0xbc", + ",\u1170,\u11b7": "0xbc", + ",\u1170,\u11b8": "0xbc", + ",\u1170,\u11b9": "0xbc", + ",\u1170,\u11ba": "0xbc", + ",\u1170,\u11bb": "0xbc", + ",\u1170,\u11bc": "0xbc", + ",\u1170,\u11bd": "0xbc", + ",\u1170,\u11be": "0xbc", + ",\u1170,\u11bf": "0xbc", + ",\u1170,\u11c0": "0xbc", + ",\u1170,\u11c1": "0xbc", + ",\u1170,\u11c2": "0xbc" + } + } + ], + "\u110d": [ + { + "defaultGlyph": "0x3e", + "alternatives": { + ",\u1162": "0x3e", + ",\u1175": "0x11" + } + }, + { + "defaultGlyph": "0x7a", + "alternatives": {} + }, + { + "defaultGlyph": "0x9d", + "alternatives": { + ",\u116a": "0xbd", + ",\u116b": "0xbd", + ",\u1170": "0xbd" + } + }, + { + "defaultGlyph": "0x11", + "alternatives": { + ",\u1162,\u11bb": "0x3e", + ",\u1162,\u11a8": "0x3e", + ",\u1162,\u11a9": "0x3e", + ",\u1162,\u11aa": "0x3e", + ",\u1162,\u11ab": "0x3e", + ",\u1162,\u11ac": "0x3e", + ",\u1162,\u11ad": "0x3e", + ",\u1162,\u11ae": "0x3e", + ",\u1162,\u11af": "0x3e", + ",\u1162,\u11b0": "0x3e", + ",\u1162,\u11b1": "0x3e", + ",\u1162,\u11b2": "0x3e", + ",\u1162,\u11b3": "0x3e", + ",\u1162,\u11b4": "0x3e", + ",\u1162,\u11b5": "0x3e", + ",\u1162,\u11b6": "0x3e", + ",\u1162,\u11b7": "0x3e", + ",\u1162,\u11b8": "0x3e", + ",\u1162,\u11b9": "0x3e", + ",\u1162,\u11ba": "0x3e", + ",\u1162,\u11bc": "0x3e", + ",\u1162,\u11bd": "0x3e", + ",\u1162,\u11be": "0x3e", + ",\u1162,\u11bf": "0x3e", + ",\u1162,\u11c0": "0x3e", + ",\u1162,\u11c1": "0x3e", + ",\u1162,\u11c2": "0x3e", + ",\u1163,\u11a8": "0x3e", + ",\u1163,\u11a9": "0x3e", + ",\u1163,\u11aa": "0x3e", + ",\u1163,\u11ab": "0x3e", + ",\u1163,\u11ac": "0x3e", + ",\u1163,\u11ad": "0x3e", + ",\u1163,\u11ae": "0x3e", + ",\u1163,\u11af": "0x3e", + ",\u1163,\u11b0": "0x3e", + ",\u1163,\u11b1": "0x3e", + ",\u1163,\u11b2": "0x3e", + ",\u1163,\u11b3": "0x3e", + ",\u1163,\u11b4": "0x3e", + ",\u1163,\u11b5": "0x3e", + ",\u1163,\u11b6": "0x3e", + ",\u1163,\u11b7": "0x3e", + ",\u1163,\u11b8": "0x3e", + ",\u1163,\u11b9": "0x3e", + ",\u1163,\u11ba": "0x3e", + ",\u1163,\u11bb": "0x3e", + ",\u1163,\u11bc": "0x3e", + ",\u1163,\u11bd": "0x3e", + ",\u1163,\u11be": "0x3e", + ",\u1163,\u11bf": "0x3e", + ",\u1163,\u11c0": "0x3e", + ",\u1163,\u11c1": "0x3e", + ",\u1163,\u11c2": "0x3e", + ",\u1164,\u11a8": "0x3e", + ",\u1164,\u11a9": "0x3e", + ",\u1164,\u11aa": "0x3e", + ",\u1164,\u11ab": "0x3e", + ",\u1164,\u11ac": "0x3e", + ",\u1164,\u11ad": "0x3e", + ",\u1164,\u11ae": "0x3e", + ",\u1164,\u11af": "0x3e", + ",\u1164,\u11b0": "0x3e", + ",\u1164,\u11b1": "0x3e", + ",\u1164,\u11b2": "0x3e", + ",\u1164,\u11b3": "0x3e", + ",\u1164,\u11b4": "0x3e", + ",\u1164,\u11b5": "0x3e", + ",\u1164,\u11b6": "0x3e", + ",\u1164,\u11b7": "0x3e", + ",\u1164,\u11b8": "0x3e", + ",\u1164,\u11b9": "0x3e", + ",\u1164,\u11ba": "0x3e", + ",\u1164,\u11bb": "0x3e", + ",\u1164,\u11bc": "0x3e", + ",\u1164,\u11bd": "0x3e", + ",\u1164,\u11be": "0x3e", + ",\u1164,\u11bf": "0x3e", + ",\u1164,\u11c0": "0x3e", + ",\u1164,\u11c1": "0x3e", + ",\u1164,\u11c2": "0x3e", + ",\u1166,\u11a8": "0x3e", + ",\u1166,\u11a9": "0x3e", + ",\u1166,\u11aa": "0x3e", + ",\u1166,\u11ab": "0x3e", + ",\u1166,\u11ac": "0x3e", + ",\u1166,\u11ad": "0x3e", + ",\u1166,\u11ae": "0x3e", + ",\u1166,\u11af": "0x3e", + ",\u1166,\u11b0": "0x3e", + ",\u1166,\u11b1": "0x3e", + ",\u1166,\u11b2": "0x3e", + ",\u1166,\u11b3": "0x3e", + ",\u1166,\u11b4": "0x3e", + ",\u1166,\u11b5": "0x3e", + ",\u1166,\u11b6": "0x3e", + ",\u1166,\u11b7": "0x3e", + ",\u1166,\u11b8": "0x3e", + ",\u1166,\u11b9": "0x3e", + ",\u1166,\u11ba": "0x3e", + ",\u1166,\u11bb": "0x3e", + ",\u1166,\u11bc": "0x3e", + ",\u1166,\u11bd": "0x3e", + ",\u1166,\u11be": "0x3e", + ",\u1166,\u11bf": "0x3e", + ",\u1166,\u11c0": "0x3e", + ",\u1166,\u11c1": "0x3e", + ",\u1166,\u11c2": "0x3e", + ",\u1167,\u11a8": "0x3e", + ",\u1167,\u11a9": "0x3e", + ",\u1167,\u11aa": "0x3e", + ",\u1167,\u11ab": "0x3e", + ",\u1167,\u11ac": "0x3e", + ",\u1167,\u11ad": "0x3e", + ",\u1167,\u11ae": "0x3e", + ",\u1167,\u11af": "0x3e", + ",\u1167,\u11b0": "0x3e", + ",\u1167,\u11b1": "0x3e", + ",\u1167,\u11b2": "0x3e", + ",\u1167,\u11b3": "0x3e", + ",\u1167,\u11b4": "0x3e", + ",\u1167,\u11b5": "0x3e", + ",\u1167,\u11b6": "0x3e", + ",\u1167,\u11b7": "0x3e", + ",\u1167,\u11b8": "0x3e", + ",\u1167,\u11b9": "0x3e", + ",\u1167,\u11ba": "0x3e", + ",\u1167,\u11bb": "0x3e", + ",\u1167,\u11bc": "0x3e", + ",\u1167,\u11bd": "0x3e", + ",\u1167,\u11be": "0x3e", + ",\u1167,\u11bf": "0x3e", + ",\u1167,\u11c0": "0x3e", + ",\u1167,\u11c1": "0x3e", + ",\u1167,\u11c2": "0x3e", + ",\u1168,\u11a8": "0x3e", + ",\u1168,\u11a9": "0x3e", + ",\u1168,\u11aa": "0x3e", + ",\u1168,\u11ab": "0x3e", + ",\u1168,\u11ac": "0x3e", + ",\u1168,\u11ad": "0x3e", + ",\u1168,\u11ae": "0x3e", + ",\u1168,\u11af": "0x3e", + ",\u1168,\u11b0": "0x3e", + ",\u1168,\u11b1": "0x3e", + ",\u1168,\u11b2": "0x3e", + ",\u1168,\u11b3": "0x3e", + ",\u1168,\u11b4": "0x3e", + ",\u1168,\u11b5": "0x3e", + ",\u1168,\u11b6": "0x3e", + ",\u1168,\u11b7": "0x3e", + ",\u1168,\u11b8": "0x3e", + ",\u1168,\u11b9": "0x3e", + ",\u1168,\u11ba": "0x3e", + ",\u1168,\u11bb": "0x3e", + ",\u1168,\u11bc": "0x3e", + ",\u1168,\u11bd": "0x3e", + ",\u1168,\u11be": "0x3e", + ",\u1168,\u11bf": "0x3e", + ",\u1168,\u11c0": "0x3e", + ",\u1168,\u11c1": "0x3e", + ",\u1168,\u11c2": "0x3e", + ",\u1175,\u11a8": "0x3e", + ",\u1175,\u11a9": "0x3e", + ",\u1175,\u11aa": "0x3e", + ",\u1175,\u11ab": "0x3e", + ",\u1175,\u11ac": "0x3e", + ",\u1175,\u11ad": "0x3e", + ",\u1175,\u11ae": "0x3e", + ",\u1175,\u11af": "0x3e", + ",\u1175,\u11b0": "0x3e", + ",\u1175,\u11b1": "0x3e", + ",\u1175,\u11b2": "0x3e", + ",\u1175,\u11b3": "0x3e", + ",\u1175,\u11b4": "0x3e", + ",\u1175,\u11b5": "0x3e", + ",\u1175,\u11b6": "0x3e", + ",\u1175,\u11b7": "0x3e", + ",\u1175,\u11b8": "0x3e", + ",\u1175,\u11b9": "0x3e", + ",\u1175,\u11ba": "0x3e", + ",\u1175,\u11bb": "0x3e", + ",\u1175,\u11bc": "0x3e", + ",\u1175,\u11bd": "0x3e", + ",\u1175,\u11be": "0x3e", + ",\u1175,\u11bf": "0x3e", + ",\u1175,\u11c0": "0x3e", + ",\u1175,\u11c1": "0x3e", + ",\u1175,\u11c2": "0x3e" + } + }, + { + "defaultGlyph": "0x7a", + "alternatives": {} + }, + { + "defaultGlyph": "0x9d", + "alternatives": { + ",\u116a,\u11a8": "0xbd", + ",\u116a,\u11a9": "0xbd", + ",\u116a,\u11aa": "0xbd", + ",\u116a,\u11ab": "0xbd", + ",\u116a,\u11ac": "0xbd", + ",\u116a,\u11ad": "0xbd", + ",\u116a,\u11ae": "0xbd", + ",\u116a,\u11af": "0xbd", + ",\u116a,\u11b0": "0xbd", + ",\u116a,\u11b1": "0xbd", + ",\u116a,\u11b2": "0xbd", + ",\u116a,\u11b3": "0xbd", + ",\u116a,\u11b4": "0xbd", + ",\u116a,\u11b5": "0xbd", + ",\u116a,\u11b6": "0xbd", + ",\u116a,\u11b7": "0xbd", + ",\u116a,\u11b8": "0xbd", + ",\u116a,\u11b9": "0xbd", + ",\u116a,\u11ba": "0xbd", + ",\u116a,\u11bb": "0xbd", + ",\u116a,\u11bc": "0xbd", + ",\u116a,\u11bd": "0xbd", + ",\u116a,\u11be": "0xbd", + ",\u116a,\u11bf": "0xbd", + ",\u116a,\u11c0": "0xbd", + ",\u116a,\u11c1": "0xbd", + ",\u116a,\u11c2": "0xbd", + ",\u116b,\u11a8": "0xbd", + ",\u116b,\u11a9": "0xbd", + ",\u116b,\u11aa": "0xbd", + ",\u116b,\u11ab": "0xbd", + ",\u116b,\u11ac": "0xbd", + ",\u116b,\u11ad": "0xbd", + ",\u116b,\u11ae": "0xbd", + ",\u116b,\u11af": "0xbd", + ",\u116b,\u11b0": "0xbd", + ",\u116b,\u11b1": "0xbd", + ",\u116b,\u11b2": "0xbd", + ",\u116b,\u11b3": "0xbd", + ",\u116b,\u11b4": "0xbd", + ",\u116b,\u11b5": "0xbd", + ",\u116b,\u11b6": "0xbd", + ",\u116b,\u11b7": "0xbd", + ",\u116b,\u11b8": "0xbd", + ",\u116b,\u11b9": "0xbd", + ",\u116b,\u11ba": "0xbd", + ",\u116b,\u11bb": "0xbd", + ",\u116b,\u11bc": "0xbd", + ",\u116b,\u11bd": "0xbd", + ",\u116b,\u11be": "0xbd", + ",\u116b,\u11bf": "0xbd", + ",\u116b,\u11c0": "0xbd", + ",\u116b,\u11c1": "0xbd", + ",\u116b,\u11c2": "0xbd", + ",\u1170,\u11a8": "0xbd", + ",\u1170,\u11a9": "0xbd", + ",\u1170,\u11aa": "0xbd", + ",\u1170,\u11ab": "0xbd", + ",\u1170,\u11ac": "0xbd", + ",\u1170,\u11ad": "0xbd", + ",\u1170,\u11ae": "0xbd", + ",\u1170,\u11af": "0xbd", + ",\u1170,\u11b0": "0xbd", + ",\u1170,\u11b1": "0xbd", + ",\u1170,\u11b2": "0xbd", + ",\u1170,\u11b3": "0xbd", + ",\u1170,\u11b4": "0xbd", + ",\u1170,\u11b5": "0xbd", + ",\u1170,\u11b6": "0xbd", + ",\u1170,\u11b7": "0xbd", + ",\u1170,\u11b8": "0xbd", + ",\u1170,\u11b9": "0xbd", + ",\u1170,\u11ba": "0xbd", + ",\u1170,\u11bb": "0xbd", + ",\u1170,\u11bc": "0xbd", + ",\u1170,\u11bd": "0xbd", + ",\u1170,\u11be": "0xbd", + ",\u1170,\u11bf": "0xbd", + ",\u1170,\u11c0": "0xbd", + ",\u1170,\u11c1": "0xbd", + ",\u1170,\u11c2": "0xbd" + } + } + ], + "\u110e": [ + { + "defaultGlyph": "0x2d", + "alternatives": { + ",\u1166": "0x58", + ",\u1162": "0x58", + ",\u1164": "0x58", + ",\u1168": "0x58" + } + }, + { + "defaultGlyph": "0x7b", + "alternatives": {} + }, + { + "defaultGlyph": "0x9e", + "alternatives": { + ",\u116a": "0xbe", + ",\u116b": "0xbe", + ",\u1170": "0xbe" + } + }, + { + "defaultGlyph": "0x2d", + "alternatives": { + ",\u1162,\u11af": "0x58", + ",\u1162,\u11bc": "0x58", + ",\u1162,\u11a8": "0x58", + ",\u1162,\u11bb": "0x58", + ",\u1162,\u11b7": "0x58", + ",\u1166,\u11ba": "0x58", + ",\u1162,\u11a9": "0x58", + ",\u1162,\u11aa": "0x58", + ",\u1162,\u11ab": "0x58", + ",\u1162,\u11ac": "0x58", + ",\u1162,\u11ad": "0x58", + ",\u1162,\u11ae": "0x58", + ",\u1162,\u11b0": "0x58", + ",\u1162,\u11b1": "0x58", + ",\u1162,\u11b2": "0x58", + ",\u1162,\u11b3": "0x58", + ",\u1162,\u11b4": "0x58", + ",\u1162,\u11b5": "0x58", + ",\u1162,\u11b6": "0x58", + ",\u1162,\u11b8": "0x58", + ",\u1162,\u11b9": "0x58", + ",\u1162,\u11ba": "0x58", + ",\u1162,\u11bd": "0x58", + ",\u1162,\u11be": "0x58", + ",\u1162,\u11bf": "0x58", + ",\u1162,\u11c0": "0x58", + ",\u1162,\u11c1": "0x58", + ",\u1162,\u11c2": "0x58", + ",\u1164,\u11a8": "0x58", + ",\u1164,\u11a9": "0x58", + ",\u1164,\u11aa": "0x58", + ",\u1164,\u11ab": "0x58", + ",\u1164,\u11ac": "0x58", + ",\u1164,\u11ad": "0x58", + ",\u1164,\u11ae": "0x58", + ",\u1164,\u11af": "0x58", + ",\u1164,\u11b0": "0x58", + ",\u1164,\u11b1": "0x58", + ",\u1164,\u11b2": "0x58", + ",\u1164,\u11b3": "0x58", + ",\u1164,\u11b4": "0x58", + ",\u1164,\u11b5": "0x58", + ",\u1164,\u11b6": "0x58", + ",\u1164,\u11b7": "0x58", + ",\u1164,\u11b8": "0x58", + ",\u1164,\u11b9": "0x58", + ",\u1164,\u11ba": "0x58", + ",\u1164,\u11bb": "0x58", + ",\u1164,\u11bc": "0x58", + ",\u1164,\u11bd": "0x58", + ",\u1164,\u11be": "0x58", + ",\u1164,\u11bf": "0x58", + ",\u1164,\u11c0": "0x58", + ",\u1164,\u11c1": "0x58", + ",\u1164,\u11c2": "0x58", + ",\u1166,\u11a8": "0x58", + ",\u1166,\u11a9": "0x58", + ",\u1166,\u11aa": "0x58", + ",\u1166,\u11ab": "0x58", + ",\u1166,\u11ac": "0x58", + ",\u1166,\u11ad": "0x58", + ",\u1166,\u11ae": "0x58", + ",\u1166,\u11af": "0x58", + ",\u1166,\u11b0": "0x58", + ",\u1166,\u11b1": "0x58", + ",\u1166,\u11b2": "0x58", + ",\u1166,\u11b3": "0x58", + ",\u1166,\u11b4": "0x58", + ",\u1166,\u11b5": "0x58", + ",\u1166,\u11b6": "0x58", + ",\u1166,\u11b7": "0x58", + ",\u1166,\u11b8": "0x58", + ",\u1166,\u11b9": "0x58", + ",\u1166,\u11bb": "0x58", + ",\u1166,\u11bc": "0x58", + ",\u1166,\u11bd": "0x58", + ",\u1166,\u11be": "0x58", + ",\u1166,\u11bf": "0x58", + ",\u1166,\u11c0": "0x58", + ",\u1166,\u11c1": "0x58", + ",\u1166,\u11c2": "0x58", + ",\u1168,\u11a8": "0x58", + ",\u1168,\u11a9": "0x58", + ",\u1168,\u11aa": "0x58", + ",\u1168,\u11ab": "0x58", + ",\u1168,\u11ac": "0x58", + ",\u1168,\u11ad": "0x58", + ",\u1168,\u11ae": "0x58", + ",\u1168,\u11af": "0x58", + ",\u1168,\u11b0": "0x58", + ",\u1168,\u11b1": "0x58", + ",\u1168,\u11b2": "0x58", + ",\u1168,\u11b3": "0x58", + ",\u1168,\u11b4": "0x58", + ",\u1168,\u11b5": "0x58", + ",\u1168,\u11b6": "0x58", + ",\u1168,\u11b7": "0x58", + ",\u1168,\u11b8": "0x58", + ",\u1168,\u11b9": "0x58", + ",\u1168,\u11ba": "0x58", + ",\u1168,\u11bb": "0x58", + ",\u1168,\u11bc": "0x58", + ",\u1168,\u11bd": "0x58", + ",\u1168,\u11be": "0x58", + ",\u1168,\u11bf": "0x58", + ",\u1168,\u11c0": "0x58", + ",\u1168,\u11c1": "0x58", + ",\u1168,\u11c2": "0x58" + } + }, + { + "defaultGlyph": "0x7b", + "alternatives": {} + }, + { + "defaultGlyph": "0x9e", + "alternatives": { + ",\u116a,\u11a8": "0xbe", + ",\u116a,\u11a9": "0xbe", + ",\u116a,\u11aa": "0xbe", + ",\u116a,\u11ab": "0xbe", + ",\u116a,\u11ac": "0xbe", + ",\u116a,\u11ad": "0xbe", + ",\u116a,\u11ae": "0xbe", + ",\u116a,\u11af": "0xbe", + ",\u116a,\u11b0": "0xbe", + ",\u116a,\u11b1": "0xbe", + ",\u116a,\u11b2": "0xbe", + ",\u116a,\u11b3": "0xbe", + ",\u116a,\u11b4": "0xbe", + ",\u116a,\u11b5": "0xbe", + ",\u116a,\u11b6": "0xbe", + ",\u116a,\u11b7": "0xbe", + ",\u116a,\u11b8": "0xbe", + ",\u116a,\u11b9": "0xbe", + ",\u116a,\u11ba": "0xbe", + ",\u116a,\u11bb": "0xbe", + ",\u116a,\u11bc": "0xbe", + ",\u116a,\u11bd": "0xbe", + ",\u116a,\u11be": "0xbe", + ",\u116a,\u11bf": "0xbe", + ",\u116a,\u11c0": "0xbe", + ",\u116a,\u11c1": "0xbe", + ",\u116a,\u11c2": "0xbe", + ",\u116b,\u11a8": "0xbe", + ",\u116b,\u11a9": "0xbe", + ",\u116b,\u11aa": "0xbe", + ",\u116b,\u11ab": "0xbe", + ",\u116b,\u11ac": "0xbe", + ",\u116b,\u11ad": "0xbe", + ",\u116b,\u11ae": "0xbe", + ",\u116b,\u11af": "0xbe", + ",\u116b,\u11b0": "0xbe", + ",\u116b,\u11b1": "0xbe", + ",\u116b,\u11b2": "0xbe", + ",\u116b,\u11b3": "0xbe", + ",\u116b,\u11b4": "0xbe", + ",\u116b,\u11b5": "0xbe", + ",\u116b,\u11b6": "0xbe", + ",\u116b,\u11b7": "0xbe", + ",\u116b,\u11b8": "0xbe", + ",\u116b,\u11b9": "0xbe", + ",\u116b,\u11ba": "0xbe", + ",\u116b,\u11bb": "0xbe", + ",\u116b,\u11bc": "0xbe", + ",\u116b,\u11bd": "0xbe", + ",\u116b,\u11be": "0xbe", + ",\u116b,\u11bf": "0xbe", + ",\u116b,\u11c0": "0xbe", + ",\u116b,\u11c1": "0xbe", + ",\u116b,\u11c2": "0xbe", + ",\u1170,\u11a8": "0xbe", + ",\u1170,\u11a9": "0xbe", + ",\u1170,\u11aa": "0xbe", + ",\u1170,\u11ab": "0xbe", + ",\u1170,\u11ac": "0xbe", + ",\u1170,\u11ad": "0xbe", + ",\u1170,\u11ae": "0xbe", + ",\u1170,\u11af": "0xbe", + ",\u1170,\u11b0": "0xbe", + ",\u1170,\u11b1": "0xbe", + ",\u1170,\u11b2": "0xbe", + ",\u1170,\u11b3": "0xbe", + ",\u1170,\u11b4": "0xbe", + ",\u1170,\u11b5": "0xbe", + ",\u1170,\u11b6": "0xbe", + ",\u1170,\u11b7": "0xbe", + ",\u1170,\u11b8": "0xbe", + ",\u1170,\u11b9": "0xbe", + ",\u1170,\u11ba": "0xbe", + ",\u1170,\u11bb": "0xbe", + ",\u1170,\u11bc": "0xbe", + ",\u1170,\u11bd": "0xbe", + ",\u1170,\u11be": "0xbe", + ",\u1170,\u11bf": "0xbe", + ",\u1170,\u11c0": "0xbe", + ",\u1170,\u11c1": "0xbe", + ",\u1170,\u11c2": "0xbe" + } + } + ], + "\u110f": [ + { + "defaultGlyph": "0x12", + "alternatives": { + ",\u1166": "0x3f", + ",\u1162": "0x3f", + ",\u1164": "0x3f", + ",\u1168": "0x3f" + } + }, + { + "defaultGlyph": "0x5f", + "alternatives": {} + }, + { + "defaultGlyph": "0x8c", + "alternatives": { + ",\u116a": "0xaf", + ",\u116b": "0xaf", + ",\u1170": "0xaf" + } + }, + { + "defaultGlyph": "0x12", + "alternatives": { + ",\u1162,\u11ab": "0x3f", + ",\u1162,\u11ba": "0x3f", + ",\u1166,\u11ba": "0x3f", + ",\u1162,\u11b8": "0x3f", + ",\u1162,\u11a8": "0x3f", + ",\u1162,\u11a9": "0x3f", + ",\u1162,\u11aa": "0x3f", + ",\u1162,\u11ac": "0x3f", + ",\u1162,\u11ad": "0x3f", + ",\u1162,\u11ae": "0x3f", + ",\u1162,\u11af": "0x3f", + ",\u1162,\u11b0": "0x3f", + ",\u1162,\u11b1": "0x3f", + ",\u1162,\u11b2": "0x3f", + ",\u1162,\u11b3": "0x3f", + ",\u1162,\u11b4": "0x3f", + ",\u1162,\u11b5": "0x3f", + ",\u1162,\u11b6": "0x3f", + ",\u1162,\u11b7": "0x3f", + ",\u1162,\u11b9": "0x3f", + ",\u1162,\u11bb": "0x3f", + ",\u1162,\u11bc": "0x3f", + ",\u1162,\u11bd": "0x3f", + ",\u1162,\u11be": "0x3f", + ",\u1162,\u11bf": "0x3f", + ",\u1162,\u11c0": "0x3f", + ",\u1162,\u11c1": "0x3f", + ",\u1162,\u11c2": "0x3f", + ",\u1164,\u11a8": "0x3f", + ",\u1164,\u11a9": "0x3f", + ",\u1164,\u11aa": "0x3f", + ",\u1164,\u11ab": "0x3f", + ",\u1164,\u11ac": "0x3f", + ",\u1164,\u11ad": "0x3f", + ",\u1164,\u11ae": "0x3f", + ",\u1164,\u11af": "0x3f", + ",\u1164,\u11b0": "0x3f", + ",\u1164,\u11b1": "0x3f", + ",\u1164,\u11b2": "0x3f", + ",\u1164,\u11b3": "0x3f", + ",\u1164,\u11b4": "0x3f", + ",\u1164,\u11b5": "0x3f", + ",\u1164,\u11b6": "0x3f", + ",\u1164,\u11b7": "0x3f", + ",\u1164,\u11b8": "0x3f", + ",\u1164,\u11b9": "0x3f", + ",\u1164,\u11ba": "0x3f", + ",\u1164,\u11bb": "0x3f", + ",\u1164,\u11bc": "0x3f", + ",\u1164,\u11bd": "0x3f", + ",\u1164,\u11be": "0x3f", + ",\u1164,\u11bf": "0x3f", + ",\u1164,\u11c0": "0x3f", + ",\u1164,\u11c1": "0x3f", + ",\u1164,\u11c2": "0x3f", + ",\u1166,\u11a8": "0x3f", + ",\u1166,\u11a9": "0x3f", + ",\u1166,\u11aa": "0x3f", + ",\u1166,\u11ab": "0x3f", + ",\u1166,\u11ac": "0x3f", + ",\u1166,\u11ad": "0x3f", + ",\u1166,\u11ae": "0x3f", + ",\u1166,\u11af": "0x3f", + ",\u1166,\u11b0": "0x3f", + ",\u1166,\u11b1": "0x3f", + ",\u1166,\u11b2": "0x3f", + ",\u1166,\u11b3": "0x3f", + ",\u1166,\u11b4": "0x3f", + ",\u1166,\u11b5": "0x3f", + ",\u1166,\u11b6": "0x3f", + ",\u1166,\u11b7": "0x3f", + ",\u1166,\u11b8": "0x3f", + ",\u1166,\u11b9": "0x3f", + ",\u1166,\u11bb": "0x3f", + ",\u1166,\u11bc": "0x3f", + ",\u1166,\u11bd": "0x3f", + ",\u1166,\u11be": "0x3f", + ",\u1166,\u11bf": "0x3f", + ",\u1166,\u11c0": "0x3f", + ",\u1166,\u11c1": "0x3f", + ",\u1166,\u11c2": "0x3f", + ",\u1168,\u11a8": "0x3f", + ",\u1168,\u11a9": "0x3f", + ",\u1168,\u11aa": "0x3f", + ",\u1168,\u11ab": "0x3f", + ",\u1168,\u11ac": "0x3f", + ",\u1168,\u11ad": "0x3f", + ",\u1168,\u11ae": "0x3f", + ",\u1168,\u11af": "0x3f", + ",\u1168,\u11b0": "0x3f", + ",\u1168,\u11b1": "0x3f", + ",\u1168,\u11b2": "0x3f", + ",\u1168,\u11b3": "0x3f", + ",\u1168,\u11b4": "0x3f", + ",\u1168,\u11b5": "0x3f", + ",\u1168,\u11b6": "0x3f", + ",\u1168,\u11b7": "0x3f", + ",\u1168,\u11b8": "0x3f", + ",\u1168,\u11b9": "0x3f", + ",\u1168,\u11ba": "0x3f", + ",\u1168,\u11bb": "0x3f", + ",\u1168,\u11bc": "0x3f", + ",\u1168,\u11bd": "0x3f", + ",\u1168,\u11be": "0x3f", + ",\u1168,\u11bf": "0x3f", + ",\u1168,\u11c0": "0x3f", + ",\u1168,\u11c1": "0x3f", + ",\u1168,\u11c2": "0x3f" + } + }, + { + "defaultGlyph": "0x5f", + "alternatives": {} + }, + { + "defaultGlyph": "0x8c", + "alternatives": { + ",\u116a,\u11a8": "0xaf", + ",\u116a,\u11a9": "0xaf", + ",\u116a,\u11aa": "0xaf", + ",\u116a,\u11ab": "0xaf", + ",\u116a,\u11ac": "0xaf", + ",\u116a,\u11ad": "0xaf", + ",\u116a,\u11ae": "0xaf", + ",\u116a,\u11af": "0xaf", + ",\u116a,\u11b0": "0xaf", + ",\u116a,\u11b1": "0xaf", + ",\u116a,\u11b2": "0xaf", + ",\u116a,\u11b3": "0xaf", + ",\u116a,\u11b4": "0xaf", + ",\u116a,\u11b5": "0xaf", + ",\u116a,\u11b6": "0xaf", + ",\u116a,\u11b7": "0xaf", + ",\u116a,\u11b8": "0xaf", + ",\u116a,\u11b9": "0xaf", + ",\u116a,\u11ba": "0xaf", + ",\u116a,\u11bb": "0xaf", + ",\u116a,\u11bc": "0xaf", + ",\u116a,\u11bd": "0xaf", + ",\u116a,\u11be": "0xaf", + ",\u116a,\u11bf": "0xaf", + ",\u116a,\u11c0": "0xaf", + ",\u116a,\u11c1": "0xaf", + ",\u116a,\u11c2": "0xaf", + ",\u116b,\u11a8": "0xaf", + ",\u116b,\u11a9": "0xaf", + ",\u116b,\u11aa": "0xaf", + ",\u116b,\u11ab": "0xaf", + ",\u116b,\u11ac": "0xaf", + ",\u116b,\u11ad": "0xaf", + ",\u116b,\u11ae": "0xaf", + ",\u116b,\u11af": "0xaf", + ",\u116b,\u11b0": "0xaf", + ",\u116b,\u11b1": "0xaf", + ",\u116b,\u11b2": "0xaf", + ",\u116b,\u11b3": "0xaf", + ",\u116b,\u11b4": "0xaf", + ",\u116b,\u11b5": "0xaf", + ",\u116b,\u11b6": "0xaf", + ",\u116b,\u11b7": "0xaf", + ",\u116b,\u11b8": "0xaf", + ",\u116b,\u11b9": "0xaf", + ",\u116b,\u11ba": "0xaf", + ",\u116b,\u11bb": "0xaf", + ",\u116b,\u11bc": "0xaf", + ",\u116b,\u11bd": "0xaf", + ",\u116b,\u11be": "0xaf", + ",\u116b,\u11bf": "0xaf", + ",\u116b,\u11c0": "0xaf", + ",\u116b,\u11c1": "0xaf", + ",\u116b,\u11c2": "0xaf", + ",\u1170,\u11a8": "0xaf", + ",\u1170,\u11a9": "0xaf", + ",\u1170,\u11aa": "0xaf", + ",\u1170,\u11ab": "0xaf", + ",\u1170,\u11ac": "0xaf", + ",\u1170,\u11ad": "0xaf", + ",\u1170,\u11ae": "0xaf", + ",\u1170,\u11af": "0xaf", + ",\u1170,\u11b0": "0xaf", + ",\u1170,\u11b1": "0xaf", + ",\u1170,\u11b2": "0xaf", + ",\u1170,\u11b3": "0xaf", + ",\u1170,\u11b4": "0xaf", + ",\u1170,\u11b5": "0xaf", + ",\u1170,\u11b6": "0xaf", + ",\u1170,\u11b7": "0xaf", + ",\u1170,\u11b8": "0xaf", + ",\u1170,\u11b9": "0xaf", + ",\u1170,\u11ba": "0xaf", + ",\u1170,\u11bb": "0xaf", + ",\u1170,\u11bc": "0xaf", + ",\u1170,\u11bd": "0xaf", + ",\u1170,\u11be": "0xaf", + ",\u1170,\u11bf": "0xaf", + ",\u1170,\u11c0": "0xaf", + ",\u1170,\u11c1": "0xaf", + ",\u1170,\u11c2": "0xaf" + } + } + ], + "\u1110": [ + { + "defaultGlyph": "0x29", + "alternatives": { + ",\u1166": "0x54", + ",\u1161": "0x13", + ",\u1175": "0x13", + ",\u1162": "0x40", + ",\u1163": "0x13", + ",\u1164": "0x40", + ",\u1168": "0x54" + } + }, + { + "defaultGlyph": "0x7c", + "alternatives": {} + }, + { + "defaultGlyph": "0x9f", + "alternatives": { + ",\u116a": "0xbf", + ",\u116b": "0xbf", + ",\u1170": "0xbf" + } + }, + { + "defaultGlyph": "0x13", + "alternatives": { + ",\u1162,\u11a8": "0x40", + ",\u1162,\u11bc": "0x40", + ",\u1166,\u11ab": "0x54", + ",\u1166,\u11af": "0x54", + ",\u1166,\u11b7": "0x54", + ",\u1165,\u11bc": "0x29", + ",\u1165,\u11af": "0x29", + ",\u1165,\u11a8": "0x29", + ",\u1162,\u11a9": "0x40", + ",\u1162,\u11aa": "0x40", + ",\u1162,\u11ab": "0x40", + ",\u1162,\u11ac": "0x40", + ",\u1162,\u11ad": "0x40", + ",\u1162,\u11ae": "0x40", + ",\u1162,\u11af": "0x40", + ",\u1162,\u11b0": "0x40", + ",\u1162,\u11b1": "0x40", + ",\u1162,\u11b2": "0x40", + ",\u1162,\u11b3": "0x40", + ",\u1162,\u11b4": "0x40", + ",\u1162,\u11b5": "0x40", + ",\u1162,\u11b6": "0x40", + ",\u1162,\u11b7": "0x40", + ",\u1162,\u11b8": "0x40", + ",\u1162,\u11b9": "0x40", + ",\u1162,\u11ba": "0x40", + ",\u1162,\u11bb": "0x40", + ",\u1162,\u11bd": "0x40", + ",\u1162,\u11be": "0x40", + ",\u1162,\u11bf": "0x40", + ",\u1162,\u11c0": "0x40", + ",\u1162,\u11c1": "0x40", + ",\u1162,\u11c2": "0x40", + ",\u1164,\u11a8": "0x40", + ",\u1164,\u11a9": "0x40", + ",\u1164,\u11aa": "0x40", + ",\u1164,\u11ab": "0x40", + ",\u1164,\u11ac": "0x40", + ",\u1164,\u11ad": "0x40", + ",\u1164,\u11ae": "0x40", + ",\u1164,\u11af": "0x40", + ",\u1164,\u11b0": "0x40", + ",\u1164,\u11b1": "0x40", + ",\u1164,\u11b2": "0x40", + ",\u1164,\u11b3": "0x40", + ",\u1164,\u11b4": "0x40", + ",\u1164,\u11b5": "0x40", + ",\u1164,\u11b6": "0x40", + ",\u1164,\u11b7": "0x40", + ",\u1164,\u11b8": "0x40", + ",\u1164,\u11b9": "0x40", + ",\u1164,\u11ba": "0x40", + ",\u1164,\u11bb": "0x40", + ",\u1164,\u11bc": "0x40", + ",\u1164,\u11bd": "0x40", + ",\u1164,\u11be": "0x40", + ",\u1164,\u11bf": "0x40", + ",\u1164,\u11c0": "0x40", + ",\u1164,\u11c1": "0x40", + ",\u1164,\u11c2": "0x40", + ",\u1166,\u11a8": "0x54", + ",\u1166,\u11a9": "0x54", + ",\u1166,\u11aa": "0x54", + ",\u1166,\u11ac": "0x54", + ",\u1166,\u11ad": "0x54", + ",\u1166,\u11ae": "0x54", + ",\u1166,\u11b0": "0x54", + ",\u1166,\u11b1": "0x54", + ",\u1166,\u11b2": "0x54", + ",\u1166,\u11b3": "0x54", + ",\u1166,\u11b4": "0x54", + ",\u1166,\u11b5": "0x54", + ",\u1166,\u11b6": "0x54", + ",\u1166,\u11b8": "0x54", + ",\u1166,\u11b9": "0x54", + ",\u1166,\u11ba": "0x54", + ",\u1166,\u11bb": "0x54", + ",\u1166,\u11bc": "0x54", + ",\u1166,\u11bd": "0x54", + ",\u1166,\u11be": "0x54", + ",\u1166,\u11bf": "0x54", + ",\u1166,\u11c0": "0x54", + ",\u1166,\u11c1": "0x54", + ",\u1166,\u11c2": "0x54", + ",\u1167,\u11a8": "0x40", + ",\u1167,\u11a9": "0x40", + ",\u1167,\u11aa": "0x40", + ",\u1167,\u11ab": "0x40", + ",\u1167,\u11ac": "0x40", + ",\u1167,\u11ad": "0x40", + ",\u1167,\u11ae": "0x40", + ",\u1167,\u11af": "0x40", + ",\u1167,\u11b0": "0x40", + ",\u1167,\u11b1": "0x40", + ",\u1167,\u11b2": "0x40", + ",\u1167,\u11b3": "0x40", + ",\u1167,\u11b4": "0x40", + ",\u1167,\u11b5": "0x40", + ",\u1167,\u11b6": "0x40", + ",\u1167,\u11b7": "0x40", + ",\u1167,\u11b8": "0x40", + ",\u1167,\u11b9": "0x40", + ",\u1167,\u11ba": "0x40", + ",\u1167,\u11bb": "0x40", + ",\u1167,\u11bc": "0x40", + ",\u1167,\u11bd": "0x40", + ",\u1167,\u11be": "0x40", + ",\u1167,\u11bf": "0x40", + ",\u1167,\u11c0": "0x40", + ",\u1167,\u11c1": "0x40", + ",\u1167,\u11c2": "0x40", + ",\u1168,\u11a8": "0x54", + ",\u1168,\u11a9": "0x54", + ",\u1168,\u11aa": "0x54", + ",\u1168,\u11ab": "0x54", + ",\u1168,\u11ac": "0x54", + ",\u1168,\u11ad": "0x54", + ",\u1168,\u11ae": "0x54", + ",\u1168,\u11af": "0x54", + ",\u1168,\u11b0": "0x54", + ",\u1168,\u11b1": "0x54", + ",\u1168,\u11b2": "0x54", + ",\u1168,\u11b3": "0x54", + ",\u1168,\u11b4": "0x54", + ",\u1168,\u11b5": "0x54", + ",\u1168,\u11b6": "0x54", + ",\u1168,\u11b7": "0x54", + ",\u1168,\u11b8": "0x54", + ",\u1168,\u11b9": "0x54", + ",\u1168,\u11ba": "0x54", + ",\u1168,\u11bb": "0x54", + ",\u1168,\u11bc": "0x54", + ",\u1168,\u11bd": "0x54", + ",\u1168,\u11be": "0x54", + ",\u1168,\u11bf": "0x54", + ",\u1168,\u11c0": "0x54", + ",\u1168,\u11c1": "0x54", + ",\u1168,\u11c2": "0x54" + } + }, + { + "defaultGlyph": "0x7c", + "alternatives": {} + }, + { + "defaultGlyph": "0x9f", + "alternatives": { + ",\u116a,\u11a8": "0xbf", + ",\u116a,\u11a9": "0xbf", + ",\u116a,\u11aa": "0xbf", + ",\u116a,\u11ab": "0xbf", + ",\u116a,\u11ac": "0xbf", + ",\u116a,\u11ad": "0xbf", + ",\u116a,\u11ae": "0xbf", + ",\u116a,\u11af": "0xbf", + ",\u116a,\u11b0": "0xbf", + ",\u116a,\u11b1": "0xbf", + ",\u116a,\u11b2": "0xbf", + ",\u116a,\u11b3": "0xbf", + ",\u116a,\u11b4": "0xbf", + ",\u116a,\u11b5": "0xbf", + ",\u116a,\u11b6": "0xbf", + ",\u116a,\u11b7": "0xbf", + ",\u116a,\u11b8": "0xbf", + ",\u116a,\u11b9": "0xbf", + ",\u116a,\u11ba": "0xbf", + ",\u116a,\u11bb": "0xbf", + ",\u116a,\u11bc": "0xbf", + ",\u116a,\u11bd": "0xbf", + ",\u116a,\u11be": "0xbf", + ",\u116a,\u11bf": "0xbf", + ",\u116a,\u11c0": "0xbf", + ",\u116a,\u11c1": "0xbf", + ",\u116a,\u11c2": "0xbf", + ",\u116b,\u11a8": "0xbf", + ",\u116b,\u11a9": "0xbf", + ",\u116b,\u11aa": "0xbf", + ",\u116b,\u11ab": "0xbf", + ",\u116b,\u11ac": "0xbf", + ",\u116b,\u11ad": "0xbf", + ",\u116b,\u11ae": "0xbf", + ",\u116b,\u11af": "0xbf", + ",\u116b,\u11b0": "0xbf", + ",\u116b,\u11b1": "0xbf", + ",\u116b,\u11b2": "0xbf", + ",\u116b,\u11b3": "0xbf", + ",\u116b,\u11b4": "0xbf", + ",\u116b,\u11b5": "0xbf", + ",\u116b,\u11b6": "0xbf", + ",\u116b,\u11b7": "0xbf", + ",\u116b,\u11b8": "0xbf", + ",\u116b,\u11b9": "0xbf", + ",\u116b,\u11ba": "0xbf", + ",\u116b,\u11bb": "0xbf", + ",\u116b,\u11bc": "0xbf", + ",\u116b,\u11bd": "0xbf", + ",\u116b,\u11be": "0xbf", + ",\u116b,\u11bf": "0xbf", + ",\u116b,\u11c0": "0xbf", + ",\u116b,\u11c1": "0xbf", + ",\u116b,\u11c2": "0xbf", + ",\u1170,\u11a8": "0xbf", + ",\u1170,\u11a9": "0xbf", + ",\u1170,\u11aa": "0xbf", + ",\u1170,\u11ab": "0xbf", + ",\u1170,\u11ac": "0xbf", + ",\u1170,\u11ad": "0xbf", + ",\u1170,\u11ae": "0xbf", + ",\u1170,\u11af": "0xbf", + ",\u1170,\u11b0": "0xbf", + ",\u1170,\u11b1": "0xbf", + ",\u1170,\u11b2": "0xbf", + ",\u1170,\u11b3": "0xbf", + ",\u1170,\u11b4": "0xbf", + ",\u1170,\u11b5": "0xbf", + ",\u1170,\u11b6": "0xbf", + ",\u1170,\u11b7": "0xbf", + ",\u1170,\u11b8": "0xbf", + ",\u1170,\u11b9": "0xbf", + ",\u1170,\u11ba": "0xbf", + ",\u1170,\u11bb": "0xbf", + ",\u1170,\u11bc": "0xbf", + ",\u1170,\u11bd": "0xbf", + ",\u1170,\u11be": "0xbf", + ",\u1170,\u11bf": "0xbf", + ",\u1170,\u11c0": "0xbf", + ",\u1170,\u11c1": "0xbf", + ",\u1170,\u11c2": "0xbf" + } + } + ], + "\u1111": [ + { + "defaultGlyph": "0x14", + "alternatives": { + ",\u1162": "0x41", + ",\u1166": "0x55", + ",\u1168": "0x55", + ",\u1165": "0x2a", + ",\u1161": "0x2a", + ",\u1164": "0x41", + ",\u1163": "0x2a", + ",\u1167": "0x2a" + } + }, + { + "defaultGlyph": "0x7d", + "alternatives": {} + }, + { + "defaultGlyph": "0xa0", + "alternatives": {} + }, + { + "defaultGlyph": "0x14", + "alternatives": { + ",\u1165,\u11b7": "0x2a", + ",\u1167,\u11ab": "0x41", + ",\u1167,\u11bc": "0x41", + ",\u1166,\u11ba": "0x55", + ",\u1162,\u11ab": "0x41", + ",\u1162,\u11a8": "0x41", + ",\u1162,\u11a9": "0x41", + ",\u1162,\u11aa": "0x41", + ",\u1162,\u11ac": "0x41", + ",\u1162,\u11ad": "0x41", + ",\u1162,\u11ae": "0x41", + ",\u1162,\u11af": "0x41", + ",\u1162,\u11b0": "0x41", + ",\u1162,\u11b1": "0x41", + ",\u1162,\u11b2": "0x41", + ",\u1162,\u11b3": "0x41", + ",\u1162,\u11b4": "0x41", + ",\u1162,\u11b5": "0x41", + ",\u1162,\u11b6": "0x41", + ",\u1162,\u11b7": "0x41", + ",\u1162,\u11b8": "0x41", + ",\u1162,\u11b9": "0x41", + ",\u1162,\u11ba": "0x41", + ",\u1162,\u11bb": "0x41", + ",\u1162,\u11bc": "0x41", + ",\u1162,\u11bd": "0x41", + ",\u1162,\u11be": "0x41", + ",\u1162,\u11bf": "0x41", + ",\u1162,\u11c0": "0x41", + ",\u1162,\u11c1": "0x41", + ",\u1162,\u11c2": "0x41", + ",\u1163,\u11a8": "0x41", + ",\u1163,\u11a9": "0x41", + ",\u1163,\u11aa": "0x41", + ",\u1163,\u11ab": "0x41", + ",\u1163,\u11ac": "0x41", + ",\u1163,\u11ad": "0x41", + ",\u1163,\u11ae": "0x41", + ",\u1163,\u11af": "0x41", + ",\u1163,\u11b0": "0x41", + ",\u1163,\u11b1": "0x41", + ",\u1163,\u11b2": "0x41", + ",\u1163,\u11b3": "0x41", + ",\u1163,\u11b4": "0x41", + ",\u1163,\u11b5": "0x41", + ",\u1163,\u11b6": "0x41", + ",\u1163,\u11b7": "0x41", + ",\u1163,\u11b8": "0x41", + ",\u1163,\u11b9": "0x41", + ",\u1163,\u11ba": "0x41", + ",\u1163,\u11bb": "0x41", + ",\u1163,\u11bc": "0x41", + ",\u1163,\u11bd": "0x41", + ",\u1163,\u11be": "0x41", + ",\u1163,\u11bf": "0x41", + ",\u1163,\u11c0": "0x41", + ",\u1163,\u11c1": "0x41", + ",\u1163,\u11c2": "0x41", + ",\u1164,\u11a8": "0x41", + ",\u1164,\u11a9": "0x41", + ",\u1164,\u11aa": "0x41", + ",\u1164,\u11ab": "0x41", + ",\u1164,\u11ac": "0x41", + ",\u1164,\u11ad": "0x41", + ",\u1164,\u11ae": "0x41", + ",\u1164,\u11af": "0x41", + ",\u1164,\u11b0": "0x41", + ",\u1164,\u11b1": "0x41", + ",\u1164,\u11b2": "0x41", + ",\u1164,\u11b3": "0x41", + ",\u1164,\u11b4": "0x41", + ",\u1164,\u11b5": "0x41", + ",\u1164,\u11b6": "0x41", + ",\u1164,\u11b7": "0x41", + ",\u1164,\u11b8": "0x41", + ",\u1164,\u11b9": "0x41", + ",\u1164,\u11ba": "0x41", + ",\u1164,\u11bb": "0x41", + ",\u1164,\u11bc": "0x41", + ",\u1164,\u11bd": "0x41", + ",\u1164,\u11be": "0x41", + ",\u1164,\u11bf": "0x41", + ",\u1164,\u11c0": "0x41", + ",\u1164,\u11c1": "0x41", + ",\u1164,\u11c2": "0x41", + ",\u1165,\u11a8": "0x2a", + ",\u1165,\u11a9": "0x2a", + ",\u1165,\u11aa": "0x2a", + ",\u1165,\u11ab": "0x2a", + ",\u1165,\u11ac": "0x2a", + ",\u1165,\u11ad": "0x2a", + ",\u1165,\u11ae": "0x2a", + ",\u1165,\u11af": "0x2a", + ",\u1165,\u11b0": "0x2a", + ",\u1165,\u11b1": "0x2a", + ",\u1165,\u11b2": "0x2a", + ",\u1165,\u11b3": "0x2a", + ",\u1165,\u11b4": "0x2a", + ",\u1165,\u11b5": "0x2a", + ",\u1165,\u11b6": "0x2a", + ",\u1165,\u11b8": "0x2a", + ",\u1165,\u11b9": "0x2a", + ",\u1165,\u11ba": "0x2a", + ",\u1165,\u11bb": "0x2a", + ",\u1165,\u11bc": "0x2a", + ",\u1165,\u11bd": "0x2a", + ",\u1165,\u11be": "0x2a", + ",\u1165,\u11bf": "0x2a", + ",\u1165,\u11c0": "0x2a", + ",\u1165,\u11c1": "0x2a", + ",\u1165,\u11c2": "0x2a", + ",\u1166,\u11a8": "0x55", + ",\u1166,\u11a9": "0x55", + ",\u1166,\u11aa": "0x55", + ",\u1166,\u11ab": "0x55", + ",\u1166,\u11ac": "0x55", + ",\u1166,\u11ad": "0x55", + ",\u1166,\u11ae": "0x55", + ",\u1166,\u11af": "0x55", + ",\u1166,\u11b0": "0x55", + ",\u1166,\u11b1": "0x55", + ",\u1166,\u11b2": "0x55", + ",\u1166,\u11b3": "0x55", + ",\u1166,\u11b4": "0x55", + ",\u1166,\u11b5": "0x55", + ",\u1166,\u11b6": "0x55", + ",\u1166,\u11b7": "0x55", + ",\u1166,\u11b8": "0x55", + ",\u1166,\u11b9": "0x55", + ",\u1166,\u11bb": "0x55", + ",\u1166,\u11bc": "0x55", + ",\u1166,\u11bd": "0x55", + ",\u1166,\u11be": "0x55", + ",\u1166,\u11bf": "0x55", + ",\u1166,\u11c0": "0x55", + ",\u1166,\u11c1": "0x55", + ",\u1166,\u11c2": "0x55", + ",\u1167,\u11a8": "0x41", + ",\u1167,\u11a9": "0x41", + ",\u1167,\u11aa": "0x41", + ",\u1167,\u11ac": "0x41", + ",\u1167,\u11ad": "0x41", + ",\u1167,\u11ae": "0x41", + ",\u1167,\u11af": "0x41", + ",\u1167,\u11b0": "0x41", + ",\u1167,\u11b1": "0x41", + ",\u1167,\u11b2": "0x41", + ",\u1167,\u11b3": "0x41", + ",\u1167,\u11b4": "0x41", + ",\u1167,\u11b5": "0x41", + ",\u1167,\u11b6": "0x41", + ",\u1167,\u11b7": "0x41", + ",\u1167,\u11b8": "0x41", + ",\u1167,\u11b9": "0x41", + ",\u1167,\u11ba": "0x41", + ",\u1167,\u11bb": "0x41", + ",\u1167,\u11bd": "0x41", + ",\u1167,\u11be": "0x41", + ",\u1167,\u11bf": "0x41", + ",\u1167,\u11c0": "0x41", + ",\u1167,\u11c1": "0x41", + ",\u1167,\u11c2": "0x41", + ",\u1168,\u11a8": "0x55", + ",\u1168,\u11a9": "0x55", + ",\u1168,\u11aa": "0x55", + ",\u1168,\u11ab": "0x55", + ",\u1168,\u11ac": "0x55", + ",\u1168,\u11ad": "0x55", + ",\u1168,\u11ae": "0x55", + ",\u1168,\u11af": "0x55", + ",\u1168,\u11b0": "0x55", + ",\u1168,\u11b1": "0x55", + ",\u1168,\u11b2": "0x55", + ",\u1168,\u11b3": "0x55", + ",\u1168,\u11b4": "0x55", + ",\u1168,\u11b5": "0x55", + ",\u1168,\u11b6": "0x55", + ",\u1168,\u11b7": "0x55", + ",\u1168,\u11b8": "0x55", + ",\u1168,\u11b9": "0x55", + ",\u1168,\u11ba": "0x55", + ",\u1168,\u11bb": "0x55", + ",\u1168,\u11bc": "0x55", + ",\u1168,\u11bd": "0x55", + ",\u1168,\u11be": "0x55", + ",\u1168,\u11bf": "0x55", + ",\u1168,\u11c0": "0x55", + ",\u1168,\u11c1": "0x55", + ",\u1168,\u11c2": "0x55" + } + }, + { + "defaultGlyph": "0x7d", + "alternatives": {} + }, + { + "defaultGlyph": "0xa0", + "alternatives": {} + } + ], + "\u1112": [ + { + "defaultGlyph": "0x2e", + "alternatives": { + ",\u1166": "0x59", + ",\u1162": "0x59", + ",\u1168": "0x59", + ",\u1164": "0x59" + } + }, + { + "defaultGlyph": "0x7e", + "alternatives": {} + }, + { + "defaultGlyph": "0xa1", + "alternatives": { + ",\u116a": "0xc0", + ",\u116b": "0xc0", + ",\u1170": "0xc0" + } + }, + { + "defaultGlyph": "0x2e", + "alternatives": { + ",\u1162,\u11bc": "0x59", + ",\u1162,\u11bb": "0x59", + ",\u1166,\u11af": "0x59", + ",\u1162,\u11b7": "0x59", + ",\u1166,\u11ba": "0x59", + ",\u1162,\u11ab": "0x59", + ",\u1166,\u11b7": "0x59", + ",\u1161,\u11a8": "0x59", + ",\u1161,\u11a9": "0x59", + ",\u1161,\u11aa": "0x59", + ",\u1161,\u11ab": "0x59", + ",\u1161,\u11ac": "0x59", + ",\u1161,\u11ad": "0x59", + ",\u1161,\u11ae": "0x59", + ",\u1161,\u11af": "0x59", + ",\u1161,\u11b0": "0x59", + ",\u1161,\u11b1": "0x59", + ",\u1161,\u11b2": "0x59", + ",\u1161,\u11b3": "0x59", + ",\u1161,\u11b4": "0x59", + ",\u1161,\u11b5": "0x59", + ",\u1161,\u11b6": "0x59", + ",\u1161,\u11b7": "0x59", + ",\u1161,\u11b8": "0x59", + ",\u1161,\u11b9": "0x59", + ",\u1161,\u11ba": "0x59", + ",\u1161,\u11bb": "0x59", + ",\u1161,\u11bc": "0x59", + ",\u1161,\u11bd": "0x59", + ",\u1161,\u11be": "0x59", + ",\u1161,\u11bf": "0x59", + ",\u1161,\u11c0": "0x59", + ",\u1161,\u11c1": "0x59", + ",\u1161,\u11c2": "0x59", + ",\u1162,\u11a8": "0x59", + ",\u1162,\u11a9": "0x59", + ",\u1162,\u11aa": "0x59", + ",\u1162,\u11ac": "0x59", + ",\u1162,\u11ad": "0x59", + ",\u1162,\u11ae": "0x59", + ",\u1162,\u11af": "0x59", + ",\u1162,\u11b0": "0x59", + ",\u1162,\u11b1": "0x59", + ",\u1162,\u11b2": "0x59", + ",\u1162,\u11b3": "0x59", + ",\u1162,\u11b4": "0x59", + ",\u1162,\u11b5": "0x59", + ",\u1162,\u11b6": "0x59", + ",\u1162,\u11b8": "0x59", + ",\u1162,\u11b9": "0x59", + ",\u1162,\u11ba": "0x59", + ",\u1162,\u11bd": "0x59", + ",\u1162,\u11be": "0x59", + ",\u1162,\u11bf": "0x59", + ",\u1162,\u11c0": "0x59", + ",\u1162,\u11c1": "0x59", + ",\u1162,\u11c2": "0x59", + ",\u1163,\u11a8": "0x59", + ",\u1163,\u11a9": "0x59", + ",\u1163,\u11aa": "0x59", + ",\u1163,\u11ab": "0x59", + ",\u1163,\u11ac": "0x59", + ",\u1163,\u11ad": "0x59", + ",\u1163,\u11ae": "0x59", + ",\u1163,\u11af": "0x59", + ",\u1163,\u11b0": "0x59", + ",\u1163,\u11b1": "0x59", + ",\u1163,\u11b2": "0x59", + ",\u1163,\u11b3": "0x59", + ",\u1163,\u11b4": "0x59", + ",\u1163,\u11b5": "0x59", + ",\u1163,\u11b6": "0x59", + ",\u1163,\u11b7": "0x59", + ",\u1163,\u11b8": "0x59", + ",\u1163,\u11b9": "0x59", + ",\u1163,\u11ba": "0x59", + ",\u1163,\u11bb": "0x59", + ",\u1163,\u11bc": "0x59", + ",\u1163,\u11bd": "0x59", + ",\u1163,\u11be": "0x59", + ",\u1163,\u11bf": "0x59", + ",\u1163,\u11c0": "0x59", + ",\u1163,\u11c1": "0x59", + ",\u1163,\u11c2": "0x59", + ",\u1164,\u11a8": "0x59", + ",\u1164,\u11a9": "0x59", + ",\u1164,\u11aa": "0x59", + ",\u1164,\u11ab": "0x59", + ",\u1164,\u11ac": "0x59", + ",\u1164,\u11ad": "0x59", + ",\u1164,\u11ae": "0x59", + ",\u1164,\u11af": "0x59", + ",\u1164,\u11b0": "0x59", + ",\u1164,\u11b1": "0x59", + ",\u1164,\u11b2": "0x59", + ",\u1164,\u11b3": "0x59", + ",\u1164,\u11b4": "0x59", + ",\u1164,\u11b5": "0x59", + ",\u1164,\u11b6": "0x59", + ",\u1164,\u11b7": "0x59", + ",\u1164,\u11b8": "0x59", + ",\u1164,\u11b9": "0x59", + ",\u1164,\u11ba": "0x59", + ",\u1164,\u11bb": "0x59", + ",\u1164,\u11bc": "0x59", + ",\u1164,\u11bd": "0x59", + ",\u1164,\u11be": "0x59", + ",\u1164,\u11bf": "0x59", + ",\u1164,\u11c0": "0x59", + ",\u1164,\u11c1": "0x59", + ",\u1164,\u11c2": "0x59", + ",\u1166,\u11a8": "0x59", + ",\u1166,\u11a9": "0x59", + ",\u1166,\u11aa": "0x59", + ",\u1166,\u11ab": "0x59", + ",\u1166,\u11ac": "0x59", + ",\u1166,\u11ad": "0x59", + ",\u1166,\u11ae": "0x59", + ",\u1166,\u11b0": "0x59", + ",\u1166,\u11b1": "0x59", + ",\u1166,\u11b2": "0x59", + ",\u1166,\u11b3": "0x59", + ",\u1166,\u11b4": "0x59", + ",\u1166,\u11b5": "0x59", + ",\u1166,\u11b6": "0x59", + ",\u1166,\u11b8": "0x59", + ",\u1166,\u11b9": "0x59", + ",\u1166,\u11bb": "0x59", + ",\u1166,\u11bc": "0x59", + ",\u1166,\u11bd": "0x59", + ",\u1166,\u11be": "0x59", + ",\u1166,\u11bf": "0x59", + ",\u1166,\u11c0": "0x59", + ",\u1166,\u11c1": "0x59", + ",\u1166,\u11c2": "0x59", + ",\u1167,\u11a8": "0x59", + ",\u1167,\u11a9": "0x59", + ",\u1167,\u11aa": "0x59", + ",\u1167,\u11ab": "0x59", + ",\u1167,\u11ac": "0x59", + ",\u1167,\u11ad": "0x59", + ",\u1167,\u11ae": "0x59", + ",\u1167,\u11af": "0x59", + ",\u1167,\u11b0": "0x59", + ",\u1167,\u11b1": "0x59", + ",\u1167,\u11b2": "0x59", + ",\u1167,\u11b3": "0x59", + ",\u1167,\u11b4": "0x59", + ",\u1167,\u11b5": "0x59", + ",\u1167,\u11b6": "0x59", + ",\u1167,\u11b7": "0x59", + ",\u1167,\u11b8": "0x59", + ",\u1167,\u11b9": "0x59", + ",\u1167,\u11ba": "0x59", + ",\u1167,\u11bb": "0x59", + ",\u1167,\u11bc": "0x59", + ",\u1167,\u11bd": "0x59", + ",\u1167,\u11be": "0x59", + ",\u1167,\u11bf": "0x59", + ",\u1167,\u11c0": "0x59", + ",\u1167,\u11c1": "0x59", + ",\u1167,\u11c2": "0x59", + ",\u1168,\u11a8": "0x59", + ",\u1168,\u11a9": "0x59", + ",\u1168,\u11aa": "0x59", + ",\u1168,\u11ab": "0x59", + ",\u1168,\u11ac": "0x59", + ",\u1168,\u11ad": "0x59", + ",\u1168,\u11ae": "0x59", + ",\u1168,\u11af": "0x59", + ",\u1168,\u11b0": "0x59", + ",\u1168,\u11b1": "0x59", + ",\u1168,\u11b2": "0x59", + ",\u1168,\u11b3": "0x59", + ",\u1168,\u11b4": "0x59", + ",\u1168,\u11b5": "0x59", + ",\u1168,\u11b6": "0x59", + ",\u1168,\u11b7": "0x59", + ",\u1168,\u11b8": "0x59", + ",\u1168,\u11b9": "0x59", + ",\u1168,\u11ba": "0x59", + ",\u1168,\u11bb": "0x59", + ",\u1168,\u11bc": "0x59", + ",\u1168,\u11bd": "0x59", + ",\u1168,\u11be": "0x59", + ",\u1168,\u11bf": "0x59", + ",\u1168,\u11c0": "0x59", + ",\u1168,\u11c1": "0x59", + ",\u1168,\u11c2": "0x59" + } + }, + { + "defaultGlyph": "0x7e", + "alternatives": {} + }, + { + "defaultGlyph": "0xa1", + "alternatives": { + ",\u116a,\u11a8": "0xc0", + ",\u116a,\u11a9": "0xc0", + ",\u116a,\u11aa": "0xc0", + ",\u116a,\u11ab": "0xc0", + ",\u116a,\u11ac": "0xc0", + ",\u116a,\u11ad": "0xc0", + ",\u116a,\u11ae": "0xc0", + ",\u116a,\u11af": "0xc0", + ",\u116a,\u11b0": "0xc0", + ",\u116a,\u11b1": "0xc0", + ",\u116a,\u11b2": "0xc0", + ",\u116a,\u11b3": "0xc0", + ",\u116a,\u11b4": "0xc0", + ",\u116a,\u11b5": "0xc0", + ",\u116a,\u11b6": "0xc0", + ",\u116a,\u11b7": "0xc0", + ",\u116a,\u11b8": "0xc0", + ",\u116a,\u11b9": "0xc0", + ",\u116a,\u11ba": "0xc0", + ",\u116a,\u11bb": "0xc0", + ",\u116a,\u11bc": "0xc0", + ",\u116a,\u11bd": "0xc0", + ",\u116a,\u11be": "0xc0", + ",\u116a,\u11bf": "0xc0", + ",\u116a,\u11c0": "0xc0", + ",\u116a,\u11c1": "0xc0", + ",\u116a,\u11c2": "0xc0", + ",\u116b,\u11a8": "0xc0", + ",\u116b,\u11a9": "0xc0", + ",\u116b,\u11aa": "0xc0", + ",\u116b,\u11ab": "0xc0", + ",\u116b,\u11ac": "0xc0", + ",\u116b,\u11ad": "0xc0", + ",\u116b,\u11ae": "0xc0", + ",\u116b,\u11af": "0xc0", + ",\u116b,\u11b0": "0xc0", + ",\u116b,\u11b1": "0xc0", + ",\u116b,\u11b2": "0xc0", + ",\u116b,\u11b3": "0xc0", + ",\u116b,\u11b4": "0xc0", + ",\u116b,\u11b5": "0xc0", + ",\u116b,\u11b6": "0xc0", + ",\u116b,\u11b7": "0xc0", + ",\u116b,\u11b8": "0xc0", + ",\u116b,\u11b9": "0xc0", + ",\u116b,\u11ba": "0xc0", + ",\u116b,\u11bb": "0xc0", + ",\u116b,\u11bc": "0xc0", + ",\u116b,\u11bd": "0xc0", + ",\u116b,\u11be": "0xc0", + ",\u116b,\u11bf": "0xc0", + ",\u116b,\u11c0": "0xc0", + ",\u116b,\u11c1": "0xc0", + ",\u116b,\u11c2": "0xc0", + ",\u1170,\u11a8": "0xc0", + ",\u1170,\u11a9": "0xc0", + ",\u1170,\u11aa": "0xc0", + ",\u1170,\u11ab": "0xc0", + ",\u1170,\u11ac": "0xc0", + ",\u1170,\u11ad": "0xc0", + ",\u1170,\u11ae": "0xc0", + ",\u1170,\u11af": "0xc0", + ",\u1170,\u11b0": "0xc0", + ",\u1170,\u11b1": "0xc0", + ",\u1170,\u11b2": "0xc0", + ",\u1170,\u11b3": "0xc0", + ",\u1170,\u11b4": "0xc0", + ",\u1170,\u11b5": "0xc0", + ",\u1170,\u11b6": "0xc0", + ",\u1170,\u11b7": "0xc0", + ",\u1170,\u11b8": "0xc0", + ",\u1170,\u11b9": "0xc0", + ",\u1170,\u11ba": "0xc0", + ",\u1170,\u11bb": "0xc0", + ",\u1170,\u11bc": "0xc0", + ",\u1170,\u11bd": "0xc0", + ",\u1170,\u11be": "0xc0", + ",\u1170,\u11bf": "0xc0", + ",\u1170,\u11c0": "0xc0", + ",\u1170,\u11c1": "0xc0", + ",\u1170,\u11c2": "0xc0" + } + } + ], + "\u1175": [ + { + "defaultGlyph": "0x1c", + "alternatives": {} + }, + null, + null, + { + "defaultGlyph": "0x17", + "alternatives": { + "\u110c,,\u11ab": "0x1c", + "\u1112,,\u11ab": "0x1c", + "\u1102,,\u11ab": "0x1c", + "\u110b,,\u11ab": "0x1c", + "\u1105,,\u11ab": "0x1c", + "\u1109,,\u11ab": "0x1c", + "\u1107,,\u11ab": "0x1c", + "\u1110,,\u11ab": "0x1c", + "\u1106,,\u11ab": "0x1c", + "\u110e,,\u11ab": "0x1c", + "\u1111,,\u11ab": "0x1c", + "\u1103,,\u11ab": "0x1c", + "\u1100,,\u11ab": "0x1c", + "\u110f,,\u11ab": "0x1c", + "\u110a,,\u11ab": "0x1c", + "\u1101,,\u11ab": "0x1c", + "\u1104,,\u11ab": "0x1c", + "\u1108,,\u11ab": "0x1c", + "\u110d,,\u11ab": "0x1c" + } + }, + null, + null + ], + "\u1161": [ + { + "defaultGlyph": "0x1a", + "alternatives": {} + }, + null, + null, + { + "defaultGlyph": "0x15", + "alternatives": { + "\u1112,,\u11ab": "0x1a", + "\u110f,,\u11ab": "0x1a", + "\u1100,,\u11ab": "0x1a", + "\u1106,,\u11ab": "0x1a", + "\u1110,,\u11ab": "0x1a", + "\u1109,,\u11ab": "0x1a", + "\u1103,,\u11ab": "0x1a", + "\u110b,,\u11ab": "0x1a", + "\u1111,,\u11ab": "0x1a", + "\u1105,,\u11ab": "0x1a", + "\u1107,,\u11ab": "0x1a", + "\u1102,,\u11ab": "0x1a", + "\u110c,,\u11ab": "0x1a", + "\u1101,,\u11ab": "0x1a", + "\u110e,,\u11ab": "0x1a", + "\u110a,,\u11ab": "0x1a", + "\u110d,,\u11ab": "0x1a", + "\u1104,,\u11ab": "0x1a", + "\u1108,,\u11ab": "0x1a" + } + }, + null, + null + ], + "\u1162": [ + { + "defaultGlyph": "0x46", + "alternatives": {} + }, + null, + null, + { + "defaultGlyph": "0x42", + "alternatives": { + "\u110f,,\u11ab": "0x46", + "\u1105,,\u11ab": "0x46", + "\u1102,,\u11ab": "0x46", + "\u1106,,\u11ab": "0x46", + "\u1112,,\u11ab": "0x46", + "\u1109,,\u11ab": "0x46", + "\u1104,,\u11ab": "0x46", + "\u1111,,\u11ab": "0x46", + "\u1100,,\u11ab": "0x46", + "\u1101,,\u11ab": "0x46", + "\u1103,,\u11ab": "0x46", + "\u1107,,\u11ab": "0x46", + "\u1108,,\u11ab": "0x46", + "\u110a,,\u11ab": "0x46", + "\u110b,,\u11ab": "0x46", + "\u110c,,\u11ab": "0x46", + "\u110d,,\u11ab": "0x46", + "\u110e,,\u11ab": "0x46", + "\u1110,,\u11ab": "0x46" + } + }, + null, + null + ], + "\u1163": [ + { + "defaultGlyph": "0x1b", + "alternatives": {} + }, + null, + null, + { + "defaultGlyph": "0x16", + "alternatives": {} + }, + null, + null + ], + "\u1164": [ + { + "defaultGlyph": "0x47", + "alternatives": {} + }, + null, + null, + { + "defaultGlyph": "0x43", + "alternatives": { + "\u1100,,\u11ab": "0x47", + "\u1101,,\u11ab": "0x47", + "\u1102,,\u11ab": "0x47", + "\u1103,,\u11ab": "0x47", + "\u1104,,\u11ab": "0x47", + "\u1105,,\u11ab": "0x47", + "\u1106,,\u11ab": "0x47", + "\u1107,,\u11ab": "0x47", + "\u1108,,\u11ab": "0x47", + "\u1109,,\u11ab": "0x47", + "\u110a,,\u11ab": "0x47", + "\u110b,,\u11ab": "0x47", + "\u110c,,\u11ab": "0x47", + "\u110d,,\u11ab": "0x47", + "\u110e,,\u11ab": "0x47", + "\u110f,,\u11ab": "0x47", + "\u1110,,\u11ab": "0x47", + "\u1111,,\u11ab": "0x47", + "\u1112,,\u11ab": "0x47" + } + }, + null, + null + ], + "\u1165": [ + { + "defaultGlyph": "0x1d", + "alternatives": { + "\u1109,": "0x24", + "\u1102,": "0x24", + "\u110a,": "0x24", + "\u110e,": "0x31", + "\u1112,": "0x31" + } + }, + null, + null, + { + "defaultGlyph": "0x18", + "alternatives": { + "\u110b,,\u11ab": "0x1d", + "\u110c,,\u11ab": "0x1d", + "\u1100,,\u11ab": "0x1d", + "\u1105,,\u11ab": "0x1d", + "\u1107,,\u11ab": "0x1d", + "\u1103,,\u11ab": "0x1d", + "\u110f,,\u11ab": "0x1d", + "\u1106,,\u11ab": "0x1d", + "\u1108,,\u11ab": "0x1d", + "\u110d,,\u11ab": "0x1d", + "\u1104,,\u11ab": "0x1d", + "\u1109,,\u11ab": "0x24", + "\u1102,,\u11ab": "0x24", + "\u1102,,\u11c2": "0x22", + "\u1109,,\u11bc": "0x22", + "\u1102,,\u11af": "0x22", + "\u1109,,\u11a8": "0x22", + "\u1102,,\u11b7": "0x22", + "\u1109,,\u11af": "0x22", + "\u1109,,\u11ba": "0x22", + "\u110a,,\u11af": "0x22", + "\u110a,,\u11bc": "0x22", + "\u1109,,\u11b7": "0x22", + "\u1109,,\u11b8": "0x22", + "\u110e,,\u11ba": "0x2f", + "\u1112,,\u11b7": "0x2f", + "\u110e,,\u11bc": "0x2f", + "\u1112,,\u11a8": "0x2f", + "\u1112,,\u11af": "0x2f", + "\u1112,,\u11ba": "0x2f", + "\u110e,,\u11a8": "0x2f", + "\u110e,,\u11af": "0x2f", + "\u110e,,\u11b7": "0x2f", + "\u110e,,\u11ab": "0x2f", + "\u110e,,\u11a9": "0x2f", + "\u110e,,\u11aa": "0x2f", + "\u110e,,\u11ac": "0x2f", + "\u110e,,\u11ad": "0x2f", + "\u110e,,\u11ae": "0x2f", + "\u110e,,\u11b0": "0x2f", + "\u110e,,\u11b1": "0x2f", + "\u110e,,\u11b2": "0x2f", + "\u110e,,\u11b3": "0x2f", + "\u110e,,\u11b4": "0x2f", + "\u110e,,\u11b5": "0x2f", + "\u110e,,\u11b6": "0x2f", + "\u110e,,\u11b8": "0x2f", + "\u110e,,\u11b9": "0x2f", + "\u110e,,\u11bb": "0x2f", + "\u110e,,\u11bd": "0x2f", + "\u110e,,\u11be": "0x2f", + "\u110e,,\u11bf": "0x2f", + "\u110e,,\u11c0": "0x2f", + "\u110e,,\u11c1": "0x2f", + "\u110e,,\u11c2": "0x2f", + "\u1112,,\u11a9": "0x2f", + "\u1112,,\u11aa": "0x2f", + "\u1112,,\u11ab": "0x2f", + "\u1112,,\u11ac": "0x2f", + "\u1112,,\u11ad": "0x2f", + "\u1112,,\u11ae": "0x2f", + "\u1112,,\u11b0": "0x2f", + "\u1112,,\u11b1": "0x2f", + "\u1112,,\u11b2": "0x2f", + "\u1112,,\u11b3": "0x2f", + "\u1112,,\u11b4": "0x2f", + "\u1112,,\u11b5": "0x2f", + "\u1112,,\u11b6": "0x2f", + "\u1112,,\u11b8": "0x2f", + "\u1112,,\u11b9": "0x2f", + "\u1112,,\u11bb": "0x2f", + "\u1112,,\u11bc": "0x2f", + "\u1112,,\u11bd": "0x2f", + "\u1112,,\u11be": "0x2f", + "\u1112,,\u11bf": "0x2f", + "\u1112,,\u11c0": "0x2f", + "\u1112,,\u11c1": "0x2f", + "\u1112,,\u11c2": "0x2f", + "*[^\u110e;\u1110;\u1112],,\u11ab": "0x1d" + } + }, + null, + null + ], + "\u1166": [ + { + "defaultGlyph": "0x48", + "alternatives": { + "\u1109,": "0x4f", + "\u1102,": "0x4f", + "\u110a,": "0x4f", + "\u1112,": "0x5c", + "\u110e,": "0x5c" + } + }, + null, + null, + { + "defaultGlyph": "0x44", + "alternatives": { + "\u1110,,\u11ab": "0x48", + "\u1105,,\u11ab": "0x48", + "\u1107,,\u11ab": "0x48", + "\u110b,,\u1100": "0x48", + "\u110b,,\u11ab": "0x48", + "\u110c,,\u11ab": "0x48", + "\u1100,,\u11ab": "0x48", + "\u1109,,\u11ba": "0x4d", + "\u1109,,\u11b7": "0x4d", + "\u1109,,\u11a8": "0x4d", + "\u1112,,\u11af": "0x5a", + "\u1112,,\u11ba": "0x5a", + "\u110e,,\u11ba": "0x5a", + "\u1112,,\u11b7": "0x5a", + "\u110a,,\u11ab": "0x48", + "\u1109,,\u11ab": "0x48", + "\u1112,,\u11a8": "0x5a", + "\u1112,,\u11a9": "0x5a", + "\u1112,,\u11aa": "0x5a", + "\u1112,,\u11ab": "0x48", + "\u1112,,\u11ac": "0x5a", + "\u1112,,\u11ad": "0x5a", + "\u1112,,\u11ae": "0x5a", + "\u1112,,\u11b0": "0x5a", + "\u1112,,\u11b1": "0x5a", + "\u1112,,\u11b2": "0x5a", + "\u1112,,\u11b3": "0x5a", + "\u1112,,\u11b4": "0x5a", + "\u1112,,\u11b5": "0x5a", + "\u1112,,\u11b6": "0x5a", + "\u1112,,\u11b8": "0x5a", + "\u1112,,\u11b9": "0x5a", + "\u1112,,\u11bb": "0x5a", + "\u1112,,\u11bc": "0x5a", + "\u1112,,\u11bd": "0x5a", + "\u1112,,\u11be": "0x5a", + "\u1112,,\u11bf": "0x5a", + "\u1112,,\u11c0": "0x5a", + "\u1112,,\u11c1": "0x5a", + "\u1112,,\u11c2": "0x5a", + "\u1101,,\u11ab": "0x48", + "\u1102,,\u11ab": "0x48", + "\u1103,,\u11ab": "0x48", + "\u1104,,\u11ab": "0x48", + "\u1106,,\u11ab": "0x48", + "\u1108,,\u11ab": "0x48", + "\u110d,,\u11ab": "0x48", + "\u110e,,\u11ab": "0x48", + "\u110f,,\u11ab": "0x48", + "\u1111,,\u11ab": "0x48" + } + }, + null, + null + ], + "\u1167": [ + { + "defaultGlyph": "0x1e", + "alternatives": { + "\u1105,": "0x2c", + "\u1103,": "0x2c", + "\u1110,": "0x2c", + "\u1112,": "0x32", + "\u110e,": "0x32", + "\u1109,": "0x25", + "\u1102,": "0x25" + } + }, + null, + null, + { + "defaultGlyph": "0x19", + "alternatives": { + "\u1106,,\u11ab": "0x1e", + "\u110c,,\u11ab": "0x1e", + "\u1107,,\u11ab": "0x1e", + "\u110b,,\u11ab": "0x1e", + "\u110f,,\u11ab": "0x1e", + "\u1100,,\u11ab": "0x1e", + "\u1105,,\u11a8": "0x2b", + "\u1105,,\u11bc": "0x2b", + "\u1105,,\u11bb": "0x2b", + "\u1105,,\u11b8": "0x2b", + "\u1111,,\u11bc": "0x2b", + "\u1105,,\u11ba": "0x2b", + "\u1105,,\u11af": "0x2b", + "\u1109,,\u11ab": "0x1e", + "\u1102,,\u11ab": "0x1e", + "\u1112,,\u11bb": "0x30", + "\u1112,,\u11b8": "0x30", + "\u1112,,\u11b7": "0x30", + "\u1112,,\u11bc": "0x30", + "\u1112,,\u11a8": "0x30", + "\u1112,,\u11af": "0x30", + "\u110e,,\u11bb": "0x1e", + "\u1112,,\u11ab": "0x1e", + "\u1102,,\u11bc": "0x25", + "\u1109,,\u11bb": "0x23", + "\u1102,,\u11b7": "0x25", + "\u1102,,\u11bb": "0x25", + "\u1105,,\u11ab": "0x1e", + "\u1111,,\u11ab": "0x1e", + "\u1102,,\u11a8": "0x25", + "\u1102,,\u11a9": "0x25", + "\u1102,,\u11aa": "0x25", + "\u1102,,\u11ac": "0x25", + "\u1102,,\u11ad": "0x25", + "\u1102,,\u11ae": "0x25", + "\u1102,,\u11af": "0x25", + "\u1102,,\u11b0": "0x25", + "\u1102,,\u11b1": "0x25", + "\u1102,,\u11b2": "0x25", + "\u1102,,\u11b3": "0x25", + "\u1102,,\u11b4": "0x25", + "\u1102,,\u11b5": "0x25", + "\u1102,,\u11b6": "0x25", + "\u1102,,\u11b8": "0x25", + "\u1102,,\u11b9": "0x25", + "\u1102,,\u11ba": "0x25", + "\u1102,,\u11bd": "0x25", + "\u1102,,\u11be": "0x25", + "\u1102,,\u11bf": "0x25", + "\u1102,,\u11c0": "0x25", + "\u1102,,\u11c1": "0x25", + "\u1102,,\u11c2": "0x25", + "\u110e,,\u11a8": "0x1e", + "\u110e,,\u11a9": "0x1e", + "\u110e,,\u11aa": "0x1e", + "\u110e,,\u11ab": "0x1e", + "\u110e,,\u11ac": "0x1e", + "\u110e,,\u11ad": "0x1e", + "\u110e,,\u11ae": "0x1e", + "\u110e,,\u11af": "0x1e", + "\u110e,,\u11b0": "0x1e", + "\u110e,,\u11b1": "0x1e", + "\u110e,,\u11b2": "0x1e", + "\u110e,,\u11b3": "0x1e", + "\u110e,,\u11b4": "0x1e", + "\u110e,,\u11b5": "0x1e", + "\u110e,,\u11b6": "0x1e", + "\u110e,,\u11b7": "0x1e", + "\u110e,,\u11b8": "0x1e", + "\u110e,,\u11b9": "0x1e", + "\u110e,,\u11ba": "0x1e", + "\u110e,,\u11bc": "0x1e", + "\u110e,,\u11bd": "0x1e", + "\u110e,,\u11be": "0x1e", + "\u110e,,\u11bf": "0x1e", + "\u110e,,\u11c0": "0x1e", + "\u110e,,\u11c1": "0x1e", + "\u110e,,\u11c2": "0x1e", + "\u1112,,\u11a9": "0x30", + "\u1112,,\u11aa": "0x30", + "\u1112,,\u11ac": "0x30", + "\u1112,,\u11ad": "0x30", + "\u1112,,\u11ae": "0x30", + "\u1112,,\u11b0": "0x30", + "\u1112,,\u11b1": "0x30", + "\u1112,,\u11b2": "0x30", + "\u1112,,\u11b3": "0x30", + "\u1112,,\u11b4": "0x30", + "\u1112,,\u11b5": "0x30", + "\u1112,,\u11b6": "0x30", + "\u1112,,\u11b9": "0x30", + "\u1112,,\u11ba": "0x30", + "\u1112,,\u11bd": "0x30", + "\u1112,,\u11be": "0x30", + "\u1112,,\u11bf": "0x30", + "\u1112,,\u11c0": "0x30", + "\u1112,,\u11c1": "0x30", + "\u1112,,\u11c2": "0x30", + "\u1101,,\u11ab": "0x1e", + "\u1103,,\u11ab": "0x1e", + "\u1104,,\u11ab": "0x1e", + "\u1108,,\u11ab": "0x1e", + "\u110a,,\u11ab": "0x1e", + "\u110d,,\u11ab": "0x1e", + "\u1110,,\u11ab": "0x1e" + } + }, + null, + null + ], + "\u1168": [ + { + "defaultGlyph": "0x49", + "alternatives": { + "\u1112,": "0x5d", + "\u1105,": "0x50", + "\u1111,": "0x57", + "\u1102,": "0x50", + "\u1103,": "0x50", + "\u1104,": "0x5d", + "\u1106,": "0x50", + "\u1108,": "0x50" + } + }, + null, + null, + { + "defaultGlyph": "0x45", + "alternatives": { + "\u1100,,\u11ab": "0x49", + "\u1101,,\u11ab": "0x49", + "\u1102,,\u11ab": "0x49", + "\u1103,,\u11ab": "0x49", + "\u1104,,\u11ab": "0x49", + "\u1105,,\u11ab": "0x49", + "\u1106,,\u11ab": "0x49", + "\u1107,,\u11ab": "0x49", + "\u1108,,\u11ab": "0x49", + "\u1109,,\u11ab": "0x49", + "\u110a,,\u11ab": "0x49", + "\u110b,,\u11ab": "0x49", + "\u110c,,\u11ab": "0x49", + "\u110d,,\u11ab": "0x49", + "\u110e,,\u11ab": "0x49", + "\u110f,,\u11ab": "0x49", + "\u1110,,\u11ab": "0x49", + "\u1111,,\u11ab": "0x49", + "\u1112,,\u11ab": "0x49" + } + }, + null, + null + ], + "\u1169": [ + null, + { + "defaultGlyph": "0x82", + "alternatives": { + "\u1100,": "0x62", + "\u110f,": "0x62", + "\u1101,": "0x66", + "\u1102,": "0x62", + "\u1104,": "0x62", + "\u1105,": "0x62", + "\u110b,": "0x62", + "\u1110,": "0x62", + "\u1112,": "0x62" + } + }, + null, + null, + { + "defaultGlyph": "0x82", + "alternatives": { + "\u1100,,\u11bc": "0x82", + "\u1100,,\u11a8": "0x82", + "\u110f,,\u11b7": "0x82", + "\u1100,,\u11af": "0x82", + "\u1100,,\u11ba": "0x82", + "\u110f,,\u11bc": "0x82", + "\u1100,,\u11ab": "0x82", + "\u1100,,\u11ae": "0x82", + "\u1100,,\u11b7": "0x82", + "\u110f,,\u11af": "0x82", + "\u1101,,\u11bd": "0x82", + "\u1101,,\u11a8": "0x82", + "\u1101,,\u11af": "0x82", + "\u1101,,\u11b7": "0x82", + "\u1101,,\u11bc": "0x82", + "\u110f,,\u11ab": "0x82", + "\u1103,,\u11ab": "0x82", + "\u1105,,\u11ab": "0x82", + "\u1110,,\u11ab": "0x82", + "\u1109,,\u11ab": "0x82", + "\u110b,,\u11ab": "0x82", + "\u1112,,\u11ab": "0x82", + "\u1107,,\u11ab": "0x82", + "\u1111,,\u11ab": "0x82", + "\u110e,,\u11ab": "0x82", + "\u110c,,\u11ab": "0x82", + "\u1102,,\u11ab": "0x82", + "\u1100,,\u11a9": "0x82", + "\u1100,,\u11aa": "0x82", + "\u1100,,\u11ac": "0x82", + "\u1100,,\u11ad": "0x82", + "\u1100,,\u11b0": "0x82", + "\u1100,,\u11b1": "0x82", + "\u1100,,\u11b2": "0x82", + "\u1100,,\u11b3": "0x82", + "\u1100,,\u11b4": "0x82", + "\u1100,,\u11b5": "0x82", + "\u1100,,\u11b6": "0x82", + "\u1100,,\u11b8": "0x82", + "\u1100,,\u11b9": "0x82", + "\u1100,,\u11bb": "0x82", + "\u1100,,\u11bd": "0x82", + "\u1100,,\u11be": "0x82", + "\u1100,,\u11bf": "0x82", + "\u1100,,\u11c0": "0x82", + "\u1100,,\u11c1": "0x82", + "\u1100,,\u11c2": "0x82", + "\u1101,,\u11a9": "0x82", + "\u1101,,\u11aa": "0x82", + "\u1101,,\u11ab": "0x82", + "\u1101,,\u11ac": "0x82", + "\u1101,,\u11ad": "0x82", + "\u1101,,\u11ae": "0x82", + "\u1101,,\u11b0": "0x82", + "\u1101,,\u11b1": "0x82", + "\u1101,,\u11b2": "0x82", + "\u1101,,\u11b3": "0x82", + "\u1101,,\u11b4": "0x82", + "\u1101,,\u11b5": "0x82", + "\u1101,,\u11b6": "0x82", + "\u1101,,\u11b8": "0x82", + "\u1101,,\u11b9": "0x82", + "\u1101,,\u11ba": "0x82", + "\u1101,,\u11bb": "0x82", + "\u1101,,\u11be": "0x82", + "\u1101,,\u11bf": "0x82", + "\u1101,,\u11c0": "0x82", + "\u1101,,\u11c1": "0x82", + "\u1101,,\u11c2": "0x82", + "\u1102,,\u11a8": "0x82", + "\u1102,,\u11a9": "0x82", + "\u1102,,\u11aa": "0x82", + "\u1102,,\u11ac": "0x82", + "\u1102,,\u11ad": "0x82", + "\u1102,,\u11ae": "0x82", + "\u1102,,\u11af": "0x82", + "\u1102,,\u11b0": "0x82", + "\u1102,,\u11b1": "0x82", + "\u1102,,\u11b2": "0x82", + "\u1102,,\u11b3": "0x82", + "\u1102,,\u11b4": "0x82", + "\u1102,,\u11b5": "0x82", + "\u1102,,\u11b6": "0x82", + "\u1102,,\u11b7": "0x82", + "\u1102,,\u11b8": "0x82", + "\u1102,,\u11b9": "0x82", + "\u1102,,\u11ba": "0x82", + "\u1102,,\u11bb": "0x82", + "\u1102,,\u11bc": "0x82", + "\u1102,,\u11bd": "0x82", + "\u1102,,\u11be": "0x82", + "\u1102,,\u11bf": "0x82", + "\u1102,,\u11c0": "0x82", + "\u1102,,\u11c1": "0x82", + "\u1102,,\u11c2": "0x82", + "\u1103,,\u11a8": "0x82", + "\u1103,,\u11a9": "0x82", + "\u1103,,\u11aa": "0x82", + "\u1103,,\u11ac": "0x82", + "\u1103,,\u11ad": "0x82", + "\u1103,,\u11ae": "0x82", + "\u1103,,\u11af": "0x82", + "\u1103,,\u11b0": "0x82", + "\u1103,,\u11b1": "0x82", + "\u1103,,\u11b2": "0x82", + "\u1103,,\u11b3": "0x82", + "\u1103,,\u11b4": "0x82", + "\u1103,,\u11b5": "0x82", + "\u1103,,\u11b6": "0x82", + "\u1103,,\u11b7": "0x82", + "\u1103,,\u11b8": "0x82", + "\u1103,,\u11b9": "0x82", + "\u1103,,\u11ba": "0x82", + "\u1103,,\u11bb": "0x82", + "\u1103,,\u11bc": "0x82", + "\u1103,,\u11bd": "0x82", + "\u1103,,\u11be": "0x82", + "\u1103,,\u11bf": "0x82", + "\u1103,,\u11c0": "0x82", + "\u1103,,\u11c1": "0x82", + "\u1103,,\u11c2": "0x82", + "\u1104,,\u11a8": "0x82", + "\u1104,,\u11a9": "0x82", + "\u1104,,\u11aa": "0x82", + "\u1104,,\u11ab": "0x82", + "\u1104,,\u11ac": "0x82", + "\u1104,,\u11ad": "0x82", + "\u1104,,\u11ae": "0x82", + "\u1104,,\u11af": "0x82", + "\u1104,,\u11b0": "0x82", + "\u1104,,\u11b1": "0x82", + "\u1104,,\u11b2": "0x82", + "\u1104,,\u11b3": "0x82", + "\u1104,,\u11b4": "0x82", + "\u1104,,\u11b5": "0x82", + "\u1104,,\u11b6": "0x82", + "\u1104,,\u11b7": "0x82", + "\u1104,,\u11b8": "0x82", + "\u1104,,\u11b9": "0x82", + "\u1104,,\u11ba": "0x82", + "\u1104,,\u11bb": "0x82", + "\u1104,,\u11bc": "0x82", + "\u1104,,\u11bd": "0x82", + "\u1104,,\u11be": "0x82", + "\u1104,,\u11bf": "0x82", + "\u1104,,\u11c0": "0x82", + "\u1104,,\u11c1": "0x82", + "\u1104,,\u11c2": "0x82", + "\u1105,,\u11a8": "0x82", + "\u1105,,\u11a9": "0x82", + "\u1105,,\u11aa": "0x82", + "\u1105,,\u11ac": "0x82", + "\u1105,,\u11ad": "0x82", + "\u1105,,\u11ae": "0x82", + "\u1105,,\u11af": "0x82", + "\u1105,,\u11b0": "0x82", + "\u1105,,\u11b1": "0x82", + "\u1105,,\u11b2": "0x82", + "\u1105,,\u11b3": "0x82", + "\u1105,,\u11b4": "0x82", + "\u1105,,\u11b5": "0x82", + "\u1105,,\u11b6": "0x82", + "\u1105,,\u11b7": "0x82", + "\u1105,,\u11b8": "0x82", + "\u1105,,\u11b9": "0x82", + "\u1105,,\u11ba": "0x82", + "\u1105,,\u11bb": "0x82", + "\u1105,,\u11bc": "0x82", + "\u1105,,\u11bd": "0x82", + "\u1105,,\u11be": "0x82", + "\u1105,,\u11bf": "0x82", + "\u1105,,\u11c0": "0x82", + "\u1105,,\u11c1": "0x82", + "\u1105,,\u11c2": "0x82", + "\u1106,,\u11a8": "0x82", + "\u1106,,\u11a9": "0x82", + "\u1106,,\u11aa": "0x82", + "\u1106,,\u11ab": "0x82", + "\u1106,,\u11ac": "0x82", + "\u1106,,\u11ad": "0x82", + "\u1106,,\u11ae": "0x82", + "\u1106,,\u11af": "0x82", + "\u1106,,\u11b0": "0x82", + "\u1106,,\u11b1": "0x82", + "\u1106,,\u11b2": "0x82", + "\u1106,,\u11b3": "0x82", + "\u1106,,\u11b4": "0x82", + "\u1106,,\u11b5": "0x82", + "\u1106,,\u11b6": "0x82", + "\u1106,,\u11b7": "0x82", + "\u1106,,\u11b8": "0x82", + "\u1106,,\u11b9": "0x82", + "\u1106,,\u11ba": "0x82", + "\u1106,,\u11bb": "0x82", + "\u1106,,\u11bc": "0x82", + "\u1106,,\u11bd": "0x82", + "\u1106,,\u11be": "0x82", + "\u1106,,\u11bf": "0x82", + "\u1106,,\u11c0": "0x82", + "\u1106,,\u11c1": "0x82", + "\u1106,,\u11c2": "0x82", + "\u1107,,\u11a8": "0x82", + "\u1107,,\u11a9": "0x82", + "\u1107,,\u11aa": "0x82", + "\u1107,,\u11ac": "0x82", + "\u1107,,\u11ad": "0x82", + "\u1107,,\u11ae": "0x82", + "\u1107,,\u11af": "0x82", + "\u1107,,\u11b0": "0x82", + "\u1107,,\u11b1": "0x82", + "\u1107,,\u11b2": "0x82", + "\u1107,,\u11b3": "0x82", + "\u1107,,\u11b4": "0x82", + "\u1107,,\u11b5": "0x82", + "\u1107,,\u11b6": "0x82", + "\u1107,,\u11b7": "0x82", + "\u1107,,\u11b8": "0x82", + "\u1107,,\u11b9": "0x82", + "\u1107,,\u11ba": "0x82", + "\u1107,,\u11bb": "0x82", + "\u1107,,\u11bc": "0x82", + "\u1107,,\u11bd": "0x82", + "\u1107,,\u11be": "0x82", + "\u1107,,\u11bf": "0x82", + "\u1107,,\u11c0": "0x82", + "\u1107,,\u11c1": "0x82", + "\u1107,,\u11c2": "0x82", + "\u1108,,\u11a8": "0x82", + "\u1108,,\u11a9": "0x82", + "\u1108,,\u11aa": "0x82", + "\u1108,,\u11ab": "0x82", + "\u1108,,\u11ac": "0x82", + "\u1108,,\u11ad": "0x82", + "\u1108,,\u11ae": "0x82", + "\u1108,,\u11af": "0x82", + "\u1108,,\u11b0": "0x82", + "\u1108,,\u11b1": "0x82", + "\u1108,,\u11b2": "0x82", + "\u1108,,\u11b3": "0x82", + "\u1108,,\u11b4": "0x82", + "\u1108,,\u11b5": "0x82", + "\u1108,,\u11b6": "0x82", + "\u1108,,\u11b7": "0x82", + "\u1108,,\u11b8": "0x82", + "\u1108,,\u11b9": "0x82", + "\u1108,,\u11ba": "0x82", + "\u1108,,\u11bb": "0x82", + "\u1108,,\u11bc": "0x82", + "\u1108,,\u11bd": "0x82", + "\u1108,,\u11be": "0x82", + "\u1108,,\u11bf": "0x82", + "\u1108,,\u11c0": "0x82", + "\u1108,,\u11c1": "0x82", + "\u1108,,\u11c2": "0x82", + "\u1109,,\u11a8": "0x82", + "\u1109,,\u11a9": "0x82", + "\u1109,,\u11aa": "0x82", + "\u1109,,\u11ac": "0x82", + "\u1109,,\u11ad": "0x82", + "\u1109,,\u11ae": "0x82", + "\u1109,,\u11af": "0x82", + "\u1109,,\u11b0": "0x82", + "\u1109,,\u11b1": "0x82", + "\u1109,,\u11b2": "0x82", + "\u1109,,\u11b3": "0x82", + "\u1109,,\u11b4": "0x82", + "\u1109,,\u11b5": "0x82", + "\u1109,,\u11b6": "0x82", + "\u1109,,\u11b7": "0x82", + "\u1109,,\u11b8": "0x82", + "\u1109,,\u11b9": "0x82", + "\u1109,,\u11ba": "0x82", + "\u1109,,\u11bb": "0x82", + "\u1109,,\u11bc": "0x82", + "\u1109,,\u11bd": "0x82", + "\u1109,,\u11be": "0x82", + "\u1109,,\u11bf": "0x82", + "\u1109,,\u11c0": "0x82", + "\u1109,,\u11c1": "0x82", + "\u1109,,\u11c2": "0x82", + "\u110a,,\u11a8": "0x82", + "\u110a,,\u11a9": "0x82", + "\u110a,,\u11aa": "0x82", + "\u110a,,\u11ab": "0x82", + "\u110a,,\u11ac": "0x82", + "\u110a,,\u11ad": "0x82", + "\u110a,,\u11ae": "0x82", + "\u110a,,\u11af": "0x82", + "\u110a,,\u11b0": "0x82", + "\u110a,,\u11b1": "0x82", + "\u110a,,\u11b2": "0x82", + "\u110a,,\u11b3": "0x82", + "\u110a,,\u11b4": "0x82", + "\u110a,,\u11b5": "0x82", + "\u110a,,\u11b6": "0x82", + "\u110a,,\u11b7": "0x82", + "\u110a,,\u11b8": "0x82", + "\u110a,,\u11b9": "0x82", + "\u110a,,\u11ba": "0x82", + "\u110a,,\u11bb": "0x82", + "\u110a,,\u11bc": "0x82", + "\u110a,,\u11bd": "0x82", + "\u110a,,\u11be": "0x82", + "\u110a,,\u11bf": "0x82", + "\u110a,,\u11c0": "0x82", + "\u110a,,\u11c1": "0x82", + "\u110a,,\u11c2": "0x82", + "\u110b,,\u11a8": "0x82", + "\u110b,,\u11a9": "0x82", + "\u110b,,\u11aa": "0x82", + "\u110b,,\u11ac": "0x82", + "\u110b,,\u11ad": "0x82", + "\u110b,,\u11ae": "0x82", + "\u110b,,\u11af": "0x82", + "\u110b,,\u11b0": "0x82", + "\u110b,,\u11b1": "0x82", + "\u110b,,\u11b2": "0x82", + "\u110b,,\u11b3": "0x82", + "\u110b,,\u11b4": "0x82", + "\u110b,,\u11b5": "0x82", + "\u110b,,\u11b6": "0x82", + "\u110b,,\u11b7": "0x82", + "\u110b,,\u11b8": "0x82", + "\u110b,,\u11b9": "0x82", + "\u110b,,\u11ba": "0x82", + "\u110b,,\u11bb": "0x82", + "\u110b,,\u11bc": "0x82", + "\u110b,,\u11bd": "0x82", + "\u110b,,\u11be": "0x82", + "\u110b,,\u11bf": "0x82", + "\u110b,,\u11c0": "0x82", + "\u110b,,\u11c1": "0x82", + "\u110b,,\u11c2": "0x82", + "\u110c,,\u11a8": "0x82", + "\u110c,,\u11a9": "0x82", + "\u110c,,\u11aa": "0x82", + "\u110c,,\u11ac": "0x82", + "\u110c,,\u11ad": "0x82", + "\u110c,,\u11ae": "0x82", + "\u110c,,\u11af": "0x82", + "\u110c,,\u11b0": "0x82", + "\u110c,,\u11b1": "0x82", + "\u110c,,\u11b2": "0x82", + "\u110c,,\u11b3": "0x82", + "\u110c,,\u11b4": "0x82", + "\u110c,,\u11b5": "0x82", + "\u110c,,\u11b6": "0x82", + "\u110c,,\u11b7": "0x82", + "\u110c,,\u11b8": "0x82", + "\u110c,,\u11b9": "0x82", + "\u110c,,\u11ba": "0x82", + "\u110c,,\u11bb": "0x82", + "\u110c,,\u11bc": "0x82", + "\u110c,,\u11bd": "0x82", + "\u110c,,\u11be": "0x82", + "\u110c,,\u11bf": "0x82", + "\u110c,,\u11c0": "0x82", + "\u110c,,\u11c1": "0x82", + "\u110c,,\u11c2": "0x82", + "\u110d,,\u11a8": "0x82", + "\u110d,,\u11a9": "0x82", + "\u110d,,\u11aa": "0x82", + "\u110d,,\u11ab": "0x82", + "\u110d,,\u11ac": "0x82", + "\u110d,,\u11ad": "0x82", + "\u110d,,\u11ae": "0x82", + "\u110d,,\u11af": "0x82", + "\u110d,,\u11b0": "0x82", + "\u110d,,\u11b1": "0x82", + "\u110d,,\u11b2": "0x82", + "\u110d,,\u11b3": "0x82", + "\u110d,,\u11b4": "0x82", + "\u110d,,\u11b5": "0x82", + "\u110d,,\u11b6": "0x82", + "\u110d,,\u11b7": "0x82", + "\u110d,,\u11b8": "0x82", + "\u110d,,\u11b9": "0x82", + "\u110d,,\u11ba": "0x82", + "\u110d,,\u11bb": "0x82", + "\u110d,,\u11bc": "0x82", + "\u110d,,\u11bd": "0x82", + "\u110d,,\u11be": "0x82", + "\u110d,,\u11bf": "0x82", + "\u110d,,\u11c0": "0x82", + "\u110d,,\u11c1": "0x82", + "\u110d,,\u11c2": "0x82", + "\u110e,,\u11a8": "0x82", + "\u110e,,\u11a9": "0x82", + "\u110e,,\u11aa": "0x82", + "\u110e,,\u11ac": "0x82", + "\u110e,,\u11ad": "0x82", + "\u110e,,\u11ae": "0x82", + "\u110e,,\u11af": "0x82", + "\u110e,,\u11b0": "0x82", + "\u110e,,\u11b1": "0x82", + "\u110e,,\u11b2": "0x82", + "\u110e,,\u11b3": "0x82", + "\u110e,,\u11b4": "0x82", + "\u110e,,\u11b5": "0x82", + "\u110e,,\u11b6": "0x82", + "\u110e,,\u11b7": "0x82", + "\u110e,,\u11b8": "0x82", + "\u110e,,\u11b9": "0x82", + "\u110e,,\u11ba": "0x82", + "\u110e,,\u11bb": "0x82", + "\u110e,,\u11bc": "0x82", + "\u110e,,\u11bd": "0x82", + "\u110e,,\u11be": "0x82", + "\u110e,,\u11bf": "0x82", + "\u110e,,\u11c0": "0x82", + "\u110e,,\u11c1": "0x82", + "\u110e,,\u11c2": "0x82", + "\u110f,,\u11a8": "0x82", + "\u110f,,\u11a9": "0x82", + "\u110f,,\u11aa": "0x82", + "\u110f,,\u11ac": "0x82", + "\u110f,,\u11ad": "0x82", + "\u110f,,\u11ae": "0x82", + "\u110f,,\u11b0": "0x82", + "\u110f,,\u11b1": "0x82", + "\u110f,,\u11b2": "0x82", + "\u110f,,\u11b3": "0x82", + "\u110f,,\u11b4": "0x82", + "\u110f,,\u11b5": "0x82", + "\u110f,,\u11b6": "0x82", + "\u110f,,\u11b8": "0x82", + "\u110f,,\u11b9": "0x82", + "\u110f,,\u11ba": "0x82", + "\u110f,,\u11bb": "0x82", + "\u110f,,\u11bd": "0x82", + "\u110f,,\u11be": "0x82", + "\u110f,,\u11bf": "0x82", + "\u110f,,\u11c0": "0x82", + "\u110f,,\u11c1": "0x82", + "\u110f,,\u11c2": "0x82", + "\u1110,,\u11a8": "0x82", + "\u1110,,\u11a9": "0x82", + "\u1110,,\u11aa": "0x82", + "\u1110,,\u11ac": "0x82", + "\u1110,,\u11ad": "0x82", + "\u1110,,\u11ae": "0x82", + "\u1110,,\u11af": "0x82", + "\u1110,,\u11b0": "0x82", + "\u1110,,\u11b1": "0x82", + "\u1110,,\u11b2": "0x82", + "\u1110,,\u11b3": "0x82", + "\u1110,,\u11b4": "0x82", + "\u1110,,\u11b5": "0x82", + "\u1110,,\u11b6": "0x82", + "\u1110,,\u11b7": "0x82", + "\u1110,,\u11b8": "0x82", + "\u1110,,\u11b9": "0x82", + "\u1110,,\u11ba": "0x82", + "\u1110,,\u11bb": "0x82", + "\u1110,,\u11bc": "0x82", + "\u1110,,\u11bd": "0x82", + "\u1110,,\u11be": "0x82", + "\u1110,,\u11bf": "0x82", + "\u1110,,\u11c0": "0x82", + "\u1110,,\u11c1": "0x82", + "\u1110,,\u11c2": "0x82", + "\u1111,,\u11a8": "0x82", + "\u1111,,\u11a9": "0x82", + "\u1111,,\u11aa": "0x82", + "\u1111,,\u11ac": "0x82", + "\u1111,,\u11ad": "0x82", + "\u1111,,\u11ae": "0x82", + "\u1111,,\u11af": "0x82", + "\u1111,,\u11b0": "0x82", + "\u1111,,\u11b1": "0x82", + "\u1111,,\u11b2": "0x82", + "\u1111,,\u11b3": "0x82", + "\u1111,,\u11b4": "0x82", + "\u1111,,\u11b5": "0x82", + "\u1111,,\u11b6": "0x82", + "\u1111,,\u11b7": "0x82", + "\u1111,,\u11b8": "0x82", + "\u1111,,\u11b9": "0x82", + "\u1111,,\u11ba": "0x82", + "\u1111,,\u11bb": "0x82", + "\u1111,,\u11bc": "0x82", + "\u1111,,\u11bd": "0x82", + "\u1111,,\u11be": "0x82", + "\u1111,,\u11bf": "0x82", + "\u1111,,\u11c0": "0x82", + "\u1111,,\u11c1": "0x82", + "\u1111,,\u11c2": "0x82", + "\u1112,,\u11a8": "0x82", + "\u1112,,\u11a9": "0x82", + "\u1112,,\u11aa": "0x82", + "\u1112,,\u11ac": "0x82", + "\u1112,,\u11ad": "0x82", + "\u1112,,\u11ae": "0x82", + "\u1112,,\u11af": "0x82", + "\u1112,,\u11b0": "0x82", + "\u1112,,\u11b1": "0x82", + "\u1112,,\u11b2": "0x82", + "\u1112,,\u11b3": "0x82", + "\u1112,,\u11b4": "0x82", + "\u1112,,\u11b5": "0x82", + "\u1112,,\u11b6": "0x82", + "\u1112,,\u11b7": "0x82", + "\u1112,,\u11b8": "0x82", + "\u1112,,\u11b9": "0x82", + "\u1112,,\u11ba": "0x82", + "\u1112,,\u11bb": "0x82", + "\u1112,,\u11bc": "0x82", + "\u1112,,\u11bd": "0x82", + "\u1112,,\u11be": "0x82", + "\u1112,,\u11bf": "0x82", + "\u1112,,\u11c0": "0x82", + "\u1112,,\u11c1": "0x82", + "\u1112,,\u11c2": "0x82" + } + }, + null + ], + "\u116d": [ + null, + { + "defaultGlyph": "0x83", + "alternatives": { + "\u1100,": "0x61", + "\u1101,": "0x67", + "\u1102,": "0x63", + "\u1103,": "0x63", + "\u1104,": "0x63", + "\u1105,": "0x63", + "\u1108,": "0x63", + "\u110a,": "0x63", + "\u110b,": "0x63", + "\u110f,": "0x63", + "\u1110,": "0x63", + "\u1112,": "0x63" + } + }, + null, + null, + { + "defaultGlyph": "0x83", + "alternatives": {} + }, + null + ], + "\u116e": [ + null, + { + "defaultGlyph": "0x87", + "alternatives": { + "\u1102,": "0x6e", + "\u1100,": "0x6e", + "\u1101,": "0x6e", + "\u110f,": "0x6e", + "\u1112,": "0x6e" + } + }, + null, + null, + { + "defaultGlyph": "0x85", + "alternatives": { + "\u110b,,\u11ab": "0x89", + "\u1106,,\u11ab": "0x89", + "\u1100,,\u11ab": "0x89", + "\u110c,,\u11ab": "0x89", + "\u1107,,\u11ab": "0x89", + "\u1109,,\u11ab": "0x89", + "\u1101,,\u11ab": "0x89", + "\u1102,,\u11ab": "0x89", + "\u1103,,\u11ab": "0x89", + "\u1108,,\u11ab": "0x89", + "\u1100,,\u11a8": "0x85", + "\u1100,,\u11bc": "0x85", + "\u1100,,\u11af": "0x85", + "\u1102,,\u11af": "0x85", + "\u1101,,\u11b7": "0x85", + "\u1101,,\u11af": "0x85", + "\u110f,,\u11af": "0x85", + "\u1100,,\u11a9": "0x85", + "\u1100,,\u11aa": "0x85", + "\u1100,,\u11ac": "0x85", + "\u1100,,\u11ad": "0x85", + "\u1100,,\u11ae": "0x85", + "\u1100,,\u11b0": "0x85", + "\u1100,,\u11b1": "0x85", + "\u1100,,\u11b2": "0x85", + "\u1100,,\u11b3": "0x85", + "\u1100,,\u11b4": "0x85", + "\u1100,,\u11b5": "0x85", + "\u1100,,\u11b6": "0x85", + "\u1100,,\u11b7": "0x85", + "\u1100,,\u11b8": "0x85", + "\u1100,,\u11b9": "0x85", + "\u1100,,\u11ba": "0x85", + "\u1100,,\u11bb": "0x85", + "\u1100,,\u11bd": "0x85", + "\u1100,,\u11be": "0x85", + "\u1100,,\u11bf": "0x85", + "\u1100,,\u11c0": "0x85", + "\u1100,,\u11c1": "0x85", + "\u1100,,\u11c2": "0x85", + "\u1101,,\u11a8": "0x85", + "\u1101,,\u11a9": "0x85", + "\u1101,,\u11aa": "0x85", + "\u1101,,\u11ac": "0x85", + "\u1101,,\u11ad": "0x85", + "\u1101,,\u11ae": "0x85", + "\u1101,,\u11b0": "0x85", + "\u1101,,\u11b1": "0x85", + "\u1101,,\u11b2": "0x85", + "\u1101,,\u11b3": "0x85", + "\u1101,,\u11b4": "0x85", + "\u1101,,\u11b5": "0x85", + "\u1101,,\u11b6": "0x85", + "\u1101,,\u11b8": "0x85", + "\u1101,,\u11b9": "0x85", + "\u1101,,\u11ba": "0x85", + "\u1101,,\u11bb": "0x85", + "\u1101,,\u11bc": "0x85", + "\u1101,,\u11bd": "0x85", + "\u1101,,\u11be": "0x85", + "\u1101,,\u11bf": "0x85", + "\u1101,,\u11c0": "0x85", + "\u1101,,\u11c1": "0x85", + "\u1101,,\u11c2": "0x85", + "\u1102,,\u11a8": "0x85", + "\u1102,,\u11a9": "0x85", + "\u1102,,\u11aa": "0x85", + "\u1102,,\u11ac": "0x85", + "\u1102,,\u11ad": "0x85", + "\u1102,,\u11ae": "0x85", + "\u1102,,\u11b0": "0x85", + "\u1102,,\u11b1": "0x85", + "\u1102,,\u11b2": "0x85", + "\u1102,,\u11b3": "0x85", + "\u1102,,\u11b4": "0x85", + "\u1102,,\u11b5": "0x85", + "\u1102,,\u11b6": "0x85", + "\u1102,,\u11b7": "0x85", + "\u1102,,\u11b8": "0x85", + "\u1102,,\u11b9": "0x85", + "\u1102,,\u11ba": "0x85", + "\u1102,,\u11bb": "0x85", + "\u1102,,\u11bc": "0x85", + "\u1102,,\u11bd": "0x85", + "\u1102,,\u11be": "0x85", + "\u1102,,\u11bf": "0x85", + "\u1102,,\u11c0": "0x85", + "\u1102,,\u11c1": "0x85", + "\u1102,,\u11c2": "0x85", + "\u1103,,\u11a8": "0x85", + "\u1103,,\u11a9": "0x85", + "\u1103,,\u11aa": "0x85", + "\u1103,,\u11ac": "0x85", + "\u1103,,\u11ad": "0x85", + "\u1103,,\u11ae": "0x85", + "\u1103,,\u11af": "0x85", + "\u1103,,\u11b0": "0x85", + "\u1103,,\u11b1": "0x85", + "\u1103,,\u11b2": "0x85", + "\u1103,,\u11b3": "0x85", + "\u1103,,\u11b4": "0x85", + "\u1103,,\u11b5": "0x85", + "\u1103,,\u11b6": "0x85", + "\u1103,,\u11b7": "0x85", + "\u1103,,\u11b8": "0x85", + "\u1103,,\u11b9": "0x85", + "\u1103,,\u11ba": "0x85", + "\u1103,,\u11bb": "0x85", + "\u1103,,\u11bc": "0x85", + "\u1103,,\u11bd": "0x85", + "\u1103,,\u11be": "0x85", + "\u1103,,\u11bf": "0x85", + "\u1103,,\u11c0": "0x85", + "\u1103,,\u11c1": "0x85", + "\u1103,,\u11c2": "0x85", + "\u1104,,\u11a8": "0x85", + "\u1104,,\u11a9": "0x85", + "\u1104,,\u11aa": "0x85", + "\u1104,,\u11ab": "0x89", + "\u1104,,\u11ac": "0x85", + "\u1104,,\u11ad": "0x85", + "\u1104,,\u11ae": "0x85", + "\u1104,,\u11af": "0x85", + "\u1104,,\u11b0": "0x85", + "\u1104,,\u11b1": "0x85", + "\u1104,,\u11b2": "0x85", + "\u1104,,\u11b3": "0x85", + "\u1104,,\u11b4": "0x85", + "\u1104,,\u11b5": "0x85", + "\u1104,,\u11b6": "0x85", + "\u1104,,\u11b7": "0x85", + "\u1104,,\u11b8": "0x85", + "\u1104,,\u11b9": "0x85", + "\u1104,,\u11ba": "0x85", + "\u1104,,\u11bb": "0x85", + "\u1104,,\u11bc": "0x85", + "\u1104,,\u11bd": "0x85", + "\u1104,,\u11be": "0x85", + "\u1104,,\u11bf": "0x85", + "\u1104,,\u11c0": "0x85", + "\u1104,,\u11c1": "0x85", + "\u1104,,\u11c2": "0x85", + "\u1105,,\u11a8": "0x85", + "\u1105,,\u11a9": "0x85", + "\u1105,,\u11aa": "0x85", + "\u1105,,\u11ab": "0x89", + "\u1105,,\u11ac": "0x85", + "\u1105,,\u11ad": "0x85", + "\u1105,,\u11ae": "0x85", + "\u1105,,\u11af": "0x85", + "\u1105,,\u11b0": "0x85", + "\u1105,,\u11b1": "0x85", + "\u1105,,\u11b2": "0x85", + "\u1105,,\u11b3": "0x85", + "\u1105,,\u11b4": "0x85", + "\u1105,,\u11b5": "0x85", + "\u1105,,\u11b6": "0x85", + "\u1105,,\u11b7": "0x85", + "\u1105,,\u11b8": "0x85", + "\u1105,,\u11b9": "0x85", + "\u1105,,\u11ba": "0x85", + "\u1105,,\u11bb": "0x85", + "\u1105,,\u11bc": "0x85", + "\u1105,,\u11bd": "0x85", + "\u1105,,\u11be": "0x85", + "\u1105,,\u11bf": "0x85", + "\u1105,,\u11c0": "0x85", + "\u1105,,\u11c1": "0x85", + "\u1105,,\u11c2": "0x85", + "\u1106,,\u11a8": "0x85", + "\u1106,,\u11a9": "0x85", + "\u1106,,\u11aa": "0x85", + "\u1106,,\u11ac": "0x85", + "\u1106,,\u11ad": "0x85", + "\u1106,,\u11ae": "0x85", + "\u1106,,\u11af": "0x85", + "\u1106,,\u11b0": "0x85", + "\u1106,,\u11b1": "0x85", + "\u1106,,\u11b2": "0x85", + "\u1106,,\u11b3": "0x85", + "\u1106,,\u11b4": "0x85", + "\u1106,,\u11b5": "0x85", + "\u1106,,\u11b6": "0x85", + "\u1106,,\u11b7": "0x85", + "\u1106,,\u11b8": "0x85", + "\u1106,,\u11b9": "0x85", + "\u1106,,\u11ba": "0x85", + "\u1106,,\u11bb": "0x85", + "\u1106,,\u11bc": "0x85", + "\u1106,,\u11bd": "0x85", + "\u1106,,\u11be": "0x85", + "\u1106,,\u11bf": "0x85", + "\u1106,,\u11c0": "0x85", + "\u1106,,\u11c1": "0x85", + "\u1106,,\u11c2": "0x85", + "\u1107,,\u11a8": "0x85", + "\u1107,,\u11a9": "0x85", + "\u1107,,\u11aa": "0x85", + "\u1107,,\u11ac": "0x85", + "\u1107,,\u11ad": "0x85", + "\u1107,,\u11ae": "0x85", + "\u1107,,\u11af": "0x85", + "\u1107,,\u11b0": "0x85", + "\u1107,,\u11b1": "0x85", + "\u1107,,\u11b2": "0x85", + "\u1107,,\u11b3": "0x85", + "\u1107,,\u11b4": "0x85", + "\u1107,,\u11b5": "0x85", + "\u1107,,\u11b6": "0x85", + "\u1107,,\u11b7": "0x85", + "\u1107,,\u11b8": "0x85", + "\u1107,,\u11b9": "0x85", + "\u1107,,\u11ba": "0x85", + "\u1107,,\u11bb": "0x85", + "\u1107,,\u11bc": "0x85", + "\u1107,,\u11bd": "0x85", + "\u1107,,\u11be": "0x85", + "\u1107,,\u11bf": "0x85", + "\u1107,,\u11c0": "0x85", + "\u1107,,\u11c1": "0x85", + "\u1107,,\u11c2": "0x85", + "\u1108,,\u11a8": "0x85", + "\u1108,,\u11a9": "0x85", + "\u1108,,\u11aa": "0x85", + "\u1108,,\u11ac": "0x85", + "\u1108,,\u11ad": "0x85", + "\u1108,,\u11ae": "0x85", + "\u1108,,\u11af": "0x85", + "\u1108,,\u11b0": "0x85", + "\u1108,,\u11b1": "0x85", + "\u1108,,\u11b2": "0x85", + "\u1108,,\u11b3": "0x85", + "\u1108,,\u11b4": "0x85", + "\u1108,,\u11b5": "0x85", + "\u1108,,\u11b6": "0x85", + "\u1108,,\u11b7": "0x85", + "\u1108,,\u11b8": "0x85", + "\u1108,,\u11b9": "0x85", + "\u1108,,\u11ba": "0x85", + "\u1108,,\u11bb": "0x85", + "\u1108,,\u11bc": "0x85", + "\u1108,,\u11bd": "0x85", + "\u1108,,\u11be": "0x85", + "\u1108,,\u11bf": "0x85", + "\u1108,,\u11c0": "0x85", + "\u1108,,\u11c1": "0x85", + "\u1108,,\u11c2": "0x85", + "\u1109,,\u11a8": "0x85", + "\u1109,,\u11a9": "0x85", + "\u1109,,\u11aa": "0x85", + "\u1109,,\u11ac": "0x85", + "\u1109,,\u11ad": "0x85", + "\u1109,,\u11ae": "0x85", + "\u1109,,\u11af": "0x85", + "\u1109,,\u11b0": "0x85", + "\u1109,,\u11b1": "0x85", + "\u1109,,\u11b2": "0x85", + "\u1109,,\u11b3": "0x85", + "\u1109,,\u11b4": "0x85", + "\u1109,,\u11b5": "0x85", + "\u1109,,\u11b6": "0x85", + "\u1109,,\u11b7": "0x85", + "\u1109,,\u11b8": "0x85", + "\u1109,,\u11b9": "0x85", + "\u1109,,\u11ba": "0x85", + "\u1109,,\u11bb": "0x85", + "\u1109,,\u11bc": "0x85", + "\u1109,,\u11bd": "0x85", + "\u1109,,\u11be": "0x85", + "\u1109,,\u11bf": "0x85", + "\u1109,,\u11c0": "0x85", + "\u1109,,\u11c1": "0x85", + "\u1109,,\u11c2": "0x85", + "\u110a,,\u11a8": "0x85", + "\u110a,,\u11a9": "0x85", + "\u110a,,\u11aa": "0x85", + "\u110a,,\u11ab": "0x89", + "\u110a,,\u11ac": "0x85", + "\u110a,,\u11ad": "0x85", + "\u110a,,\u11ae": "0x85", + "\u110a,,\u11af": "0x85", + "\u110a,,\u11b0": "0x85", + "\u110a,,\u11b1": "0x85", + "\u110a,,\u11b2": "0x85", + "\u110a,,\u11b3": "0x85", + "\u110a,,\u11b4": "0x85", + "\u110a,,\u11b5": "0x85", + "\u110a,,\u11b6": "0x85", + "\u110a,,\u11b7": "0x85", + "\u110a,,\u11b8": "0x85", + "\u110a,,\u11b9": "0x85", + "\u110a,,\u11ba": "0x85", + "\u110a,,\u11bb": "0x85", + "\u110a,,\u11bc": "0x85", + "\u110a,,\u11bd": "0x85", + "\u110a,,\u11be": "0x85", + "\u110a,,\u11bf": "0x85", + "\u110a,,\u11c0": "0x85", + "\u110a,,\u11c1": "0x85", + "\u110a,,\u11c2": "0x85", + "\u110b,,\u11a8": "0x85", + "\u110b,,\u11a9": "0x85", + "\u110b,,\u11aa": "0x85", + "\u110b,,\u11ac": "0x85", + "\u110b,,\u11ad": "0x85", + "\u110b,,\u11ae": "0x85", + "\u110b,,\u11af": "0x85", + "\u110b,,\u11b0": "0x85", + "\u110b,,\u11b1": "0x85", + "\u110b,,\u11b2": "0x85", + "\u110b,,\u11b3": "0x85", + "\u110b,,\u11b4": "0x85", + "\u110b,,\u11b5": "0x85", + "\u110b,,\u11b6": "0x85", + "\u110b,,\u11b7": "0x85", + "\u110b,,\u11b8": "0x85", + "\u110b,,\u11b9": "0x85", + "\u110b,,\u11ba": "0x85", + "\u110b,,\u11bb": "0x85", + "\u110b,,\u11bc": "0x85", + "\u110b,,\u11bd": "0x85", + "\u110b,,\u11be": "0x85", + "\u110b,,\u11bf": "0x85", + "\u110b,,\u11c0": "0x85", + "\u110b,,\u11c1": "0x85", + "\u110b,,\u11c2": "0x85", + "\u110c,,\u11a8": "0x85", + "\u110c,,\u11a9": "0x85", + "\u110c,,\u11aa": "0x85", + "\u110c,,\u11ac": "0x85", + "\u110c,,\u11ad": "0x85", + "\u110c,,\u11ae": "0x85", + "\u110c,,\u11af": "0x85", + "\u110c,,\u11b0": "0x85", + "\u110c,,\u11b1": "0x85", + "\u110c,,\u11b2": "0x85", + "\u110c,,\u11b3": "0x85", + "\u110c,,\u11b4": "0x85", + "\u110c,,\u11b5": "0x85", + "\u110c,,\u11b6": "0x85", + "\u110c,,\u11b7": "0x85", + "\u110c,,\u11b8": "0x85", + "\u110c,,\u11b9": "0x85", + "\u110c,,\u11ba": "0x85", + "\u110c,,\u11bb": "0x85", + "\u110c,,\u11bc": "0x85", + "\u110c,,\u11bd": "0x85", + "\u110c,,\u11be": "0x85", + "\u110c,,\u11bf": "0x85", + "\u110c,,\u11c0": "0x85", + "\u110c,,\u11c1": "0x85", + "\u110c,,\u11c2": "0x85", + "\u110d,,\u11a8": "0x85", + "\u110d,,\u11a9": "0x85", + "\u110d,,\u11aa": "0x85", + "\u110d,,\u11ab": "0x89", + "\u110d,,\u11ac": "0x85", + "\u110d,,\u11ad": "0x85", + "\u110d,,\u11ae": "0x85", + "\u110d,,\u11af": "0x85", + "\u110d,,\u11b0": "0x85", + "\u110d,,\u11b1": "0x85", + "\u110d,,\u11b2": "0x85", + "\u110d,,\u11b3": "0x85", + "\u110d,,\u11b4": "0x85", + "\u110d,,\u11b5": "0x85", + "\u110d,,\u11b6": "0x85", + "\u110d,,\u11b7": "0x85", + "\u110d,,\u11b8": "0x85", + "\u110d,,\u11b9": "0x85", + "\u110d,,\u11ba": "0x85", + "\u110d,,\u11bb": "0x85", + "\u110d,,\u11bc": "0x85", + "\u110d,,\u11bd": "0x85", + "\u110d,,\u11be": "0x85", + "\u110d,,\u11bf": "0x85", + "\u110d,,\u11c0": "0x85", + "\u110d,,\u11c1": "0x85", + "\u110d,,\u11c2": "0x85", + "\u110e,,\u11a8": "0x85", + "\u110e,,\u11a9": "0x85", + "\u110e,,\u11aa": "0x85", + "\u110e,,\u11ab": "0x89", + "\u110e,,\u11ac": "0x85", + "\u110e,,\u11ad": "0x85", + "\u110e,,\u11ae": "0x85", + "\u110e,,\u11af": "0x85", + "\u110e,,\u11b0": "0x85", + "\u110e,,\u11b1": "0x85", + "\u110e,,\u11b2": "0x85", + "\u110e,,\u11b3": "0x85", + "\u110e,,\u11b4": "0x85", + "\u110e,,\u11b5": "0x85", + "\u110e,,\u11b6": "0x85", + "\u110e,,\u11b7": "0x85", + "\u110e,,\u11b8": "0x85", + "\u110e,,\u11b9": "0x85", + "\u110e,,\u11ba": "0x85", + "\u110e,,\u11bb": "0x85", + "\u110e,,\u11bc": "0x85", + "\u110e,,\u11bd": "0x85", + "\u110e,,\u11be": "0x85", + "\u110e,,\u11bf": "0x85", + "\u110e,,\u11c0": "0x85", + "\u110e,,\u11c1": "0x85", + "\u110e,,\u11c2": "0x85", + "\u110f,,\u11a8": "0x85", + "\u110f,,\u11a9": "0x85", + "\u110f,,\u11aa": "0x85", + "\u110f,,\u11ab": "0x89", + "\u110f,,\u11ac": "0x85", + "\u110f,,\u11ad": "0x85", + "\u110f,,\u11ae": "0x85", + "\u110f,,\u11b0": "0x85", + "\u110f,,\u11b1": "0x85", + "\u110f,,\u11b2": "0x85", + "\u110f,,\u11b3": "0x85", + "\u110f,,\u11b4": "0x85", + "\u110f,,\u11b5": "0x85", + "\u110f,,\u11b6": "0x85", + "\u110f,,\u11b7": "0x85", + "\u110f,,\u11b8": "0x85", + "\u110f,,\u11b9": "0x85", + "\u110f,,\u11ba": "0x85", + "\u110f,,\u11bb": "0x85", + "\u110f,,\u11bc": "0x85", + "\u110f,,\u11bd": "0x85", + "\u110f,,\u11be": "0x85", + "\u110f,,\u11bf": "0x85", + "\u110f,,\u11c0": "0x85", + "\u110f,,\u11c1": "0x85", + "\u110f,,\u11c2": "0x85", + "\u1110,,\u11a8": "0x85", + "\u1110,,\u11a9": "0x85", + "\u1110,,\u11aa": "0x85", + "\u1110,,\u11ab": "0x89", + "\u1110,,\u11ac": "0x85", + "\u1110,,\u11ad": "0x85", + "\u1110,,\u11ae": "0x85", + "\u1110,,\u11af": "0x85", + "\u1110,,\u11b0": "0x85", + "\u1110,,\u11b1": "0x85", + "\u1110,,\u11b2": "0x85", + "\u1110,,\u11b3": "0x85", + "\u1110,,\u11b4": "0x85", + "\u1110,,\u11b5": "0x85", + "\u1110,,\u11b6": "0x85", + "\u1110,,\u11b7": "0x85", + "\u1110,,\u11b8": "0x85", + "\u1110,,\u11b9": "0x85", + "\u1110,,\u11ba": "0x85", + "\u1110,,\u11bb": "0x85", + "\u1110,,\u11bc": "0x85", + "\u1110,,\u11bd": "0x85", + "\u1110,,\u11be": "0x85", + "\u1110,,\u11bf": "0x85", + "\u1110,,\u11c0": "0x85", + "\u1110,,\u11c1": "0x85", + "\u1110,,\u11c2": "0x85", + "\u1111,,\u11a8": "0x85", + "\u1111,,\u11a9": "0x85", + "\u1111,,\u11aa": "0x85", + "\u1111,,\u11ab": "0x89", + "\u1111,,\u11ac": "0x85", + "\u1111,,\u11ad": "0x85", + "\u1111,,\u11ae": "0x85", + "\u1111,,\u11af": "0x85", + "\u1111,,\u11b0": "0x85", + "\u1111,,\u11b1": "0x85", + "\u1111,,\u11b2": "0x85", + "\u1111,,\u11b3": "0x85", + "\u1111,,\u11b4": "0x85", + "\u1111,,\u11b5": "0x85", + "\u1111,,\u11b6": "0x85", + "\u1111,,\u11b7": "0x85", + "\u1111,,\u11b8": "0x85", + "\u1111,,\u11b9": "0x85", + "\u1111,,\u11ba": "0x85", + "\u1111,,\u11bb": "0x85", + "\u1111,,\u11bc": "0x85", + "\u1111,,\u11bd": "0x85", + "\u1111,,\u11be": "0x85", + "\u1111,,\u11bf": "0x85", + "\u1111,,\u11c0": "0x85", + "\u1111,,\u11c1": "0x85", + "\u1111,,\u11c2": "0x85", + "\u1112,,\u11a8": "0x85", + "\u1112,,\u11a9": "0x85", + "\u1112,,\u11aa": "0x85", + "\u1112,,\u11ab": "0x89", + "\u1112,,\u11ac": "0x85", + "\u1112,,\u11ad": "0x85", + "\u1112,,\u11ae": "0x85", + "\u1112,,\u11af": "0x85", + "\u1112,,\u11b0": "0x85", + "\u1112,,\u11b1": "0x85", + "\u1112,,\u11b2": "0x85", + "\u1112,,\u11b3": "0x85", + "\u1112,,\u11b4": "0x85", + "\u1112,,\u11b5": "0x85", + "\u1112,,\u11b6": "0x85", + "\u1112,,\u11b7": "0x85", + "\u1112,,\u11b8": "0x85", + "\u1112,,\u11b9": "0x85", + "\u1112,,\u11ba": "0x85", + "\u1112,,\u11bb": "0x85", + "\u1112,,\u11bc": "0x85", + "\u1112,,\u11bd": "0x85", + "\u1112,,\u11be": "0x85", + "\u1112,,\u11bf": "0x85", + "\u1112,,\u11c0": "0x85", + "\u1112,,\u11c1": "0x85", + "\u1112,,\u11c2": "0x85" + } + }, + null + ], + "\u1172": [ + null, + { + "defaultGlyph": "0x88", + "alternatives": { + "\u110f,": "0x6f", + "\u1102,": "0x6f", + "\u1104,": "0x6f", + "\u1105,": "0x6f", + "\u1106,": "0x6f", + "\u1107,": "0x6f", + "\u1108,": "0x6f", + "\u1109,": "0x6f", + "\u110a,": "0x6f", + "\u110b,": "0x6f", + "\u110c,": "0x6f", + "\u110d,": "0x6f", + "\u110e,": "0x6f", + "\u1110,": "0x6f", + "\u1111,": "0x6f", + "\u1112,": "0x6f" + } + }, + null, + null, + { + "defaultGlyph": "0x86", + "alternatives": { + "\u1100,,\u11ab": "0x8a", + "\u1101,,\u11ab": "0x8a", + "\u1102,,\u11ab": "0x8a", + "\u1103,,\u11ab": "0x8a", + "\u1104,,\u11ab": "0x8a", + "\u1105,,\u11ab": "0x8a", + "\u1106,,\u11ab": "0x8a", + "\u1107,,\u11ab": "0x8a", + "\u1108,,\u11ab": "0x8a", + "\u1109,,\u11ab": "0x8a", + "\u110a,,\u11ab": "0x8a", + "\u110b,,\u11ab": "0x8a", + "\u110c,,\u11ab": "0x8a", + "\u110d,,\u11ab": "0x8a", + "\u110e,,\u11ab": "0x8a", + "\u110f,,\u11ab": "0x8a", + "\u1110,,\u11ab": "0x8a", + "\u1111,,\u11ab": "0x8a", + "\u1112,,\u11ab": "0x8a" + } + }, + null + ], + "\u1173": [ + null, + { + "defaultGlyph": "0x84", + "alternatives": { + "\u1100,": "0x6d", + "\u110f,": "0x6d", + "\u1101,": "0x6d", + "\u1102,": "0x6d", + "\u1109,": "0x81", + "\u1110,": "0x6d", + "\u1112,": "0x6d" + } + }, + null, + null, + { + "defaultGlyph": "0x81", + "alternatives": { + "\u1110,,\u11ab": "0x84", + "\u110b,,\u11ab": "0x84", + "\u1107,,\u11ab": "0x84", + "\u1105,,\u11ab": "0x84", + "\u1108,,\u11ab": "0x84", + "\u1109,,\u11ab": "0x84", + "\u1103,,\u11ab": "0x84", + "\u110c,,\u11ab": "0x84", + "\u1111,,\u11ab": "0x84", + "\u1112,,\u11ab": "0x84", + "\u1100,,\u11b8": "0x84", + "\u1102,,\u11bc": "0x84", + "\u1100,,\u11b7": "0x84", + "\u110f,,\u11af": "0x84", + "\u1101,,\u11c0": "0x84", + "\u1101,,\u11b7": "0x84", + "\u1102,,\u11af": "0x84", + "\u1102,,\u11b0": "0x84", + "\u110f,,\u11b7": "0x84", + "\u1102,,\u11bd": "0x84", + "\u1101,,\u11af": "0x84", + "\u1100,,\u11ba": "0x84", + "\u1100,,\u11af": "0x84", + "\u1100,,\u11b0": "0x84", + "\u1100,,\u11a8": "0x84", + "\u110f,,\u11ab": "0x84", + "\u1102,,\u11ab": "0x84", + "\u1101,,\u11ab": "0x84", + "\u1100,,\u11ab": "0x84", + "\u1100,,\u11a9": "0x84", + "\u1100,,\u11aa": "0x84", + "\u1100,,\u11ac": "0x84", + "\u1100,,\u11ad": "0x84", + "\u1100,,\u11ae": "0x84", + "\u1100,,\u11b1": "0x84", + "\u1100,,\u11b2": "0x84", + "\u1100,,\u11b3": "0x84", + "\u1100,,\u11b4": "0x84", + "\u1100,,\u11b5": "0x84", + "\u1100,,\u11b6": "0x84", + "\u1100,,\u11b9": "0x84", + "\u1100,,\u11bb": "0x84", + "\u1100,,\u11bc": "0x84", + "\u1100,,\u11bd": "0x84", + "\u1100,,\u11be": "0x84", + "\u1100,,\u11bf": "0x84", + "\u1100,,\u11c0": "0x84", + "\u1100,,\u11c1": "0x84", + "\u1100,,\u11c2": "0x84", + "\u1101,,\u11a8": "0x84", + "\u1101,,\u11a9": "0x84", + "\u1101,,\u11aa": "0x84", + "\u1101,,\u11ac": "0x84", + "\u1101,,\u11ad": "0x84", + "\u1101,,\u11ae": "0x84", + "\u1101,,\u11b0": "0x84", + "\u1101,,\u11b1": "0x84", + "\u1101,,\u11b2": "0x84", + "\u1101,,\u11b3": "0x84", + "\u1101,,\u11b4": "0x84", + "\u1101,,\u11b5": "0x84", + "\u1101,,\u11b6": "0x84", + "\u1101,,\u11b8": "0x84", + "\u1101,,\u11b9": "0x84", + "\u1101,,\u11ba": "0x84", + "\u1101,,\u11bb": "0x84", + "\u1101,,\u11bc": "0x84", + "\u1101,,\u11bd": "0x84", + "\u1101,,\u11be": "0x84", + "\u1101,,\u11bf": "0x84", + "\u1101,,\u11c1": "0x84", + "\u1101,,\u11c2": "0x84", + "\u1102,,\u11a8": "0x84", + "\u1102,,\u11a9": "0x84", + "\u1102,,\u11aa": "0x84", + "\u1102,,\u11ac": "0x84", + "\u1102,,\u11ad": "0x84", + "\u1102,,\u11ae": "0x84", + "\u1102,,\u11b1": "0x84", + "\u1102,,\u11b2": "0x84", + "\u1102,,\u11b3": "0x84", + "\u1102,,\u11b4": "0x84", + "\u1102,,\u11b5": "0x84", + "\u1102,,\u11b6": "0x84", + "\u1102,,\u11b7": "0x84", + "\u1102,,\u11b8": "0x84", + "\u1102,,\u11b9": "0x84", + "\u1102,,\u11ba": "0x84", + "\u1102,,\u11bb": "0x84", + "\u1102,,\u11be": "0x84", + "\u1102,,\u11bf": "0x84", + "\u1102,,\u11c0": "0x84", + "\u1102,,\u11c1": "0x84", + "\u1102,,\u11c2": "0x84", + "\u1103,,\u11a8": "0x84", + "\u1103,,\u11a9": "0x84", + "\u1103,,\u11aa": "0x84", + "\u1103,,\u11ac": "0x84", + "\u1103,,\u11ad": "0x84", + "\u1103,,\u11ae": "0x84", + "\u1103,,\u11af": "0x84", + "\u1103,,\u11b0": "0x84", + "\u1103,,\u11b1": "0x84", + "\u1103,,\u11b2": "0x84", + "\u1103,,\u11b3": "0x84", + "\u1103,,\u11b4": "0x84", + "\u1103,,\u11b5": "0x84", + "\u1103,,\u11b6": "0x84", + "\u1103,,\u11b7": "0x84", + "\u1103,,\u11b8": "0x84", + "\u1103,,\u11b9": "0x84", + "\u1103,,\u11ba": "0x84", + "\u1103,,\u11bb": "0x84", + "\u1103,,\u11bc": "0x84", + "\u1103,,\u11bd": "0x84", + "\u1103,,\u11be": "0x84", + "\u1103,,\u11bf": "0x84", + "\u1103,,\u11c0": "0x84", + "\u1103,,\u11c1": "0x84", + "\u1103,,\u11c2": "0x84", + "\u1104,,\u11a8": "0x84", + "\u1104,,\u11a9": "0x84", + "\u1104,,\u11aa": "0x84", + "\u1104,,\u11ab": "0x84", + "\u1104,,\u11ac": "0x84", + "\u1104,,\u11ad": "0x84", + "\u1104,,\u11ae": "0x84", + "\u1104,,\u11af": "0x84", + "\u1104,,\u11b0": "0x84", + "\u1104,,\u11b1": "0x84", + "\u1104,,\u11b2": "0x84", + "\u1104,,\u11b3": "0x84", + "\u1104,,\u11b4": "0x84", + "\u1104,,\u11b5": "0x84", + "\u1104,,\u11b6": "0x84", + "\u1104,,\u11b7": "0x84", + "\u1104,,\u11b8": "0x84", + "\u1104,,\u11b9": "0x84", + "\u1104,,\u11ba": "0x84", + "\u1104,,\u11bb": "0x84", + "\u1104,,\u11bc": "0x84", + "\u1104,,\u11bd": "0x84", + "\u1104,,\u11be": "0x84", + "\u1104,,\u11bf": "0x84", + "\u1104,,\u11c0": "0x84", + "\u1104,,\u11c1": "0x84", + "\u1104,,\u11c2": "0x84", + "\u1105,,\u11a8": "0x84", + "\u1105,,\u11a9": "0x84", + "\u1105,,\u11aa": "0x84", + "\u1105,,\u11ac": "0x84", + "\u1105,,\u11ad": "0x84", + "\u1105,,\u11ae": "0x84", + "\u1105,,\u11af": "0x84", + "\u1105,,\u11b0": "0x84", + "\u1105,,\u11b1": "0x84", + "\u1105,,\u11b2": "0x84", + "\u1105,,\u11b3": "0x84", + "\u1105,,\u11b4": "0x84", + "\u1105,,\u11b5": "0x84", + "\u1105,,\u11b6": "0x84", + "\u1105,,\u11b7": "0x84", + "\u1105,,\u11b8": "0x84", + "\u1105,,\u11b9": "0x84", + "\u1105,,\u11ba": "0x84", + "\u1105,,\u11bb": "0x84", + "\u1105,,\u11bc": "0x84", + "\u1105,,\u11bd": "0x84", + "\u1105,,\u11be": "0x84", + "\u1105,,\u11bf": "0x84", + "\u1105,,\u11c0": "0x84", + "\u1105,,\u11c1": "0x84", + "\u1105,,\u11c2": "0x84", + "\u1106,,\u11a8": "0x84", + "\u1106,,\u11a9": "0x84", + "\u1106,,\u11aa": "0x84", + "\u1106,,\u11ab": "0x84", + "\u1106,,\u11ac": "0x84", + "\u1106,,\u11ad": "0x84", + "\u1106,,\u11ae": "0x84", + "\u1106,,\u11af": "0x84", + "\u1106,,\u11b0": "0x84", + "\u1106,,\u11b1": "0x84", + "\u1106,,\u11b2": "0x84", + "\u1106,,\u11b3": "0x84", + "\u1106,,\u11b4": "0x84", + "\u1106,,\u11b5": "0x84", + "\u1106,,\u11b6": "0x84", + "\u1106,,\u11b7": "0x84", + "\u1106,,\u11b8": "0x84", + "\u1106,,\u11b9": "0x84", + "\u1106,,\u11ba": "0x84", + "\u1106,,\u11bb": "0x84", + "\u1106,,\u11bc": "0x84", + "\u1106,,\u11bd": "0x84", + "\u1106,,\u11be": "0x84", + "\u1106,,\u11bf": "0x84", + "\u1106,,\u11c0": "0x84", + "\u1106,,\u11c1": "0x84", + "\u1106,,\u11c2": "0x84", + "\u1107,,\u11a8": "0x84", + "\u1107,,\u11a9": "0x84", + "\u1107,,\u11aa": "0x84", + "\u1107,,\u11ac": "0x84", + "\u1107,,\u11ad": "0x84", + "\u1107,,\u11ae": "0x84", + "\u1107,,\u11af": "0x84", + "\u1107,,\u11b0": "0x84", + "\u1107,,\u11b1": "0x84", + "\u1107,,\u11b2": "0x84", + "\u1107,,\u11b3": "0x84", + "\u1107,,\u11b4": "0x84", + "\u1107,,\u11b5": "0x84", + "\u1107,,\u11b6": "0x84", + "\u1107,,\u11b7": "0x84", + "\u1107,,\u11b8": "0x84", + "\u1107,,\u11b9": "0x84", + "\u1107,,\u11ba": "0x84", + "\u1107,,\u11bb": "0x84", + "\u1107,,\u11bc": "0x84", + "\u1107,,\u11bd": "0x84", + "\u1107,,\u11be": "0x84", + "\u1107,,\u11bf": "0x84", + "\u1107,,\u11c0": "0x84", + "\u1107,,\u11c1": "0x84", + "\u1107,,\u11c2": "0x84", + "\u1108,,\u11a8": "0x84", + "\u1108,,\u11a9": "0x84", + "\u1108,,\u11aa": "0x84", + "\u1108,,\u11ac": "0x84", + "\u1108,,\u11ad": "0x84", + "\u1108,,\u11ae": "0x84", + "\u1108,,\u11af": "0x84", + "\u1108,,\u11b0": "0x84", + "\u1108,,\u11b1": "0x84", + "\u1108,,\u11b2": "0x84", + "\u1108,,\u11b3": "0x84", + "\u1108,,\u11b4": "0x84", + "\u1108,,\u11b5": "0x84", + "\u1108,,\u11b6": "0x84", + "\u1108,,\u11b7": "0x84", + "\u1108,,\u11b8": "0x84", + "\u1108,,\u11b9": "0x84", + "\u1108,,\u11ba": "0x84", + "\u1108,,\u11bb": "0x84", + "\u1108,,\u11bc": "0x84", + "\u1108,,\u11bd": "0x84", + "\u1108,,\u11be": "0x84", + "\u1108,,\u11bf": "0x84", + "\u1108,,\u11c0": "0x84", + "\u1108,,\u11c1": "0x84", + "\u1108,,\u11c2": "0x84", + "\u1109,,\u11a8": "0x84", + "\u1109,,\u11a9": "0x84", + "\u1109,,\u11aa": "0x84", + "\u1109,,\u11ac": "0x84", + "\u1109,,\u11ad": "0x84", + "\u1109,,\u11ae": "0x84", + "\u1109,,\u11af": "0x84", + "\u1109,,\u11b0": "0x84", + "\u1109,,\u11b1": "0x84", + "\u1109,,\u11b2": "0x84", + "\u1109,,\u11b3": "0x84", + "\u1109,,\u11b4": "0x84", + "\u1109,,\u11b5": "0x84", + "\u1109,,\u11b6": "0x84", + "\u1109,,\u11b7": "0x84", + "\u1109,,\u11b8": "0x84", + "\u1109,,\u11b9": "0x84", + "\u1109,,\u11ba": "0x84", + "\u1109,,\u11bb": "0x84", + "\u1109,,\u11bc": "0x84", + "\u1109,,\u11bd": "0x84", + "\u1109,,\u11be": "0x84", + "\u1109,,\u11bf": "0x84", + "\u1109,,\u11c0": "0x84", + "\u1109,,\u11c1": "0x84", + "\u1109,,\u11c2": "0x84", + "\u110a,,\u11a8": "0x84", + "\u110a,,\u11a9": "0x84", + "\u110a,,\u11aa": "0x84", + "\u110a,,\u11ab": "0x84", + "\u110a,,\u11ac": "0x84", + "\u110a,,\u11ad": "0x84", + "\u110a,,\u11ae": "0x84", + "\u110a,,\u11af": "0x84", + "\u110a,,\u11b0": "0x84", + "\u110a,,\u11b1": "0x84", + "\u110a,,\u11b2": "0x84", + "\u110a,,\u11b3": "0x84", + "\u110a,,\u11b4": "0x84", + "\u110a,,\u11b5": "0x84", + "\u110a,,\u11b6": "0x84", + "\u110a,,\u11b7": "0x84", + "\u110a,,\u11b8": "0x84", + "\u110a,,\u11b9": "0x84", + "\u110a,,\u11ba": "0x84", + "\u110a,,\u11bb": "0x84", + "\u110a,,\u11bc": "0x84", + "\u110a,,\u11bd": "0x84", + "\u110a,,\u11be": "0x84", + "\u110a,,\u11bf": "0x84", + "\u110a,,\u11c0": "0x84", + "\u110a,,\u11c1": "0x84", + "\u110a,,\u11c2": "0x84", + "\u110b,,\u11a8": "0x84", + "\u110b,,\u11a9": "0x84", + "\u110b,,\u11aa": "0x84", + "\u110b,,\u11ac": "0x84", + "\u110b,,\u11ad": "0x84", + "\u110b,,\u11ae": "0x84", + "\u110b,,\u11af": "0x84", + "\u110b,,\u11b0": "0x84", + "\u110b,,\u11b1": "0x84", + "\u110b,,\u11b2": "0x84", + "\u110b,,\u11b3": "0x84", + "\u110b,,\u11b4": "0x84", + "\u110b,,\u11b5": "0x84", + "\u110b,,\u11b6": "0x84", + "\u110b,,\u11b7": "0x84", + "\u110b,,\u11b8": "0x84", + "\u110b,,\u11b9": "0x84", + "\u110b,,\u11ba": "0x84", + "\u110b,,\u11bb": "0x84", + "\u110b,,\u11bc": "0x84", + "\u110b,,\u11bd": "0x84", + "\u110b,,\u11be": "0x84", + "\u110b,,\u11bf": "0x84", + "\u110b,,\u11c0": "0x84", + "\u110b,,\u11c1": "0x84", + "\u110b,,\u11c2": "0x84", + "\u110c,,\u11a8": "0x84", + "\u110c,,\u11a9": "0x84", + "\u110c,,\u11aa": "0x84", + "\u110c,,\u11ac": "0x84", + "\u110c,,\u11ad": "0x84", + "\u110c,,\u11ae": "0x84", + "\u110c,,\u11af": "0x84", + "\u110c,,\u11b0": "0x84", + "\u110c,,\u11b1": "0x84", + "\u110c,,\u11b2": "0x84", + "\u110c,,\u11b3": "0x84", + "\u110c,,\u11b4": "0x84", + "\u110c,,\u11b5": "0x84", + "\u110c,,\u11b6": "0x84", + "\u110c,,\u11b7": "0x84", + "\u110c,,\u11b8": "0x84", + "\u110c,,\u11b9": "0x84", + "\u110c,,\u11ba": "0x84", + "\u110c,,\u11bb": "0x84", + "\u110c,,\u11bc": "0x84", + "\u110c,,\u11bd": "0x84", + "\u110c,,\u11be": "0x84", + "\u110c,,\u11bf": "0x84", + "\u110c,,\u11c0": "0x84", + "\u110c,,\u11c1": "0x84", + "\u110c,,\u11c2": "0x84", + "\u110d,,\u11a8": "0x84", + "\u110d,,\u11a9": "0x84", + "\u110d,,\u11aa": "0x84", + "\u110d,,\u11ab": "0x84", + "\u110d,,\u11ac": "0x84", + "\u110d,,\u11ad": "0x84", + "\u110d,,\u11ae": "0x84", + "\u110d,,\u11af": "0x84", + "\u110d,,\u11b0": "0x84", + "\u110d,,\u11b1": "0x84", + "\u110d,,\u11b2": "0x84", + "\u110d,,\u11b3": "0x84", + "\u110d,,\u11b4": "0x84", + "\u110d,,\u11b5": "0x84", + "\u110d,,\u11b6": "0x84", + "\u110d,,\u11b7": "0x84", + "\u110d,,\u11b8": "0x84", + "\u110d,,\u11b9": "0x84", + "\u110d,,\u11ba": "0x84", + "\u110d,,\u11bb": "0x84", + "\u110d,,\u11bc": "0x84", + "\u110d,,\u11bd": "0x84", + "\u110d,,\u11be": "0x84", + "\u110d,,\u11bf": "0x84", + "\u110d,,\u11c0": "0x84", + "\u110d,,\u11c1": "0x84", + "\u110d,,\u11c2": "0x84", + "\u110e,,\u11a8": "0x84", + "\u110e,,\u11a9": "0x84", + "\u110e,,\u11aa": "0x84", + "\u110e,,\u11ab": "0x84", + "\u110e,,\u11ac": "0x84", + "\u110e,,\u11ad": "0x84", + "\u110e,,\u11ae": "0x84", + "\u110e,,\u11af": "0x84", + "\u110e,,\u11b0": "0x84", + "\u110e,,\u11b1": "0x84", + "\u110e,,\u11b2": "0x84", + "\u110e,,\u11b3": "0x84", + "\u110e,,\u11b4": "0x84", + "\u110e,,\u11b5": "0x84", + "\u110e,,\u11b6": "0x84", + "\u110e,,\u11b7": "0x84", + "\u110e,,\u11b8": "0x84", + "\u110e,,\u11b9": "0x84", + "\u110e,,\u11ba": "0x84", + "\u110e,,\u11bb": "0x84", + "\u110e,,\u11bc": "0x84", + "\u110e,,\u11bd": "0x84", + "\u110e,,\u11be": "0x84", + "\u110e,,\u11bf": "0x84", + "\u110e,,\u11c0": "0x84", + "\u110e,,\u11c1": "0x84", + "\u110e,,\u11c2": "0x84", + "\u110f,,\u11a8": "0x84", + "\u110f,,\u11a9": "0x84", + "\u110f,,\u11aa": "0x84", + "\u110f,,\u11ac": "0x84", + "\u110f,,\u11ad": "0x84", + "\u110f,,\u11ae": "0x84", + "\u110f,,\u11b0": "0x84", + "\u110f,,\u11b1": "0x84", + "\u110f,,\u11b2": "0x84", + "\u110f,,\u11b3": "0x84", + "\u110f,,\u11b4": "0x84", + "\u110f,,\u11b5": "0x84", + "\u110f,,\u11b6": "0x84", + "\u110f,,\u11b8": "0x84", + "\u110f,,\u11b9": "0x84", + "\u110f,,\u11ba": "0x84", + "\u110f,,\u11bb": "0x84", + "\u110f,,\u11bc": "0x84", + "\u110f,,\u11bd": "0x84", + "\u110f,,\u11be": "0x84", + "\u110f,,\u11bf": "0x84", + "\u110f,,\u11c0": "0x84", + "\u110f,,\u11c1": "0x84", + "\u110f,,\u11c2": "0x84", + "\u1110,,\u11a8": "0x84", + "\u1110,,\u11a9": "0x84", + "\u1110,,\u11aa": "0x84", + "\u1110,,\u11ac": "0x84", + "\u1110,,\u11ad": "0x84", + "\u1110,,\u11ae": "0x84", + "\u1110,,\u11af": "0x84", + "\u1110,,\u11b0": "0x84", + "\u1110,,\u11b1": "0x84", + "\u1110,,\u11b2": "0x84", + "\u1110,,\u11b3": "0x84", + "\u1110,,\u11b4": "0x84", + "\u1110,,\u11b5": "0x84", + "\u1110,,\u11b6": "0x84", + "\u1110,,\u11b7": "0x84", + "\u1110,,\u11b8": "0x84", + "\u1110,,\u11b9": "0x84", + "\u1110,,\u11ba": "0x84", + "\u1110,,\u11bb": "0x84", + "\u1110,,\u11bc": "0x84", + "\u1110,,\u11bd": "0x84", + "\u1110,,\u11be": "0x84", + "\u1110,,\u11bf": "0x84", + "\u1110,,\u11c0": "0x84", + "\u1110,,\u11c1": "0x84", + "\u1110,,\u11c2": "0x84", + "\u1111,,\u11a8": "0x84", + "\u1111,,\u11a9": "0x84", + "\u1111,,\u11aa": "0x84", + "\u1111,,\u11ac": "0x84", + "\u1111,,\u11ad": "0x84", + "\u1111,,\u11ae": "0x84", + "\u1111,,\u11af": "0x84", + "\u1111,,\u11b0": "0x84", + "\u1111,,\u11b1": "0x84", + "\u1111,,\u11b2": "0x84", + "\u1111,,\u11b3": "0x84", + "\u1111,,\u11b4": "0x84", + "\u1111,,\u11b5": "0x84", + "\u1111,,\u11b6": "0x84", + "\u1111,,\u11b7": "0x84", + "\u1111,,\u11b8": "0x84", + "\u1111,,\u11b9": "0x84", + "\u1111,,\u11ba": "0x84", + "\u1111,,\u11bb": "0x84", + "\u1111,,\u11bc": "0x84", + "\u1111,,\u11bd": "0x84", + "\u1111,,\u11be": "0x84", + "\u1111,,\u11bf": "0x84", + "\u1111,,\u11c0": "0x84", + "\u1111,,\u11c1": "0x84", + "\u1111,,\u11c2": "0x84", + "\u1112,,\u11a8": "0x84", + "\u1112,,\u11a9": "0x84", + "\u1112,,\u11aa": "0x84", + "\u1112,,\u11ac": "0x84", + "\u1112,,\u11ad": "0x84", + "\u1112,,\u11ae": "0x84", + "\u1112,,\u11af": "0x84", + "\u1112,,\u11b0": "0x84", + "\u1112,,\u11b1": "0x84", + "\u1112,,\u11b2": "0x84", + "\u1112,,\u11b3": "0x84", + "\u1112,,\u11b4": "0x84", + "\u1112,,\u11b5": "0x84", + "\u1112,,\u11b6": "0x84", + "\u1112,,\u11b7": "0x84", + "\u1112,,\u11b8": "0x84", + "\u1112,,\u11b9": "0x84", + "\u1112,,\u11ba": "0x84", + "\u1112,,\u11bb": "0x84", + "\u1112,,\u11bc": "0x84", + "\u1112,,\u11bd": "0x84", + "\u1112,,\u11be": "0x84", + "\u1112,,\u11bf": "0x84", + "\u1112,,\u11c0": "0x84", + "\u1112,,\u11c1": "0x84", + "\u1112,,\u11c2": "0x84" + } + }, + null + ], + "\u116a": [ + null, + null, + { + "defaultGlyph": "0xa4,0xa8", + "alternatives": { + "\u1100,": "0x8e,0xa8", + "\u1101,": "0x8e,0xa8" + } + }, + null, + null, + { + "defaultGlyph": "0xa2,0xa6", + "alternatives": { + "\u110b,,\u11ab": "0xa4,0xa8", + "\u1112,,\u11ab": "0xa4,0xa8", + "\u1100,,\u11bc": "0x8e,0xa6", + "\u1100,,\u11ab": "0x8e,0xa8", + "\u110f,,\u11ab": "0x8e,0xa8", + "\u1101,,\u11bc": "0x8f,0xa6", + "\u1101,,\u11a8": "0x8f,0xa6", + "\u1100,,\u11a8": "0x8e,0xa6", + "\u1100,,\u11a9": "0x8e,0xa6", + "\u1100,,\u11aa": "0x8e,0xa6", + "\u1100,,\u11ac": "0x8e,0xa6", + "\u1100,,\u11ad": "0x8e,0xa6", + "\u1100,,\u11ae": "0x8e,0xa6", + "\u1100,,\u11af": "0x8e,0xa6", + "\u1100,,\u11b0": "0x8e,0xa6", + "\u1100,,\u11b1": "0x8e,0xa6", + "\u1100,,\u11b2": "0x8e,0xa6", + "\u1100,,\u11b3": "0x8e,0xa6", + "\u1100,,\u11b4": "0x8e,0xa6", + "\u1100,,\u11b5": "0x8e,0xa6", + "\u1100,,\u11b6": "0x8e,0xa6", + "\u1100,,\u11b7": "0x8e,0xa6", + "\u1100,,\u11b8": "0x8e,0xa6", + "\u1100,,\u11b9": "0x8e,0xa6", + "\u1100,,\u11ba": "0x8e,0xa6", + "\u1100,,\u11bb": "0x8e,0xa6", + "\u1100,,\u11bd": "0x8e,0xa6", + "\u1100,,\u11be": "0x8e,0xa6", + "\u1100,,\u11bf": "0x8e,0xa6", + "\u1100,,\u11c0": "0x8e,0xa6", + "\u1100,,\u11c1": "0x8e,0xa6", + "\u1100,,\u11c2": "0x8e,0xa6", + "\u1101,,\u11a9": "0x8f,0xa6", + "\u1101,,\u11aa": "0x8f,0xa6", + "\u1101,,\u11ab": "0x8f,0xa8", + "\u1101,,\u11ac": "0x8f,0xa6", + "\u1101,,\u11ad": "0x8f,0xa6", + "\u1101,,\u11ae": "0x8f,0xa6", + "\u1101,,\u11af": "0x8f,0xa6", + "\u1101,,\u11b0": "0x8f,0xa6", + "\u1101,,\u11b1": "0x8f,0xa6", + "\u1101,,\u11b2": "0x8f,0xa6", + "\u1101,,\u11b3": "0x8f,0xa6", + "\u1101,,\u11b4": "0x8f,0xa6", + "\u1101,,\u11b5": "0x8f,0xa6", + "\u1101,,\u11b6": "0x8f,0xa6", + "\u1101,,\u11b7": "0x8f,0xa6", + "\u1101,,\u11b8": "0x8f,0xa6", + "\u1101,,\u11b9": "0x8f,0xa6", + "\u1101,,\u11ba": "0x8f,0xa6", + "\u1101,,\u11bb": "0x8f,0xa6", + "\u1101,,\u11bd": "0x8f,0xa6", + "\u1101,,\u11be": "0x8f,0xa6", + "\u1101,,\u11bf": "0x8f,0xa6", + "\u1101,,\u11c0": "0x8f,0xa6", + "\u1101,,\u11c1": "0x8f,0xa6", + "\u1101,,\u11c2": "0x8f,0xa6" + } + } + ], + "\u116b": [ + null, + null, + { + "defaultGlyph": "0xc2", + "alternatives": { + "\u1101,": "0x64" + } + }, + null, + null, + { + "defaultGlyph": "0xc1", + "alternatives": { + "\u1103,,\u11bb": "0xc1", + "\u1100,,\u11ab": "0x8e,0x46", + "\u1101,,\u11ab": "0x64", + "\u1102,,\u11ab": "0xc2", + "\u1103,,\u11ab": "0xc2", + "\u1104,,\u11ab": "0xc2", + "\u1105,,\u11ab": "0xc2", + "\u1106,,\u11ab": "0xc2", + "\u1107,,\u11ab": "0xc2", + "\u1108,,\u11ab": "0xc2", + "\u1109,,\u11ab": "0xc2", + "\u110a,,\u11ab": "0xc2", + "\u110b,,\u11ab": "0xc2", + "\u110c,,\u11ab": "0xc2", + "\u110d,,\u11ab": "0xc2", + "\u110e,,\u11ab": "0xc2", + "\u110f,,\u11ab": "0xc2", + "\u1110,,\u11ab": "0xc2", + "\u1111,,\u11ab": "0xc2", + "\u1112,,\u11ab": "0xc2", + "\u1100,,\u11a8": "0x8e,0x42", + "\u1100,,\u11a9": "0x8e,0x42", + "\u1100,,\u11aa": "0x8e,0x42", + "\u1100,,\u11ac": "0x8e,0x42", + "\u1100,,\u11ad": "0x8e,0x42", + "\u1100,,\u11ae": "0x8e,0x42", + "\u1100,,\u11af": "0x8e,0x42", + "\u1100,,\u11b0": "0x8e,0x42", + "\u1100,,\u11b1": "0x8e,0x42", + "\u1100,,\u11b2": "0x8e,0x42", + "\u1100,,\u11b3": "0x8e,0x42", + "\u1100,,\u11b4": "0x8e,0x42", + "\u1100,,\u11b5": "0x8e,0x42", + "\u1100,,\u11b6": "0x8e,0x42", + "\u1100,,\u11b7": "0x8e,0x42", + "\u1100,,\u11b8": "0x8e,0x42", + "\u1100,,\u11b9": "0x8e,0x42", + "\u1100,,\u11ba": "0x8e,0x42", + "\u1100,,\u11bb": "0x8e,0x42", + "\u1100,,\u11bc": "0x8e,0x42", + "\u1100,,\u11bd": "0x8e,0x42", + "\u1100,,\u11be": "0x8e,0x42", + "\u1100,,\u11bf": "0x8e,0x42", + "\u1100,,\u11c0": "0x8e,0x42", + "\u1100,,\u11c1": "0x8e,0x42", + "\u1100,,\u11c2": "0x8e,0x42", + "\u1101,,\u11a8": "0x64", + "\u1101,,\u11a9": "0x64", + "\u1101,,\u11aa": "0x64", + "\u1101,,\u11ac": "0x64", + "\u1101,,\u11ad": "0x64", + "\u1101,,\u11ae": "0x64", + "\u1101,,\u11af": "0x64", + "\u1101,,\u11b0": "0x64", + "\u1101,,\u11b1": "0x64", + "\u1101,,\u11b2": "0x64", + "\u1101,,\u11b3": "0x64", + "\u1101,,\u11b4": "0x64", + "\u1101,,\u11b5": "0x64", + "\u1101,,\u11b6": "0x64", + "\u1101,,\u11b7": "0x64", + "\u1101,,\u11b8": "0x64", + "\u1101,,\u11b9": "0x64", + "\u1101,,\u11ba": "0x64", + "\u1101,,\u11bb": "0x64", + "\u1101,,\u11bc": "0x64", + "\u1101,,\u11bd": "0x64", + "\u1101,,\u11be": "0x64", + "\u1101,,\u11bf": "0x64", + "\u1101,,\u11c0": "0x64", + "\u1101,,\u11c1": "0x64", + "\u1101,,\u11c2": "0x64" + } + } + ], + "\u116c": [ + null, + null, + { + "defaultGlyph": "0xa4,0xa9", + "alternatives": { + "\u1100,": "0x8e,0xa9", + "\u1101,": "0x8e,0xa9" + } + }, + null, + null, + { + "defaultGlyph": "0xa2,0xa7", + "alternatives": { + "\u1103,,\u11ab": "0xa2,0xa9", + "\u1100,,\u11bc": "0x8e,0xa7", + "\u1100,,\u11ab": "0x8e,0xa9", + "\u1101,,\u11ab": "0x8f,0xa9", + "\u1102,,\u11ab": "0xa2,0xa9", + "\u1104,,\u11ab": "0xa2,0xa9", + "\u1105,,\u11ab": "0xa2,0xa9", + "\u1106,,\u11ab": "0xa2,0xa9", + "\u1107,,\u11ab": "0xa2,0xa9", + "\u1108,,\u11ab": "0xa2,0xa9", + "\u1109,,\u11ab": "0xa2,0xa9", + "\u110a,,\u11ab": "0xa2,0xa9", + "\u110b,,\u11ab": "0xa2,0xa9", + "\u110c,,\u11ab": "0xa2,0xa9", + "\u110d,,\u11ab": "0xa2,0xa9", + "\u110e,,\u11ab": "0xa2,0xa9", + "\u110f,,\u11ab": "0xa2,0xa9", + "\u1110,,\u11ab": "0xa2,0xa9", + "\u1111,,\u11ab": "0xa2,0xa9", + "\u1112,,\u11ab": "0xa2,0xa9", + "\u1100,,\u11a8": "0x8e,0xa7", + "\u1100,,\u11a9": "0x8e,0xa7", + "\u1100,,\u11aa": "0x8e,0xa7", + "\u1100,,\u11ac": "0x8e,0xa7", + "\u1100,,\u11ad": "0x8e,0xa7", + "\u1100,,\u11ae": "0x8e,0xa7", + "\u1100,,\u11af": "0x8e,0xa7", + "\u1100,,\u11b0": "0x8e,0xa7", + "\u1100,,\u11b1": "0x8e,0xa7", + "\u1100,,\u11b2": "0x8e,0xa7", + "\u1100,,\u11b3": "0x8e,0xa7", + "\u1100,,\u11b4": "0x8e,0xa7", + "\u1100,,\u11b5": "0x8e,0xa7", + "\u1100,,\u11b6": "0x8e,0xa7", + "\u1100,,\u11b7": "0x8e,0xa7", + "\u1100,,\u11b8": "0x8e,0xa7", + "\u1100,,\u11b9": "0x8e,0xa7", + "\u1100,,\u11ba": "0x8e,0xa7", + "\u1100,,\u11bb": "0x8e,0xa7", + "\u1100,,\u11bd": "0x8e,0xa7", + "\u1100,,\u11be": "0x8e,0xa7", + "\u1100,,\u11bf": "0x8e,0xa7", + "\u1100,,\u11c0": "0x8e,0xa7", + "\u1100,,\u11c1": "0x8e,0xa7", + "\u1100,,\u11c2": "0x8e,0xa7", + "\u1101,,\u11a8": "0x8f,0xa7", + "\u1101,,\u11a9": "0x8f,0xa7", + "\u1101,,\u11aa": "0x8f,0xa7", + "\u1101,,\u11ac": "0x8f,0xa7", + "\u1101,,\u11ad": "0x8f,0xa7", + "\u1101,,\u11ae": "0x8f,0xa7", + "\u1101,,\u11af": "0x8f,0xa7", + "\u1101,,\u11b0": "0x8f,0xa7", + "\u1101,,\u11b1": "0x8f,0xa7", + "\u1101,,\u11b2": "0x8f,0xa7", + "\u1101,,\u11b3": "0x8f,0xa7", + "\u1101,,\u11b4": "0x8f,0xa7", + "\u1101,,\u11b5": "0x8f,0xa7", + "\u1101,,\u11b6": "0x8f,0xa7", + "\u1101,,\u11b7": "0x8f,0xa7", + "\u1101,,\u11b8": "0x8f,0xa7", + "\u1101,,\u11b9": "0x8f,0xa7", + "\u1101,,\u11ba": "0x8f,0xa7", + "\u1101,,\u11bb": "0x8f,0xa7", + "\u1101,,\u11bc": "0x8f,0xa7", + "\u1101,,\u11bd": "0x8f,0xa7", + "\u1101,,\u11be": "0x8f,0xa7", + "\u1101,,\u11bf": "0x8f,0xa7", + "\u1101,,\u11c0": "0x8f,0xa7", + "\u1101,,\u11c1": "0x8f,0xa7", + "\u1101,,\u11c2": "0x8f,0xa7" + } + } + ], + "\u116f": [ + null, + null, + { + "defaultGlyph": "0xac", + "alternatives": {} + }, + null, + null, + { + "defaultGlyph": "0xaa", + "alternatives": { + "\u110b,,\u11ab": "0xac", + "\u1106,,\u11ab": "0xac", + "\u1100,,\u11ab": "0xac", + "\u1100,,\u11a8": "0xaa", + "\u1100,,\u11a9": "0xaa", + "\u1100,,\u11aa": "0xaa", + "\u1100,,\u11ac": "0xaa", + "\u1100,,\u11ad": "0xaa", + "\u1100,,\u11ae": "0xaa", + "\u1100,,\u11af": "0xaa", + "\u1100,,\u11b0": "0xaa", + "\u1100,,\u11b1": "0xaa", + "\u1100,,\u11b2": "0xaa", + "\u1100,,\u11b3": "0xaa", + "\u1100,,\u11b4": "0xaa", + "\u1100,,\u11b5": "0xaa", + "\u1100,,\u11b6": "0xaa", + "\u1100,,\u11b7": "0xaa", + "\u1100,,\u11b8": "0xaa", + "\u1100,,\u11b9": "0xaa", + "\u1100,,\u11ba": "0xaa", + "\u1100,,\u11bb": "0xaa", + "\u1100,,\u11bc": "0xaa", + "\u1100,,\u11bd": "0xaa", + "\u1100,,\u11be": "0xaa", + "\u1100,,\u11bf": "0xaa", + "\u1100,,\u11c0": "0xaa", + "\u1100,,\u11c1": "0xaa", + "\u1100,,\u11c2": "0xaa", + "\u1101,,\u11a8": "0xaa", + "\u1101,,\u11a9": "0xaa", + "\u1101,,\u11aa": "0xaa", + "\u1101,,\u11ab": "0xac", + "\u1101,,\u11ac": "0xaa", + "\u1101,,\u11ad": "0xaa", + "\u1101,,\u11ae": "0xaa", + "\u1101,,\u11af": "0xaa", + "\u1101,,\u11b0": "0xaa", + "\u1101,,\u11b1": "0xaa", + "\u1101,,\u11b2": "0xaa", + "\u1101,,\u11b3": "0xaa", + "\u1101,,\u11b4": "0xaa", + "\u1101,,\u11b5": "0xaa", + "\u1101,,\u11b6": "0xaa", + "\u1101,,\u11b7": "0xaa", + "\u1101,,\u11b8": "0xaa", + "\u1101,,\u11b9": "0xaa", + "\u1101,,\u11ba": "0xaa", + "\u1101,,\u11bb": "0xaa", + "\u1101,,\u11bc": "0xaa", + "\u1101,,\u11bd": "0xaa", + "\u1101,,\u11be": "0xaa", + "\u1101,,\u11bf": "0xaa", + "\u1101,,\u11c0": "0xaa", + "\u1101,,\u11c1": "0xaa", + "\u1101,,\u11c2": "0xaa", + "\u1102,,\u11a8": "0xaa", + "\u1102,,\u11a9": "0xaa", + "\u1102,,\u11aa": "0xaa", + "\u1102,,\u11ab": "0xac", + "\u1102,,\u11ac": "0xaa", + "\u1102,,\u11ad": "0xaa", + "\u1102,,\u11ae": "0xaa", + "\u1102,,\u11af": "0xaa", + "\u1102,,\u11b0": "0xaa", + "\u1102,,\u11b1": "0xaa", + "\u1102,,\u11b2": "0xaa", + "\u1102,,\u11b3": "0xaa", + "\u1102,,\u11b4": "0xaa", + "\u1102,,\u11b5": "0xaa", + "\u1102,,\u11b6": "0xaa", + "\u1102,,\u11b7": "0xaa", + "\u1102,,\u11b8": "0xaa", + "\u1102,,\u11b9": "0xaa", + "\u1102,,\u11ba": "0xaa", + "\u1102,,\u11bb": "0xaa", + "\u1102,,\u11bc": "0xaa", + "\u1102,,\u11bd": "0xaa", + "\u1102,,\u11be": "0xaa", + "\u1102,,\u11bf": "0xaa", + "\u1102,,\u11c0": "0xaa", + "\u1102,,\u11c1": "0xaa", + "\u1102,,\u11c2": "0xaa", + "\u1103,,\u11a8": "0xaa", + "\u1103,,\u11a9": "0xaa", + "\u1103,,\u11aa": "0xaa", + "\u1103,,\u11ab": "0xac", + "\u1103,,\u11ac": "0xaa", + "\u1103,,\u11ad": "0xaa", + "\u1103,,\u11ae": "0xaa", + "\u1103,,\u11af": "0xaa", + "\u1103,,\u11b0": "0xaa", + "\u1103,,\u11b1": "0xaa", + "\u1103,,\u11b2": "0xaa", + "\u1103,,\u11b3": "0xaa", + "\u1103,,\u11b4": "0xaa", + "\u1103,,\u11b5": "0xaa", + "\u1103,,\u11b6": "0xaa", + "\u1103,,\u11b7": "0xaa", + "\u1103,,\u11b8": "0xaa", + "\u1103,,\u11b9": "0xaa", + "\u1103,,\u11ba": "0xaa", + "\u1103,,\u11bb": "0xaa", + "\u1103,,\u11bc": "0xaa", + "\u1103,,\u11bd": "0xaa", + "\u1103,,\u11be": "0xaa", + "\u1103,,\u11bf": "0xaa", + "\u1103,,\u11c0": "0xaa", + "\u1103,,\u11c1": "0xaa", + "\u1103,,\u11c2": "0xaa", + "\u1104,,\u11a8": "0xaa", + "\u1104,,\u11a9": "0xaa", + "\u1104,,\u11aa": "0xaa", + "\u1104,,\u11ab": "0xac", + "\u1104,,\u11ac": "0xaa", + "\u1104,,\u11ad": "0xaa", + "\u1104,,\u11ae": "0xaa", + "\u1104,,\u11af": "0xaa", + "\u1104,,\u11b0": "0xaa", + "\u1104,,\u11b1": "0xaa", + "\u1104,,\u11b2": "0xaa", + "\u1104,,\u11b3": "0xaa", + "\u1104,,\u11b4": "0xaa", + "\u1104,,\u11b5": "0xaa", + "\u1104,,\u11b6": "0xaa", + "\u1104,,\u11b7": "0xaa", + "\u1104,,\u11b8": "0xaa", + "\u1104,,\u11b9": "0xaa", + "\u1104,,\u11ba": "0xaa", + "\u1104,,\u11bb": "0xaa", + "\u1104,,\u11bc": "0xaa", + "\u1104,,\u11bd": "0xaa", + "\u1104,,\u11be": "0xaa", + "\u1104,,\u11bf": "0xaa", + "\u1104,,\u11c0": "0xaa", + "\u1104,,\u11c1": "0xaa", + "\u1104,,\u11c2": "0xaa", + "\u1105,,\u11a8": "0xaa", + "\u1105,,\u11a9": "0xaa", + "\u1105,,\u11aa": "0xaa", + "\u1105,,\u11ab": "0xac", + "\u1105,,\u11ac": "0xaa", + "\u1105,,\u11ad": "0xaa", + "\u1105,,\u11ae": "0xaa", + "\u1105,,\u11af": "0xaa", + "\u1105,,\u11b0": "0xaa", + "\u1105,,\u11b1": "0xaa", + "\u1105,,\u11b2": "0xaa", + "\u1105,,\u11b3": "0xaa", + "\u1105,,\u11b4": "0xaa", + "\u1105,,\u11b5": "0xaa", + "\u1105,,\u11b6": "0xaa", + "\u1105,,\u11b7": "0xaa", + "\u1105,,\u11b8": "0xaa", + "\u1105,,\u11b9": "0xaa", + "\u1105,,\u11ba": "0xaa", + "\u1105,,\u11bb": "0xaa", + "\u1105,,\u11bc": "0xaa", + "\u1105,,\u11bd": "0xaa", + "\u1105,,\u11be": "0xaa", + "\u1105,,\u11bf": "0xaa", + "\u1105,,\u11c0": "0xaa", + "\u1105,,\u11c1": "0xaa", + "\u1105,,\u11c2": "0xaa", + "\u1106,,\u11a8": "0xaa", + "\u1106,,\u11a9": "0xaa", + "\u1106,,\u11aa": "0xaa", + "\u1106,,\u11ac": "0xaa", + "\u1106,,\u11ad": "0xaa", + "\u1106,,\u11ae": "0xaa", + "\u1106,,\u11af": "0xaa", + "\u1106,,\u11b0": "0xaa", + "\u1106,,\u11b1": "0xaa", + "\u1106,,\u11b2": "0xaa", + "\u1106,,\u11b3": "0xaa", + "\u1106,,\u11b4": "0xaa", + "\u1106,,\u11b5": "0xaa", + "\u1106,,\u11b6": "0xaa", + "\u1106,,\u11b7": "0xaa", + "\u1106,,\u11b8": "0xaa", + "\u1106,,\u11b9": "0xaa", + "\u1106,,\u11ba": "0xaa", + "\u1106,,\u11bb": "0xaa", + "\u1106,,\u11bc": "0xaa", + "\u1106,,\u11bd": "0xaa", + "\u1106,,\u11be": "0xaa", + "\u1106,,\u11bf": "0xaa", + "\u1106,,\u11c0": "0xaa", + "\u1106,,\u11c1": "0xaa", + "\u1106,,\u11c2": "0xaa", + "\u1107,,\u11a8": "0xaa", + "\u1107,,\u11a9": "0xaa", + "\u1107,,\u11aa": "0xaa", + "\u1107,,\u11ab": "0xac", + "\u1107,,\u11ac": "0xaa", + "\u1107,,\u11ad": "0xaa", + "\u1107,,\u11ae": "0xaa", + "\u1107,,\u11af": "0xaa", + "\u1107,,\u11b0": "0xaa", + "\u1107,,\u11b1": "0xaa", + "\u1107,,\u11b2": "0xaa", + "\u1107,,\u11b3": "0xaa", + "\u1107,,\u11b4": "0xaa", + "\u1107,,\u11b5": "0xaa", + "\u1107,,\u11b6": "0xaa", + "\u1107,,\u11b7": "0xaa", + "\u1107,,\u11b8": "0xaa", + "\u1107,,\u11b9": "0xaa", + "\u1107,,\u11ba": "0xaa", + "\u1107,,\u11bb": "0xaa", + "\u1107,,\u11bc": "0xaa", + "\u1107,,\u11bd": "0xaa", + "\u1107,,\u11be": "0xaa", + "\u1107,,\u11bf": "0xaa", + "\u1107,,\u11c0": "0xaa", + "\u1107,,\u11c1": "0xaa", + "\u1107,,\u11c2": "0xaa", + "\u1108,,\u11a8": "0xaa", + "\u1108,,\u11a9": "0xaa", + "\u1108,,\u11aa": "0xaa", + "\u1108,,\u11ab": "0xac", + "\u1108,,\u11ac": "0xaa", + "\u1108,,\u11ad": "0xaa", + "\u1108,,\u11ae": "0xaa", + "\u1108,,\u11af": "0xaa", + "\u1108,,\u11b0": "0xaa", + "\u1108,,\u11b1": "0xaa", + "\u1108,,\u11b2": "0xaa", + "\u1108,,\u11b3": "0xaa", + "\u1108,,\u11b4": "0xaa", + "\u1108,,\u11b5": "0xaa", + "\u1108,,\u11b6": "0xaa", + "\u1108,,\u11b7": "0xaa", + "\u1108,,\u11b8": "0xaa", + "\u1108,,\u11b9": "0xaa", + "\u1108,,\u11ba": "0xaa", + "\u1108,,\u11bb": "0xaa", + "\u1108,,\u11bc": "0xaa", + "\u1108,,\u11bd": "0xaa", + "\u1108,,\u11be": "0xaa", + "\u1108,,\u11bf": "0xaa", + "\u1108,,\u11c0": "0xaa", + "\u1108,,\u11c1": "0xaa", + "\u1108,,\u11c2": "0xaa", + "\u1109,,\u11a8": "0xaa", + "\u1109,,\u11a9": "0xaa", + "\u1109,,\u11aa": "0xaa", + "\u1109,,\u11ab": "0xac", + "\u1109,,\u11ac": "0xaa", + "\u1109,,\u11ad": "0xaa", + "\u1109,,\u11ae": "0xaa", + "\u1109,,\u11af": "0xaa", + "\u1109,,\u11b0": "0xaa", + "\u1109,,\u11b1": "0xaa", + "\u1109,,\u11b2": "0xaa", + "\u1109,,\u11b3": "0xaa", + "\u1109,,\u11b4": "0xaa", + "\u1109,,\u11b5": "0xaa", + "\u1109,,\u11b6": "0xaa", + "\u1109,,\u11b7": "0xaa", + "\u1109,,\u11b8": "0xaa", + "\u1109,,\u11b9": "0xaa", + "\u1109,,\u11ba": "0xaa", + "\u1109,,\u11bb": "0xaa", + "\u1109,,\u11bc": "0xaa", + "\u1109,,\u11bd": "0xaa", + "\u1109,,\u11be": "0xaa", + "\u1109,,\u11bf": "0xaa", + "\u1109,,\u11c0": "0xaa", + "\u1109,,\u11c1": "0xaa", + "\u1109,,\u11c2": "0xaa", + "\u110a,,\u11a8": "0xaa", + "\u110a,,\u11a9": "0xaa", + "\u110a,,\u11aa": "0xaa", + "\u110a,,\u11ab": "0xac", + "\u110a,,\u11ac": "0xaa", + "\u110a,,\u11ad": "0xaa", + "\u110a,,\u11ae": "0xaa", + "\u110a,,\u11af": "0xaa", + "\u110a,,\u11b0": "0xaa", + "\u110a,,\u11b1": "0xaa", + "\u110a,,\u11b2": "0xaa", + "\u110a,,\u11b3": "0xaa", + "\u110a,,\u11b4": "0xaa", + "\u110a,,\u11b5": "0xaa", + "\u110a,,\u11b6": "0xaa", + "\u110a,,\u11b7": "0xaa", + "\u110a,,\u11b8": "0xaa", + "\u110a,,\u11b9": "0xaa", + "\u110a,,\u11ba": "0xaa", + "\u110a,,\u11bb": "0xaa", + "\u110a,,\u11bc": "0xaa", + "\u110a,,\u11bd": "0xaa", + "\u110a,,\u11be": "0xaa", + "\u110a,,\u11bf": "0xaa", + "\u110a,,\u11c0": "0xaa", + "\u110a,,\u11c1": "0xaa", + "\u110a,,\u11c2": "0xaa", + "\u110b,,\u11a8": "0xaa", + "\u110b,,\u11a9": "0xaa", + "\u110b,,\u11aa": "0xaa", + "\u110b,,\u11ac": "0xaa", + "\u110b,,\u11ad": "0xaa", + "\u110b,,\u11ae": "0xaa", + "\u110b,,\u11af": "0xaa", + "\u110b,,\u11b0": "0xaa", + "\u110b,,\u11b1": "0xaa", + "\u110b,,\u11b2": "0xaa", + "\u110b,,\u11b3": "0xaa", + "\u110b,,\u11b4": "0xaa", + "\u110b,,\u11b5": "0xaa", + "\u110b,,\u11b6": "0xaa", + "\u110b,,\u11b7": "0xaa", + "\u110b,,\u11b8": "0xaa", + "\u110b,,\u11b9": "0xaa", + "\u110b,,\u11ba": "0xaa", + "\u110b,,\u11bb": "0xaa", + "\u110b,,\u11bc": "0xaa", + "\u110b,,\u11bd": "0xaa", + "\u110b,,\u11be": "0xaa", + "\u110b,,\u11bf": "0xaa", + "\u110b,,\u11c0": "0xaa", + "\u110b,,\u11c1": "0xaa", + "\u110b,,\u11c2": "0xaa", + "\u110c,,\u11a8": "0xaa", + "\u110c,,\u11a9": "0xaa", + "\u110c,,\u11aa": "0xaa", + "\u110c,,\u11ab": "0xac", + "\u110c,,\u11ac": "0xaa", + "\u110c,,\u11ad": "0xaa", + "\u110c,,\u11ae": "0xaa", + "\u110c,,\u11af": "0xaa", + "\u110c,,\u11b0": "0xaa", + "\u110c,,\u11b1": "0xaa", + "\u110c,,\u11b2": "0xaa", + "\u110c,,\u11b3": "0xaa", + "\u110c,,\u11b4": "0xaa", + "\u110c,,\u11b5": "0xaa", + "\u110c,,\u11b6": "0xaa", + "\u110c,,\u11b7": "0xaa", + "\u110c,,\u11b8": "0xaa", + "\u110c,,\u11b9": "0xaa", + "\u110c,,\u11ba": "0xaa", + "\u110c,,\u11bb": "0xaa", + "\u110c,,\u11bc": "0xaa", + "\u110c,,\u11bd": "0xaa", + "\u110c,,\u11be": "0xaa", + "\u110c,,\u11bf": "0xaa", + "\u110c,,\u11c0": "0xaa", + "\u110c,,\u11c1": "0xaa", + "\u110c,,\u11c2": "0xaa", + "\u110d,,\u11a8": "0xaa", + "\u110d,,\u11a9": "0xaa", + "\u110d,,\u11aa": "0xaa", + "\u110d,,\u11ab": "0xac", + "\u110d,,\u11ac": "0xaa", + "\u110d,,\u11ad": "0xaa", + "\u110d,,\u11ae": "0xaa", + "\u110d,,\u11af": "0xaa", + "\u110d,,\u11b0": "0xaa", + "\u110d,,\u11b1": "0xaa", + "\u110d,,\u11b2": "0xaa", + "\u110d,,\u11b3": "0xaa", + "\u110d,,\u11b4": "0xaa", + "\u110d,,\u11b5": "0xaa", + "\u110d,,\u11b6": "0xaa", + "\u110d,,\u11b7": "0xaa", + "\u110d,,\u11b8": "0xaa", + "\u110d,,\u11b9": "0xaa", + "\u110d,,\u11ba": "0xaa", + "\u110d,,\u11bb": "0xaa", + "\u110d,,\u11bc": "0xaa", + "\u110d,,\u11bd": "0xaa", + "\u110d,,\u11be": "0xaa", + "\u110d,,\u11bf": "0xaa", + "\u110d,,\u11c0": "0xaa", + "\u110d,,\u11c1": "0xaa", + "\u110d,,\u11c2": "0xaa", + "\u110e,,\u11a8": "0xaa", + "\u110e,,\u11a9": "0xaa", + "\u110e,,\u11aa": "0xaa", + "\u110e,,\u11ab": "0xac", + "\u110e,,\u11ac": "0xaa", + "\u110e,,\u11ad": "0xaa", + "\u110e,,\u11ae": "0xaa", + "\u110e,,\u11af": "0xaa", + "\u110e,,\u11b0": "0xaa", + "\u110e,,\u11b1": "0xaa", + "\u110e,,\u11b2": "0xaa", + "\u110e,,\u11b3": "0xaa", + "\u110e,,\u11b4": "0xaa", + "\u110e,,\u11b5": "0xaa", + "\u110e,,\u11b6": "0xaa", + "\u110e,,\u11b7": "0xaa", + "\u110e,,\u11b8": "0xaa", + "\u110e,,\u11b9": "0xaa", + "\u110e,,\u11ba": "0xaa", + "\u110e,,\u11bb": "0xaa", + "\u110e,,\u11bc": "0xaa", + "\u110e,,\u11bd": "0xaa", + "\u110e,,\u11be": "0xaa", + "\u110e,,\u11bf": "0xaa", + "\u110e,,\u11c0": "0xaa", + "\u110e,,\u11c1": "0xaa", + "\u110e,,\u11c2": "0xaa", + "\u110f,,\u11a8": "0xaa", + "\u110f,,\u11a9": "0xaa", + "\u110f,,\u11aa": "0xaa", + "\u110f,,\u11ab": "0xac", + "\u110f,,\u11ac": "0xaa", + "\u110f,,\u11ad": "0xaa", + "\u110f,,\u11ae": "0xaa", + "\u110f,,\u11af": "0xaa", + "\u110f,,\u11b0": "0xaa", + "\u110f,,\u11b1": "0xaa", + "\u110f,,\u11b2": "0xaa", + "\u110f,,\u11b3": "0xaa", + "\u110f,,\u11b4": "0xaa", + "\u110f,,\u11b5": "0xaa", + "\u110f,,\u11b6": "0xaa", + "\u110f,,\u11b7": "0xaa", + "\u110f,,\u11b8": "0xaa", + "\u110f,,\u11b9": "0xaa", + "\u110f,,\u11ba": "0xaa", + "\u110f,,\u11bb": "0xaa", + "\u110f,,\u11bc": "0xaa", + "\u110f,,\u11bd": "0xaa", + "\u110f,,\u11be": "0xaa", + "\u110f,,\u11bf": "0xaa", + "\u110f,,\u11c0": "0xaa", + "\u110f,,\u11c1": "0xaa", + "\u110f,,\u11c2": "0xaa", + "\u1110,,\u11a8": "0xaa", + "\u1110,,\u11a9": "0xaa", + "\u1110,,\u11aa": "0xaa", + "\u1110,,\u11ab": "0xac", + "\u1110,,\u11ac": "0xaa", + "\u1110,,\u11ad": "0xaa", + "\u1110,,\u11ae": "0xaa", + "\u1110,,\u11af": "0xaa", + "\u1110,,\u11b0": "0xaa", + "\u1110,,\u11b1": "0xaa", + "\u1110,,\u11b2": "0xaa", + "\u1110,,\u11b3": "0xaa", + "\u1110,,\u11b4": "0xaa", + "\u1110,,\u11b5": "0xaa", + "\u1110,,\u11b6": "0xaa", + "\u1110,,\u11b7": "0xaa", + "\u1110,,\u11b8": "0xaa", + "\u1110,,\u11b9": "0xaa", + "\u1110,,\u11ba": "0xaa", + "\u1110,,\u11bb": "0xaa", + "\u1110,,\u11bc": "0xaa", + "\u1110,,\u11bd": "0xaa", + "\u1110,,\u11be": "0xaa", + "\u1110,,\u11bf": "0xaa", + "\u1110,,\u11c0": "0xaa", + "\u1110,,\u11c1": "0xaa", + "\u1110,,\u11c2": "0xaa", + "\u1111,,\u11a8": "0xaa", + "\u1111,,\u11a9": "0xaa", + "\u1111,,\u11aa": "0xaa", + "\u1111,,\u11ab": "0xac", + "\u1111,,\u11ac": "0xaa", + "\u1111,,\u11ad": "0xaa", + "\u1111,,\u11ae": "0xaa", + "\u1111,,\u11af": "0xaa", + "\u1111,,\u11b0": "0xaa", + "\u1111,,\u11b1": "0xaa", + "\u1111,,\u11b2": "0xaa", + "\u1111,,\u11b3": "0xaa", + "\u1111,,\u11b4": "0xaa", + "\u1111,,\u11b5": "0xaa", + "\u1111,,\u11b6": "0xaa", + "\u1111,,\u11b7": "0xaa", + "\u1111,,\u11b8": "0xaa", + "\u1111,,\u11b9": "0xaa", + "\u1111,,\u11ba": "0xaa", + "\u1111,,\u11bb": "0xaa", + "\u1111,,\u11bc": "0xaa", + "\u1111,,\u11bd": "0xaa", + "\u1111,,\u11be": "0xaa", + "\u1111,,\u11bf": "0xaa", + "\u1111,,\u11c0": "0xaa", + "\u1111,,\u11c1": "0xaa", + "\u1111,,\u11c2": "0xaa", + "\u1112,,\u11a8": "0xaa", + "\u1112,,\u11a9": "0xaa", + "\u1112,,\u11aa": "0xaa", + "\u1112,,\u11ab": "0xac", + "\u1112,,\u11ac": "0xaa", + "\u1112,,\u11ad": "0xaa", + "\u1112,,\u11ae": "0xaa", + "\u1112,,\u11af": "0xaa", + "\u1112,,\u11b0": "0xaa", + "\u1112,,\u11b1": "0xaa", + "\u1112,,\u11b2": "0xaa", + "\u1112,,\u11b3": "0xaa", + "\u1112,,\u11b4": "0xaa", + "\u1112,,\u11b5": "0xaa", + "\u1112,,\u11b6": "0xaa", + "\u1112,,\u11b7": "0xaa", + "\u1112,,\u11b8": "0xaa", + "\u1112,,\u11b9": "0xaa", + "\u1112,,\u11ba": "0xaa", + "\u1112,,\u11bb": "0xaa", + "\u1112,,\u11bc": "0xaa", + "\u1112,,\u11bd": "0xaa", + "\u1112,,\u11be": "0xaa", + "\u1112,,\u11bf": "0xaa", + "\u1112,,\u11c0": "0xaa", + "\u1112,,\u11c1": "0xaa", + "\u1112,,\u11c2": "0xaa" + } + } + ], + "\u1170": [ + null, + null, + { + "defaultGlyph": "0xc4", + "alternatives": {} + }, + null, + null, + { + "defaultGlyph": "0xc3", + "alternatives": { + "\u1100,,\u11ab": "0xc4", + "\u1101,,\u11ab": "0xc4", + "\u1102,,\u11ab": "0xc4", + "\u1103,,\u11ab": "0xc4", + "\u1104,,\u11ab": "0xc4", + "\u1105,,\u11ab": "0xc4", + "\u1106,,\u11ab": "0xc4", + "\u1107,,\u11ab": "0xc4", + "\u1108,,\u11ab": "0xc4", + "\u1109,,\u11ab": "0xc4", + "\u110a,,\u11ab": "0xc4", + "\u110b,,\u11ab": "0xc4", + "\u110c,,\u11ab": "0xc4", + "\u110d,,\u11ab": "0xc4", + "\u110e,,\u11ab": "0xc4", + "\u110f,,\u11ab": "0xc4", + "\u1110,,\u11ab": "0xc4", + "\u1111,,\u11ab": "0xc4", + "\u1112,,\u11ab": "0xc4" + } + } + ], + "\u1171": [ + null, + null, + { + "defaultGlyph": "0xad", + "alternatives": {} + }, + null, + null, + { + "defaultGlyph": "0xab", + "alternatives": { + "\u110b,,\u11ab": "0xad", + "\u1100,,\u11ab": "0xad", + "\u1101,,\u11ab": "0xad", + "\u1102,,\u11ab": "0xad", + "\u1103,,\u11ab": "0xad", + "\u1104,,\u11ab": "0xad", + "\u1105,,\u11ab": "0xad", + "\u1106,,\u11ab": "0xad", + "\u1107,,\u11ab": "0xad", + "\u1108,,\u11ab": "0xad", + "\u1109,,\u11ab": "0xad", + "\u110a,,\u11ab": "0xad", + "\u110c,,\u11ab": "0xad", + "\u110d,,\u11ab": "0xad", + "\u110e,,\u11ab": "0xad", + "\u110f,,\u11ab": "0xad", + "\u1110,,\u11ab": "0xad", + "\u1111,,\u11ab": "0xad", + "\u1112,,\u11ab": "0xad" + } + } + ], + "\u1174": [ + null, + null, + { + "defaultGlyph": "0xa5,0xa9", + "alternatives": {} + }, + null, + null, + { + "defaultGlyph": "0xa3,0xa7", + "alternatives": { + "\u1104,,\u11af": "0xa3,0xa7", + "\u1100,,\u11ab": "0xa3,0xa9", + "\u1101,,\u11ab": "0xa3,0xa9", + "\u1102,,\u11ab": "0xa3,0xa9", + "\u1103,,\u11ab": "0xa3,0xa9", + "\u1104,,\u11ab": "0xa3,0xa9", + "\u1105,,\u11ab": "0xa3,0xa9", + "\u1106,,\u11ab": "0xa3,0xa9", + "\u1107,,\u11ab": "0xa3,0xa9", + "\u1108,,\u11ab": "0xa3,0xa9", + "\u1109,,\u11ab": "0xa3,0xa9", + "\u110a,,\u11ab": "0xa3,0xa9", + "\u110b,,\u11ab": "0xa3,0xa9", + "\u110c,,\u11ab": "0xa3,0xa9", + "\u110d,,\u11ab": "0xa3,0xa9", + "\u110e,,\u11ab": "0xa3,0xa9", + "\u110f,,\u11ab": "0xa3,0xa9", + "\u1110,,\u11ab": "0xa3,0xa9", + "\u1111,,\u11ab": "0xa3,0xa9", + "\u1112,,\u11ab": "0xa3,0xa9" + } + } + ], + "\u11a8": [ + null, + null, + null, + { + "defaultGlyph": "0xc5", + "alternatives": {} + }, + { + "defaultGlyph": "0xde", + "alternatives": {} + }, + { + "defaultGlyph": "0xfe", + "alternatives": { + "\u110b,\u1170,": "0xfe" + } + } + ], + "\u11a9": [ + null, + null, + null, + { + "defaultGlyph": "0xc6", + "alternatives": {} + }, + { + "defaultGlyph": "0xdf", + "alternatives": {} + }, + { + "defaultGlyph": "0xdf", + "alternatives": {} + } + ], + "\u11aa": [ + null, + null, + null, + { + "defaultGlyph": "0xc7", + "alternatives": {} + }, + { + "defaultGlyph": "0xe0", + "alternatives": {} + }, + { + "defaultGlyph": "0xe0", + "alternatives": {} + } + ], + "\u11ab": [ + null, + null, + null, + { + "defaultGlyph": "0xc8", + "alternatives": {} + }, + { + "defaultGlyph": "0xe1", + "alternatives": { + "\u110b,\u116e,": "0xe1", + "\u1106,\u116e,": "0xe1", + "\u1100,\u116e,": "0xe1", + "\u110c,\u116e,": "0xe1", + "\u1107,\u116e,": "0xe1", + "\u1109,\u116e,": "0xe1", + "\u1101,\u116e,": "0xe1", + "\u1102,\u116e,": "0xe1", + "\u1103,\u116e,": "0xe1", + "\u1108,\u116e,": "0xe1", + "\u1100,\u1161,": "0xe1", + "\u1100,\u1162,": "0xe1", + "\u1100,\u1163,": "0xe1", + "\u1100,\u1164,": "0xe1", + "\u1100,\u1165,": "0xe1", + "\u1100,\u1166,": "0xe1", + "\u1100,\u1167,": "0xe1", + "\u1100,\u1168,": "0xe1", + "\u1100,\u1169,": "0xe1", + "\u1100,\u116a,": "0xe1", + "\u1100,\u116b,": "0xe1", + "\u1100,\u116c,": "0xe1", + "\u1100,\u116d,": "0xe1", + "\u1100,\u116f,": "0xe1", + "\u1100,\u1170,": "0xe1", + "\u1100,\u1171,": "0xe1", + "\u1100,\u1172,": "0xe1", + "\u1100,\u1173,": "0xe1", + "\u1100,\u1174,": "0xe1", + "\u1100,\u1175,": "0xe1", + "\u1101,\u1161,": "0xe1", + "\u1101,\u1162,": "0xe1", + "\u1101,\u1163,": "0xe1", + "\u1101,\u1164,": "0xe1", + "\u1101,\u1165,": "0xe1", + "\u1101,\u1166,": "0xe1", + "\u1101,\u1167,": "0xe1", + "\u1101,\u1168,": "0xe1", + "\u1101,\u1169,": "0xe1", + "\u1101,\u116a,": "0xe1", + "\u1101,\u116b,": "0xe1", + "\u1101,\u116c,": "0xe1", + "\u1101,\u116d,": "0xe1", + "\u1101,\u116f,": "0xe1", + "\u1101,\u1170,": "0xe1", + "\u1101,\u1171,": "0xe1", + "\u1101,\u1172,": "0xe1", + "\u1101,\u1173,": "0xe1", + "\u1101,\u1174,": "0xe1", + "\u1101,\u1175,": "0xe1", + "\u1102,\u1161,": "0xe1", + "\u1102,\u1162,": "0xe1", + "\u1102,\u1163,": "0xe1", + "\u1102,\u1164,": "0xe1", + "\u1102,\u1165,": "0xe1", + "\u1102,\u1166,": "0xe1", + "\u1102,\u1167,": "0xe1", + "\u1102,\u1168,": "0xe1", + "\u1102,\u1169,": "0xe1", + "\u1102,\u116a,": "0xe1", + "\u1102,\u116b,": "0xe1", + "\u1102,\u116c,": "0xe1", + "\u1102,\u116d,": "0xe1", + "\u1102,\u116f,": "0xe1", + "\u1102,\u1170,": "0xe1", + "\u1102,\u1171,": "0xe1", + "\u1102,\u1172,": "0xe1", + "\u1102,\u1173,": "0xe1", + "\u1102,\u1174,": "0xe1", + "\u1102,\u1175,": "0xe1", + "\u1103,\u1161,": "0xe1", + "\u1103,\u1162,": "0xe1", + "\u1103,\u1163,": "0xe1", + "\u1103,\u1164,": "0xe1", + "\u1103,\u1165,": "0xe1", + "\u1103,\u1166,": "0xe1", + "\u1103,\u1167,": "0xe1", + "\u1103,\u1168,": "0xe1", + "\u1103,\u1169,": "0xe1", + "\u1103,\u116a,": "0xe1", + "\u1103,\u116b,": "0xe1", + "\u1103,\u116c,": "0xe1", + "\u1103,\u116d,": "0xe1", + "\u1103,\u116f,": "0xe1", + "\u1103,\u1170,": "0xe1", + "\u1103,\u1171,": "0xe1", + "\u1103,\u1172,": "0xe1", + "\u1103,\u1173,": "0xe1", + "\u1103,\u1174,": "0xe1", + "\u1103,\u1175,": "0xe1", + "\u1104,\u1161,": "0xe1", + "\u1104,\u1162,": "0xe1", + "\u1104,\u1163,": "0xe1", + "\u1104,\u1164,": "0xe1", + "\u1104,\u1165,": "0xe1", + "\u1104,\u1166,": "0xe1", + "\u1104,\u1167,": "0xe1", + "\u1104,\u1168,": "0xe1", + "\u1104,\u1169,": "0xe1", + "\u1104,\u116a,": "0xe1", + "\u1104,\u116b,": "0xe1", + "\u1104,\u116c,": "0xe1", + "\u1104,\u116d,": "0xe1", + "\u1104,\u116e,": "0xe1", + "\u1104,\u116f,": "0xe1", + "\u1104,\u1170,": "0xe1", + "\u1104,\u1171,": "0xe1", + "\u1104,\u1172,": "0xe1", + "\u1104,\u1173,": "0xe1", + "\u1104,\u1174,": "0xe1", + "\u1104,\u1175,": "0xe1", + "\u1105,\u1161,": "0xe1", + "\u1105,\u1162,": "0xe1", + "\u1105,\u1163,": "0xe1", + "\u1105,\u1164,": "0xe1", + "\u1105,\u1165,": "0xe1", + "\u1105,\u1166,": "0xe1", + "\u1105,\u1167,": "0xe1", + "\u1105,\u1168,": "0xe1", + "\u1105,\u1169,": "0xe1", + "\u1105,\u116a,": "0xe1", + "\u1105,\u116b,": "0xe1", + "\u1105,\u116c,": "0xe1", + "\u1105,\u116d,": "0xe1", + "\u1105,\u116e,": "0xe1", + "\u1105,\u116f,": "0xe1", + "\u1105,\u1170,": "0xe1", + "\u1105,\u1171,": "0xe1", + "\u1105,\u1172,": "0xe1", + "\u1105,\u1173,": "0xe1", + "\u1105,\u1174,": "0xe1", + "\u1105,\u1175,": "0xe1", + "\u1106,\u1161,": "0xe1", + "\u1106,\u1162,": "0xe1", + "\u1106,\u1163,": "0xe1", + "\u1106,\u1164,": "0xe1", + "\u1106,\u1165,": "0xe1", + "\u1106,\u1166,": "0xe1", + "\u1106,\u1167,": "0xe1", + "\u1106,\u1168,": "0xe1", + "\u1106,\u1169,": "0xe1", + "\u1106,\u116a,": "0xe1", + "\u1106,\u116b,": "0xe1", + "\u1106,\u116c,": "0xe1", + "\u1106,\u116d,": "0xe1", + "\u1106,\u116f,": "0xe1", + "\u1106,\u1170,": "0xe1", + "\u1106,\u1171,": "0xe1", + "\u1106,\u1172,": "0xe1", + "\u1106,\u1173,": "0xe1", + "\u1106,\u1174,": "0xe1", + "\u1106,\u1175,": "0xe1", + "\u1107,\u1161,": "0xe1", + "\u1107,\u1162,": "0xe1", + "\u1107,\u1163,": "0xe1", + "\u1107,\u1164,": "0xe1", + "\u1107,\u1165,": "0xe1", + "\u1107,\u1166,": "0xe1", + "\u1107,\u1167,": "0xe1", + "\u1107,\u1168,": "0xe1", + "\u1107,\u1169,": "0xe1", + "\u1107,\u116a,": "0xe1", + "\u1107,\u116b,": "0xe1", + "\u1107,\u116c,": "0xe1", + "\u1107,\u116d,": "0xe1", + "\u1107,\u116f,": "0xe1", + "\u1107,\u1170,": "0xe1", + "\u1107,\u1171,": "0xe1", + "\u1107,\u1172,": "0xe1", + "\u1107,\u1173,": "0xe1", + "\u1107,\u1174,": "0xe1", + "\u1107,\u1175,": "0xe1", + "\u1108,\u1161,": "0xe1", + "\u1108,\u1162,": "0xe1", + "\u1108,\u1163,": "0xe1", + "\u1108,\u1164,": "0xe1", + "\u1108,\u1165,": "0xe1", + "\u1108,\u1166,": "0xe1", + "\u1108,\u1167,": "0xe1", + "\u1108,\u1168,": "0xe1", + "\u1108,\u1169,": "0xe1", + "\u1108,\u116a,": "0xe1", + "\u1108,\u116b,": "0xe1", + "\u1108,\u116c,": "0xe1", + "\u1108,\u116d,": "0xe1", + "\u1108,\u116f,": "0xe1", + "\u1108,\u1170,": "0xe1", + "\u1108,\u1171,": "0xe1", + "\u1108,\u1172,": "0xe1", + "\u1108,\u1173,": "0xe1", + "\u1108,\u1174,": "0xe1", + "\u1108,\u1175,": "0xe1", + "\u1109,\u1161,": "0xe1", + "\u1109,\u1162,": "0xe1", + "\u1109,\u1163,": "0xe1", + "\u1109,\u1164,": "0xe1", + "\u1109,\u1165,": "0xe1", + "\u1109,\u1166,": "0xe1", + "\u1109,\u1167,": "0xe1", + "\u1109,\u1168,": "0xe1", + "\u1109,\u1169,": "0xe1", + "\u1109,\u116a,": "0xe1", + "\u1109,\u116b,": "0xe1", + "\u1109,\u116c,": "0xe1", + "\u1109,\u116d,": "0xe1", + "\u1109,\u116f,": "0xe1", + "\u1109,\u1170,": "0xe1", + "\u1109,\u1171,": "0xe1", + "\u1109,\u1172,": "0xe1", + "\u1109,\u1173,": "0xe1", + "\u1109,\u1174,": "0xe1", + "\u1109,\u1175,": "0xe1", + "\u110a,\u1161,": "0xe1", + "\u110a,\u1162,": "0xe1", + "\u110a,\u1163,": "0xe1", + "\u110a,\u1164,": "0xe1", + "\u110a,\u1165,": "0xe1", + "\u110a,\u1166,": "0xe1", + "\u110a,\u1167,": "0xe1", + "\u110a,\u1168,": "0xe1", + "\u110a,\u1169,": "0xe1", + "\u110a,\u116a,": "0xe1", + "\u110a,\u116b,": "0xe1", + "\u110a,\u116c,": "0xe1", + "\u110a,\u116d,": "0xe1", + "\u110a,\u116e,": "0xe1", + "\u110a,\u116f,": "0xe1", + "\u110a,\u1170,": "0xe1", + "\u110a,\u1171,": "0xe1", + "\u110a,\u1172,": "0xe1", + "\u110a,\u1173,": "0xe1", + "\u110a,\u1174,": "0xe1", + "\u110a,\u1175,": "0xe1", + "\u110b,\u1161,": "0xe1", + "\u110b,\u1162,": "0xe1", + "\u110b,\u1163,": "0xe1", + "\u110b,\u1164,": "0xe1", + "\u110b,\u1165,": "0xe1", + "\u110b,\u1166,": "0xe1", + "\u110b,\u1167,": "0xe1", + "\u110b,\u1168,": "0xe1", + "\u110b,\u1169,": "0xe1", + "\u110b,\u116a,": "0xe1", + "\u110b,\u116b,": "0xe1", + "\u110b,\u116c,": "0xe1", + "\u110b,\u116d,": "0xe1", + "\u110b,\u116f,": "0xe1", + "\u110b,\u1170,": "0xe1", + "\u110b,\u1171,": "0xe1", + "\u110b,\u1172,": "0xe1", + "\u110b,\u1173,": "0xe1", + "\u110b,\u1174,": "0xe1", + "\u110b,\u1175,": "0xe1", + "\u110c,\u1161,": "0xe1", + "\u110c,\u1162,": "0xe1", + "\u110c,\u1163,": "0xe1", + "\u110c,\u1164,": "0xe1", + "\u110c,\u1165,": "0xe1", + "\u110c,\u1166,": "0xe1", + "\u110c,\u1167,": "0xe1", + "\u110c,\u1168,": "0xe1", + "\u110c,\u1169,": "0xe1", + "\u110c,\u116a,": "0xe1", + "\u110c,\u116b,": "0xe1", + "\u110c,\u116c,": "0xe1", + "\u110c,\u116d,": "0xe1", + "\u110c,\u116f,": "0xe1", + "\u110c,\u1170,": "0xe1", + "\u110c,\u1171,": "0xe1", + "\u110c,\u1172,": "0xe1", + "\u110c,\u1173,": "0xe1", + "\u110c,\u1174,": "0xe1", + "\u110c,\u1175,": "0xe1", + "\u110d,\u1161,": "0xe1", + "\u110d,\u1162,": "0xe1", + "\u110d,\u1163,": "0xe1", + "\u110d,\u1164,": "0xe1", + "\u110d,\u1165,": "0xe1", + "\u110d,\u1166,": "0xe1", + "\u110d,\u1167,": "0xe1", + "\u110d,\u1168,": "0xe1", + "\u110d,\u1169,": "0xe1", + "\u110d,\u116a,": "0xe1", + "\u110d,\u116b,": "0xe1", + "\u110d,\u116c,": "0xe1", + "\u110d,\u116d,": "0xe1", + "\u110d,\u116e,": "0xe1", + "\u110d,\u116f,": "0xe1", + "\u110d,\u1170,": "0xe1", + "\u110d,\u1171,": "0xe1", + "\u110d,\u1172,": "0xe1", + "\u110d,\u1173,": "0xe1", + "\u110d,\u1174,": "0xe1", + "\u110d,\u1175,": "0xe1", + "\u110e,\u1161,": "0xe1", + "\u110e,\u1162,": "0xe1", + "\u110e,\u1163,": "0xe1", + "\u110e,\u1164,": "0xe1", + "\u110e,\u1165,": "0xe1", + "\u110e,\u1166,": "0xe1", + "\u110e,\u1167,": "0xe1", + "\u110e,\u1168,": "0xe1", + "\u110e,\u1169,": "0xe1", + "\u110e,\u116a,": "0xe1", + "\u110e,\u116b,": "0xe1", + "\u110e,\u116c,": "0xe1", + "\u110e,\u116d,": "0xe1", + "\u110e,\u116e,": "0xe1", + "\u110e,\u116f,": "0xe1", + "\u110e,\u1170,": "0xe1", + "\u110e,\u1171,": "0xe1", + "\u110e,\u1172,": "0xe1", + "\u110e,\u1173,": "0xe1", + "\u110e,\u1174,": "0xe1", + "\u110e,\u1175,": "0xe1", + "\u110f,\u1161,": "0xe1", + "\u110f,\u1162,": "0xe1", + "\u110f,\u1163,": "0xe1", + "\u110f,\u1164,": "0xe1", + "\u110f,\u1165,": "0xe1", + "\u110f,\u1166,": "0xe1", + "\u110f,\u1167,": "0xe1", + "\u110f,\u1168,": "0xe1", + "\u110f,\u1169,": "0xe1", + "\u110f,\u116a,": "0xe1", + "\u110f,\u116b,": "0xe1", + "\u110f,\u116c,": "0xe1", + "\u110f,\u116d,": "0xe1", + "\u110f,\u116e,": "0xe1", + "\u110f,\u116f,": "0xe1", + "\u110f,\u1170,": "0xe1", + "\u110f,\u1171,": "0xe1", + "\u110f,\u1172,": "0xe1", + "\u110f,\u1173,": "0xe1", + "\u110f,\u1174,": "0xe1", + "\u110f,\u1175,": "0xe1", + "\u1110,\u1161,": "0xe1", + "\u1110,\u1162,": "0xe1", + "\u1110,\u1163,": "0xe1", + "\u1110,\u1164,": "0xe1", + "\u1110,\u1165,": "0xe1", + "\u1110,\u1166,": "0xe1", + "\u1110,\u1167,": "0xe1", + "\u1110,\u1168,": "0xe1", + "\u1110,\u1169,": "0xe1", + "\u1110,\u116a,": "0xe1", + "\u1110,\u116b,": "0xe1", + "\u1110,\u116c,": "0xe1", + "\u1110,\u116d,": "0xe1", + "\u1110,\u116e,": "0xe1", + "\u1110,\u116f,": "0xe1", + "\u1110,\u1170,": "0xe1", + "\u1110,\u1171,": "0xe1", + "\u1110,\u1172,": "0xe1", + "\u1110,\u1173,": "0xe1", + "\u1110,\u1174,": "0xe1", + "\u1110,\u1175,": "0xe1", + "\u1111,\u1161,": "0xe1", + "\u1111,\u1162,": "0xe1", + "\u1111,\u1163,": "0xe1", + "\u1111,\u1164,": "0xe1", + "\u1111,\u1165,": "0xe1", + "\u1111,\u1166,": "0xe1", + "\u1111,\u1167,": "0xe1", + "\u1111,\u1168,": "0xe1", + "\u1111,\u1169,": "0xe1", + "\u1111,\u116a,": "0xe1", + "\u1111,\u116b,": "0xe1", + "\u1111,\u116c,": "0xe1", + "\u1111,\u116d,": "0xe1", + "\u1111,\u116e,": "0xe1", + "\u1111,\u116f,": "0xe1", + "\u1111,\u1170,": "0xe1", + "\u1111,\u1171,": "0xe1", + "\u1111,\u1172,": "0xe1", + "\u1111,\u1173,": "0xe1", + "\u1111,\u1174,": "0xe1", + "\u1111,\u1175,": "0xe1", + "\u1112,\u1161,": "0xe1", + "\u1112,\u1162,": "0xe1", + "\u1112,\u1163,": "0xe1", + "\u1112,\u1164,": "0xe1", + "\u1112,\u1165,": "0xe1", + "\u1112,\u1166,": "0xe1", + "\u1112,\u1167,": "0xe1", + "\u1112,\u1168,": "0xe1", + "\u1112,\u1169,": "0xe1", + "\u1112,\u116a,": "0xe1", + "\u1112,\u116b,": "0xe1", + "\u1112,\u116c,": "0xe1", + "\u1112,\u116d,": "0xe1", + "\u1112,\u116e,": "0xe1", + "\u1112,\u116f,": "0xe1", + "\u1112,\u1170,": "0xe1", + "\u1112,\u1171,": "0xe1", + "\u1112,\u1172,": "0xe1", + "\u1112,\u1173,": "0xe1", + "\u1112,\u1174,": "0xe1", + "\u1112,\u1175,": "0xe1" + } + }, + { + "defaultGlyph": "0xff", + "alternatives": { + "\u110b,\u116f,": "0xff", + "\u1106,\u116f,": "0xff", + "\u110b,\u1171,": "0xff", + "\u1100,\u116f,": "0xff" + } + } + ], + "\u11ac": [ + null, + null, + null, + { + "defaultGlyph": "0xc9", + "alternatives": {} + }, + { + "defaultGlyph": "0xc9", + "alternatives": {} + }, + { + "defaultGlyph": "0xc9", + "alternatives": {} + } + ], + "\u11ad": [ + null, + null, + null, + { + "defaultGlyph": "0xca", + "alternatives": {} + }, + { + "defaultGlyph": "0xe2", + "alternatives": {} + }, + { + "defaultGlyph": "0xe2", + "alternatives": {} + } + ], + "\u11ae": [ + null, + null, + null, + { + "defaultGlyph": "0xcb", + "alternatives": {} + }, + { + "defaultGlyph": "0xe3", + "alternatives": {} + }, + { + "defaultGlyph": "0xe3", + "alternatives": {} + } + ], + "\u11af": [ + null, + null, + null, + { + "defaultGlyph": "0xcc", + "alternatives": {} + }, + { + "defaultGlyph": "0xe4", + "alternatives": {} + }, + { + "defaultGlyph": "extra_0x86", + "alternatives": { + "\u1112,\u116a,": "extra_0x86", + "\u1103,\u116c,": "extra_0x86", + "\u1104,\u1174,": "extra_0x86", + "\u1100,\u1161,": "extra_0x86", + "\u1100,\u1162,": "extra_0x86", + "\u1100,\u1163,": "extra_0x86", + "\u1100,\u1164,": "extra_0x86", + "\u1100,\u1165,": "extra_0x86", + "\u1100,\u1166,": "extra_0x86", + "\u1100,\u1167,": "extra_0x86", + "\u1100,\u1168,": "extra_0x86", + "\u1100,\u1169,": "extra_0x86", + "\u1100,\u116a,": "extra_0x86", + "\u1100,\u116b,": "extra_0x86", + "\u1100,\u116c,": "extra_0x86", + "\u1100,\u116d,": "extra_0x86", + "\u1100,\u116e,": "extra_0x86", + "\u1100,\u116f,": "extra_0x86", + "\u1100,\u1170,": "extra_0x86", + "\u1100,\u1171,": "extra_0x86", + "\u1100,\u1172,": "extra_0x86", + "\u1100,\u1173,": "extra_0x86", + "\u1100,\u1174,": "extra_0x86", + "\u1100,\u1175,": "extra_0x86", + "\u1101,\u1161,": "extra_0x86", + "\u1101,\u1162,": "extra_0x86", + "\u1101,\u1163,": "extra_0x86", + "\u1101,\u1164,": "extra_0x86", + "\u1101,\u1165,": "extra_0x86", + "\u1101,\u1166,": "extra_0x86", + "\u1101,\u1167,": "extra_0x86", + "\u1101,\u1168,": "extra_0x86", + "\u1101,\u1169,": "extra_0x86", + "\u1101,\u116a,": "extra_0x86", + "\u1101,\u116b,": "extra_0x86", + "\u1101,\u116c,": "extra_0x86", + "\u1101,\u116d,": "extra_0x86", + "\u1101,\u116e,": "extra_0x86", + "\u1101,\u116f,": "extra_0x86", + "\u1101,\u1170,": "extra_0x86", + "\u1101,\u1171,": "extra_0x86", + "\u1101,\u1172,": "extra_0x86", + "\u1101,\u1173,": "extra_0x86", + "\u1101,\u1174,": "extra_0x86", + "\u1101,\u1175,": "extra_0x86", + "\u1102,\u1161,": "extra_0x86", + "\u1102,\u1162,": "extra_0x86", + "\u1102,\u1163,": "extra_0x86", + "\u1102,\u1164,": "extra_0x86", + "\u1102,\u1165,": "extra_0x86", + "\u1102,\u1166,": "extra_0x86", + "\u1102,\u1167,": "extra_0x86", + "\u1102,\u1168,": "extra_0x86", + "\u1102,\u1169,": "extra_0x86", + "\u1102,\u116a,": "extra_0x86", + "\u1102,\u116b,": "extra_0x86", + "\u1102,\u116c,": "extra_0x86", + "\u1102,\u116d,": "extra_0x86", + "\u1102,\u116e,": "extra_0x86", + "\u1102,\u116f,": "extra_0x86", + "\u1102,\u1170,": "extra_0x86", + "\u1102,\u1171,": "extra_0x86", + "\u1102,\u1172,": "extra_0x86", + "\u1102,\u1173,": "extra_0x86", + "\u1102,\u1174,": "extra_0x86", + "\u1102,\u1175,": "extra_0x86", + "\u1103,\u1161,": "extra_0x86", + "\u1103,\u1162,": "extra_0x86", + "\u1103,\u1163,": "extra_0x86", + "\u1103,\u1164,": "extra_0x86", + "\u1103,\u1165,": "extra_0x86", + "\u1103,\u1166,": "extra_0x86", + "\u1103,\u1167,": "extra_0x86", + "\u1103,\u1168,": "extra_0x86", + "\u1103,\u1169,": "extra_0x86", + "\u1103,\u116a,": "extra_0x86", + "\u1103,\u116b,": "extra_0x86", + "\u1103,\u116d,": "extra_0x86", + "\u1103,\u116e,": "extra_0x86", + "\u1103,\u116f,": "extra_0x86", + "\u1103,\u1170,": "extra_0x86", + "\u1103,\u1171,": "extra_0x86", + "\u1103,\u1172,": "extra_0x86", + "\u1103,\u1173,": "extra_0x86", + "\u1103,\u1174,": "extra_0x86", + "\u1103,\u1175,": "extra_0x86", + "\u1104,\u1161,": "extra_0x86", + "\u1104,\u1162,": "extra_0x86", + "\u1104,\u1163,": "extra_0x86", + "\u1104,\u1164,": "extra_0x86", + "\u1104,\u1165,": "extra_0x86", + "\u1104,\u1166,": "extra_0x86", + "\u1104,\u1167,": "extra_0x86", + "\u1104,\u1168,": "extra_0x86", + "\u1104,\u1169,": "extra_0x86", + "\u1104,\u116a,": "extra_0x86", + "\u1104,\u116b,": "extra_0x86", + "\u1104,\u116c,": "extra_0x86", + "\u1104,\u116d,": "extra_0x86", + "\u1104,\u116e,": "extra_0x86", + "\u1104,\u116f,": "extra_0x86", + "\u1104,\u1170,": "extra_0x86", + "\u1104,\u1171,": "extra_0x86", + "\u1104,\u1172,": "extra_0x86", + "\u1104,\u1173,": "extra_0x86", + "\u1104,\u1175,": "extra_0x86", + "\u1105,\u1161,": "extra_0x86", + "\u1105,\u1162,": "extra_0x86", + "\u1105,\u1163,": "extra_0x86", + "\u1105,\u1164,": "extra_0x86", + "\u1105,\u1165,": "extra_0x86", + "\u1105,\u1166,": "extra_0x86", + "\u1105,\u1167,": "extra_0x86", + "\u1105,\u1168,": "extra_0x86", + "\u1105,\u1169,": "extra_0x86", + "\u1105,\u116a,": "extra_0x86", + "\u1105,\u116b,": "extra_0x86", + "\u1105,\u116c,": "extra_0x86", + "\u1105,\u116d,": "extra_0x86", + "\u1105,\u116e,": "extra_0x86", + "\u1105,\u116f,": "extra_0x86", + "\u1105,\u1170,": "extra_0x86", + "\u1105,\u1171,": "extra_0x86", + "\u1105,\u1172,": "extra_0x86", + "\u1105,\u1173,": "extra_0x86", + "\u1105,\u1174,": "extra_0x86", + "\u1105,\u1175,": "extra_0x86", + "\u1106,\u1161,": "extra_0x86", + "\u1106,\u1162,": "extra_0x86", + "\u1106,\u1163,": "extra_0x86", + "\u1106,\u1164,": "extra_0x86", + "\u1106,\u1165,": "extra_0x86", + "\u1106,\u1166,": "extra_0x86", + "\u1106,\u1167,": "extra_0x86", + "\u1106,\u1168,": "extra_0x86", + "\u1106,\u1169,": "extra_0x86", + "\u1106,\u116a,": "extra_0x86", + "\u1106,\u116b,": "extra_0x86", + "\u1106,\u116c,": "extra_0x86", + "\u1106,\u116d,": "extra_0x86", + "\u1106,\u116e,": "extra_0x86", + "\u1106,\u116f,": "extra_0x86", + "\u1106,\u1170,": "extra_0x86", + "\u1106,\u1171,": "extra_0x86", + "\u1106,\u1172,": "extra_0x86", + "\u1106,\u1173,": "extra_0x86", + "\u1106,\u1174,": "extra_0x86", + "\u1106,\u1175,": "extra_0x86", + "\u1107,\u1161,": "extra_0x86", + "\u1107,\u1162,": "extra_0x86", + "\u1107,\u1163,": "extra_0x86", + "\u1107,\u1164,": "extra_0x86", + "\u1107,\u1165,": "extra_0x86", + "\u1107,\u1166,": "extra_0x86", + "\u1107,\u1167,": "extra_0x86", + "\u1107,\u1168,": "extra_0x86", + "\u1107,\u1169,": "extra_0x86", + "\u1107,\u116a,": "extra_0x86", + "\u1107,\u116b,": "extra_0x86", + "\u1107,\u116c,": "extra_0x86", + "\u1107,\u116d,": "extra_0x86", + "\u1107,\u116e,": "extra_0x86", + "\u1107,\u116f,": "extra_0x86", + "\u1107,\u1170,": "extra_0x86", + "\u1107,\u1171,": "extra_0x86", + "\u1107,\u1172,": "extra_0x86", + "\u1107,\u1173,": "extra_0x86", + "\u1107,\u1174,": "extra_0x86", + "\u1107,\u1175,": "extra_0x86", + "\u1108,\u1161,": "extra_0x86", + "\u1108,\u1162,": "extra_0x86", + "\u1108,\u1163,": "extra_0x86", + "\u1108,\u1164,": "extra_0x86", + "\u1108,\u1165,": "extra_0x86", + "\u1108,\u1166,": "extra_0x86", + "\u1108,\u1167,": "extra_0x86", + "\u1108,\u1168,": "extra_0x86", + "\u1108,\u1169,": "extra_0x86", + "\u1108,\u116a,": "extra_0x86", + "\u1108,\u116b,": "extra_0x86", + "\u1108,\u116c,": "extra_0x86", + "\u1108,\u116d,": "extra_0x86", + "\u1108,\u116e,": "extra_0x86", + "\u1108,\u116f,": "extra_0x86", + "\u1108,\u1170,": "extra_0x86", + "\u1108,\u1171,": "extra_0x86", + "\u1108,\u1172,": "extra_0x86", + "\u1108,\u1173,": "extra_0x86", + "\u1108,\u1174,": "extra_0x86", + "\u1108,\u1175,": "extra_0x86", + "\u1109,\u1161,": "extra_0x86", + "\u1109,\u1162,": "extra_0x86", + "\u1109,\u1163,": "extra_0x86", + "\u1109,\u1164,": "extra_0x86", + "\u1109,\u1165,": "extra_0x86", + "\u1109,\u1166,": "extra_0x86", + "\u1109,\u1167,": "extra_0x86", + "\u1109,\u1168,": "extra_0x86", + "\u1109,\u1169,": "extra_0x86", + "\u1109,\u116a,": "extra_0x86", + "\u1109,\u116b,": "extra_0x86", + "\u1109,\u116c,": "extra_0x86", + "\u1109,\u116d,": "extra_0x86", + "\u1109,\u116e,": "extra_0x86", + "\u1109,\u116f,": "extra_0x86", + "\u1109,\u1170,": "extra_0x86", + "\u1109,\u1171,": "extra_0x86", + "\u1109,\u1172,": "extra_0x86", + "\u1109,\u1173,": "extra_0x86", + "\u1109,\u1174,": "extra_0x86", + "\u1109,\u1175,": "extra_0x86", + "\u110a,\u1161,": "extra_0x86", + "\u110a,\u1162,": "extra_0x86", + "\u110a,\u1163,": "extra_0x86", + "\u110a,\u1164,": "extra_0x86", + "\u110a,\u1165,": "extra_0x86", + "\u110a,\u1166,": "extra_0x86", + "\u110a,\u1167,": "extra_0x86", + "\u110a,\u1168,": "extra_0x86", + "\u110a,\u1169,": "extra_0x86", + "\u110a,\u116a,": "extra_0x86", + "\u110a,\u116b,": "extra_0x86", + "\u110a,\u116c,": "extra_0x86", + "\u110a,\u116d,": "extra_0x86", + "\u110a,\u116e,": "extra_0x86", + "\u110a,\u116f,": "extra_0x86", + "\u110a,\u1170,": "extra_0x86", + "\u110a,\u1171,": "extra_0x86", + "\u110a,\u1172,": "extra_0x86", + "\u110a,\u1173,": "extra_0x86", + "\u110a,\u1174,": "extra_0x86", + "\u110a,\u1175,": "extra_0x86", + "\u110b,\u1161,": "extra_0x86", + "\u110b,\u1162,": "extra_0x86", + "\u110b,\u1163,": "extra_0x86", + "\u110b,\u1164,": "extra_0x86", + "\u110b,\u1165,": "extra_0x86", + "\u110b,\u1166,": "extra_0x86", + "\u110b,\u1167,": "extra_0x86", + "\u110b,\u1168,": "extra_0x86", + "\u110b,\u1169,": "extra_0x86", + "\u110b,\u116a,": "extra_0x86", + "\u110b,\u116b,": "extra_0x86", + "\u110b,\u116c,": "extra_0x86", + "\u110b,\u116d,": "extra_0x86", + "\u110b,\u116e,": "extra_0x86", + "\u110b,\u116f,": "extra_0x86", + "\u110b,\u1170,": "extra_0x86", + "\u110b,\u1171,": "extra_0x86", + "\u110b,\u1172,": "extra_0x86", + "\u110b,\u1173,": "extra_0x86", + "\u110b,\u1174,": "extra_0x86", + "\u110b,\u1175,": "extra_0x86", + "\u110c,\u1161,": "extra_0x86", + "\u110c,\u1162,": "extra_0x86", + "\u110c,\u1163,": "extra_0x86", + "\u110c,\u1164,": "extra_0x86", + "\u110c,\u1165,": "extra_0x86", + "\u110c,\u1166,": "extra_0x86", + "\u110c,\u1167,": "extra_0x86", + "\u110c,\u1168,": "extra_0x86", + "\u110c,\u1169,": "extra_0x86", + "\u110c,\u116a,": "extra_0x86", + "\u110c,\u116b,": "extra_0x86", + "\u110c,\u116c,": "extra_0x86", + "\u110c,\u116d,": "extra_0x86", + "\u110c,\u116e,": "extra_0x86", + "\u110c,\u116f,": "extra_0x86", + "\u110c,\u1170,": "extra_0x86", + "\u110c,\u1171,": "extra_0x86", + "\u110c,\u1172,": "extra_0x86", + "\u110c,\u1173,": "extra_0x86", + "\u110c,\u1174,": "extra_0x86", + "\u110c,\u1175,": "extra_0x86", + "\u110d,\u1161,": "extra_0x86", + "\u110d,\u1162,": "extra_0x86", + "\u110d,\u1163,": "extra_0x86", + "\u110d,\u1164,": "extra_0x86", + "\u110d,\u1165,": "extra_0x86", + "\u110d,\u1166,": "extra_0x86", + "\u110d,\u1167,": "extra_0x86", + "\u110d,\u1168,": "extra_0x86", + "\u110d,\u1169,": "extra_0x86", + "\u110d,\u116a,": "extra_0x86", + "\u110d,\u116b,": "extra_0x86", + "\u110d,\u116c,": "extra_0x86", + "\u110d,\u116d,": "extra_0x86", + "\u110d,\u116e,": "extra_0x86", + "\u110d,\u116f,": "extra_0x86", + "\u110d,\u1170,": "extra_0x86", + "\u110d,\u1171,": "extra_0x86", + "\u110d,\u1172,": "extra_0x86", + "\u110d,\u1173,": "extra_0x86", + "\u110d,\u1174,": "extra_0x86", + "\u110d,\u1175,": "extra_0x86", + "\u110e,\u1161,": "extra_0x86", + "\u110e,\u1162,": "extra_0x86", + "\u110e,\u1163,": "extra_0x86", + "\u110e,\u1164,": "extra_0x86", + "\u110e,\u1165,": "extra_0x86", + "\u110e,\u1166,": "extra_0x86", + "\u110e,\u1167,": "extra_0x86", + "\u110e,\u1168,": "extra_0x86", + "\u110e,\u1169,": "extra_0x86", + "\u110e,\u116a,": "extra_0x86", + "\u110e,\u116b,": "extra_0x86", + "\u110e,\u116c,": "extra_0x86", + "\u110e,\u116d,": "extra_0x86", + "\u110e,\u116e,": "extra_0x86", + "\u110e,\u116f,": "extra_0x86", + "\u110e,\u1170,": "extra_0x86", + "\u110e,\u1171,": "extra_0x86", + "\u110e,\u1172,": "extra_0x86", + "\u110e,\u1173,": "extra_0x86", + "\u110e,\u1174,": "extra_0x86", + "\u110e,\u1175,": "extra_0x86", + "\u110f,\u1161,": "extra_0x86", + "\u110f,\u1162,": "extra_0x86", + "\u110f,\u1163,": "extra_0x86", + "\u110f,\u1164,": "extra_0x86", + "\u110f,\u1165,": "extra_0x86", + "\u110f,\u1166,": "extra_0x86", + "\u110f,\u1167,": "extra_0x86", + "\u110f,\u1168,": "extra_0x86", + "\u110f,\u1169,": "extra_0x86", + "\u110f,\u116a,": "extra_0x86", + "\u110f,\u116b,": "extra_0x86", + "\u110f,\u116c,": "extra_0x86", + "\u110f,\u116d,": "extra_0x86", + "\u110f,\u116e,": "extra_0x86", + "\u110f,\u116f,": "extra_0x86", + "\u110f,\u1170,": "extra_0x86", + "\u110f,\u1171,": "extra_0x86", + "\u110f,\u1172,": "extra_0x86", + "\u110f,\u1173,": "extra_0x86", + "\u110f,\u1174,": "extra_0x86", + "\u110f,\u1175,": "extra_0x86", + "\u1110,\u1161,": "extra_0x86", + "\u1110,\u1162,": "extra_0x86", + "\u1110,\u1163,": "extra_0x86", + "\u1110,\u1164,": "extra_0x86", + "\u1110,\u1165,": "extra_0x86", + "\u1110,\u1166,": "extra_0x86", + "\u1110,\u1167,": "extra_0x86", + "\u1110,\u1168,": "extra_0x86", + "\u1110,\u1169,": "extra_0x86", + "\u1110,\u116a,": "extra_0x86", + "\u1110,\u116b,": "extra_0x86", + "\u1110,\u116c,": "extra_0x86", + "\u1110,\u116d,": "extra_0x86", + "\u1110,\u116e,": "extra_0x86", + "\u1110,\u116f,": "extra_0x86", + "\u1110,\u1170,": "extra_0x86", + "\u1110,\u1171,": "extra_0x86", + "\u1110,\u1172,": "extra_0x86", + "\u1110,\u1173,": "extra_0x86", + "\u1110,\u1174,": "extra_0x86", + "\u1110,\u1175,": "extra_0x86", + "\u1111,\u1161,": "extra_0x86", + "\u1111,\u1162,": "extra_0x86", + "\u1111,\u1163,": "extra_0x86", + "\u1111,\u1164,": "extra_0x86", + "\u1111,\u1165,": "extra_0x86", + "\u1111,\u1166,": "extra_0x86", + "\u1111,\u1167,": "extra_0x86", + "\u1111,\u1168,": "extra_0x86", + "\u1111,\u1169,": "extra_0x86", + "\u1111,\u116a,": "extra_0x86", + "\u1111,\u116b,": "extra_0x86", + "\u1111,\u116c,": "extra_0x86", + "\u1111,\u116d,": "extra_0x86", + "\u1111,\u116e,": "extra_0x86", + "\u1111,\u116f,": "extra_0x86", + "\u1111,\u1170,": "extra_0x86", + "\u1111,\u1171,": "extra_0x86", + "\u1111,\u1172,": "extra_0x86", + "\u1111,\u1173,": "extra_0x86", + "\u1111,\u1174,": "extra_0x86", + "\u1111,\u1175,": "extra_0x86", + "\u1112,\u1161,": "extra_0x86", + "\u1112,\u1162,": "extra_0x86", + "\u1112,\u1163,": "extra_0x86", + "\u1112,\u1164,": "extra_0x86", + "\u1112,\u1165,": "extra_0x86", + "\u1112,\u1166,": "extra_0x86", + "\u1112,\u1167,": "extra_0x86", + "\u1112,\u1168,": "extra_0x86", + "\u1112,\u1169,": "extra_0x86", + "\u1112,\u116b,": "extra_0x86", + "\u1112,\u116c,": "extra_0x86", + "\u1112,\u116d,": "extra_0x86", + "\u1112,\u116e,": "extra_0x86", + "\u1112,\u116f,": "extra_0x86", + "\u1112,\u1170,": "extra_0x86", + "\u1112,\u1171,": "extra_0x86", + "\u1112,\u1172,": "extra_0x86", + "\u1112,\u1173,": "extra_0x86", + "\u1112,\u1174,": "extra_0x86", + "\u1112,\u1175,": "extra_0x86" + } + } + ], + "\u11b0": [ + null, + null, + null, + { + "defaultGlyph": "0xcd", + "alternatives": {} + }, + { + "defaultGlyph": "0xe5", + "alternatives": {} + }, + { + "defaultGlyph": "0xe5", + "alternatives": {} + } + ], + "\u11b1": [ + null, + null, + null, + { + "defaultGlyph": "0xce", + "alternatives": {} + }, + { + "defaultGlyph": "0xe6", + "alternatives": {} + }, + { + "defaultGlyph": "0xf8", + "alternatives": {} + } + ], + "\u11b2": [ + null, + null, + null, + { + "defaultGlyph": "0xcf", + "alternatives": {} + }, + { + "defaultGlyph": "0xcf", + "alternatives": {} + }, + { + "defaultGlyph": "0xcf", + "alternatives": {} + } + ], + "\u11b3": [ + null, + null, + null, + { + "defaultGlyph": "0xe7", + "alternatives": {} + }, + { + "defaultGlyph": "0xe7", + "alternatives": {} + }, + { + "defaultGlyph": "0xe7", + "alternatives": {} + } + ], + "\u11b4": [ + null, + null, + null, + { + "defaultGlyph": "0xd0", + "alternatives": {} + }, + { + "defaultGlyph": "0xe8", + "alternatives": {} + }, + { + "defaultGlyph": "0xe8", + "alternatives": {} + } + ], + "\u11b5": [ + null, + null, + null, + { + "defaultGlyph": "0xe9", + "alternatives": {} + }, + { + "defaultGlyph": "0xe9", + "alternatives": {} + }, + { + "defaultGlyph": "0xe9", + "alternatives": {} + } + ], + "\u11b6": [ + null, + null, + null, + { + "defaultGlyph": "0xd1", + "alternatives": {} + }, + { + "defaultGlyph": "0xea", + "alternatives": {} + }, + { + "defaultGlyph": "0xea", + "alternatives": {} + } + ], + "\u11b7": [ + null, + null, + null, + { + "defaultGlyph": "0xd2", + "alternatives": {} + }, + { + "defaultGlyph": "0xeb", + "alternatives": {} + }, + { + "defaultGlyph": "extra_0x87", + "alternatives": { + "\u1100,\u1161,": "extra_0x87", + "\u1100,\u1162,": "extra_0x87", + "\u1100,\u1163,": "extra_0x87", + "\u1100,\u1164,": "extra_0x87", + "\u1100,\u1165,": "extra_0x87", + "\u1100,\u1166,": "extra_0x87", + "\u1100,\u1167,": "extra_0x87", + "\u1100,\u1168,": "extra_0x87", + "\u1100,\u1169,": "extra_0x87", + "\u1100,\u116a,": "extra_0x87", + "\u1100,\u116b,": "extra_0x87", + "\u1100,\u116c,": "extra_0x87", + "\u1100,\u116d,": "extra_0x87", + "\u1100,\u116e,": "extra_0x87", + "\u1100,\u116f,": "extra_0x87", + "\u1100,\u1170,": "extra_0x87", + "\u1100,\u1171,": "extra_0x87", + "\u1100,\u1172,": "extra_0x87", + "\u1100,\u1173,": "extra_0x87", + "\u1100,\u1174,": "extra_0x87", + "\u1100,\u1175,": "extra_0x87", + "\u1101,\u1161,": "extra_0x87", + "\u1101,\u1162,": "extra_0x87", + "\u1101,\u1163,": "extra_0x87", + "\u1101,\u1164,": "extra_0x87", + "\u1101,\u1165,": "extra_0x87", + "\u1101,\u1166,": "extra_0x87", + "\u1101,\u1167,": "extra_0x87", + "\u1101,\u1168,": "extra_0x87", + "\u1101,\u1169,": "extra_0x87", + "\u1101,\u116a,": "extra_0x87", + "\u1101,\u116b,": "extra_0x87", + "\u1101,\u116c,": "extra_0x87", + "\u1101,\u116d,": "extra_0x87", + "\u1101,\u116e,": "extra_0x87", + "\u1101,\u116f,": "extra_0x87", + "\u1101,\u1170,": "extra_0x87", + "\u1101,\u1171,": "extra_0x87", + "\u1101,\u1172,": "extra_0x87", + "\u1101,\u1173,": "extra_0x87", + "\u1101,\u1174,": "extra_0x87", + "\u1101,\u1175,": "extra_0x87", + "\u1102,\u1161,": "extra_0x87", + "\u1102,\u1162,": "extra_0x87", + "\u1102,\u1163,": "extra_0x87", + "\u1102,\u1164,": "extra_0x87", + "\u1102,\u1165,": "extra_0x87", + "\u1102,\u1166,": "extra_0x87", + "\u1102,\u1167,": "extra_0x87", + "\u1102,\u1168,": "extra_0x87", + "\u1102,\u1169,": "extra_0x87", + "\u1102,\u116a,": "extra_0x87", + "\u1102,\u116b,": "extra_0x87", + "\u1102,\u116c,": "extra_0x87", + "\u1102,\u116d,": "extra_0x87", + "\u1102,\u116e,": "extra_0x87", + "\u1102,\u116f,": "extra_0x87", + "\u1102,\u1170,": "extra_0x87", + "\u1102,\u1171,": "extra_0x87", + "\u1102,\u1172,": "extra_0x87", + "\u1102,\u1173,": "extra_0x87", + "\u1102,\u1174,": "extra_0x87", + "\u1102,\u1175,": "extra_0x87", + "\u1103,\u1161,": "extra_0x87", + "\u1103,\u1162,": "extra_0x87", + "\u1103,\u1163,": "extra_0x87", + "\u1103,\u1164,": "extra_0x87", + "\u1103,\u1165,": "extra_0x87", + "\u1103,\u1166,": "extra_0x87", + "\u1103,\u1167,": "extra_0x87", + "\u1103,\u1168,": "extra_0x87", + "\u1103,\u1169,": "extra_0x87", + "\u1103,\u116a,": "extra_0x87", + "\u1103,\u116b,": "extra_0x87", + "\u1103,\u116c,": "extra_0x87", + "\u1103,\u116d,": "extra_0x87", + "\u1103,\u116e,": "extra_0x87", + "\u1103,\u116f,": "extra_0x87", + "\u1103,\u1170,": "extra_0x87", + "\u1103,\u1171,": "extra_0x87", + "\u1103,\u1172,": "extra_0x87", + "\u1103,\u1173,": "extra_0x87", + "\u1103,\u1174,": "extra_0x87", + "\u1103,\u1175,": "extra_0x87", + "\u1104,\u1161,": "extra_0x87", + "\u1104,\u1162,": "extra_0x87", + "\u1104,\u1163,": "extra_0x87", + "\u1104,\u1164,": "extra_0x87", + "\u1104,\u1165,": "extra_0x87", + "\u1104,\u1166,": "extra_0x87", + "\u1104,\u1167,": "extra_0x87", + "\u1104,\u1168,": "extra_0x87", + "\u1104,\u1169,": "extra_0x87", + "\u1104,\u116a,": "extra_0x87", + "\u1104,\u116b,": "extra_0x87", + "\u1104,\u116c,": "extra_0x87", + "\u1104,\u116d,": "extra_0x87", + "\u1104,\u116e,": "extra_0x87", + "\u1104,\u116f,": "extra_0x87", + "\u1104,\u1170,": "extra_0x87", + "\u1104,\u1171,": "extra_0x87", + "\u1104,\u1172,": "extra_0x87", + "\u1104,\u1173,": "extra_0x87", + "\u1104,\u1174,": "extra_0x87", + "\u1104,\u1175,": "extra_0x87", + "\u1105,\u1161,": "extra_0x87", + "\u1105,\u1162,": "extra_0x87", + "\u1105,\u1163,": "extra_0x87", + "\u1105,\u1164,": "extra_0x87", + "\u1105,\u1165,": "extra_0x87", + "\u1105,\u1166,": "extra_0x87", + "\u1105,\u1167,": "extra_0x87", + "\u1105,\u1168,": "extra_0x87", + "\u1105,\u1169,": "extra_0x87", + "\u1105,\u116a,": "extra_0x87", + "\u1105,\u116b,": "extra_0x87", + "\u1105,\u116c,": "extra_0x87", + "\u1105,\u116d,": "extra_0x87", + "\u1105,\u116e,": "extra_0x87", + "\u1105,\u116f,": "extra_0x87", + "\u1105,\u1170,": "extra_0x87", + "\u1105,\u1171,": "extra_0x87", + "\u1105,\u1172,": "extra_0x87", + "\u1105,\u1173,": "extra_0x87", + "\u1105,\u1174,": "extra_0x87", + "\u1105,\u1175,": "extra_0x87", + "\u1106,\u1161,": "extra_0x87", + "\u1106,\u1162,": "extra_0x87", + "\u1106,\u1163,": "extra_0x87", + "\u1106,\u1164,": "extra_0x87", + "\u1106,\u1165,": "extra_0x87", + "\u1106,\u1166,": "extra_0x87", + "\u1106,\u1167,": "extra_0x87", + "\u1106,\u1168,": "extra_0x87", + "\u1106,\u1169,": "extra_0x87", + "\u1106,\u116a,": "extra_0x87", + "\u1106,\u116b,": "extra_0x87", + "\u1106,\u116c,": "extra_0x87", + "\u1106,\u116d,": "extra_0x87", + "\u1106,\u116e,": "extra_0x87", + "\u1106,\u116f,": "extra_0x87", + "\u1106,\u1170,": "extra_0x87", + "\u1106,\u1171,": "extra_0x87", + "\u1106,\u1172,": "extra_0x87", + "\u1106,\u1173,": "extra_0x87", + "\u1106,\u1174,": "extra_0x87", + "\u1106,\u1175,": "extra_0x87", + "\u1107,\u1161,": "extra_0x87", + "\u1107,\u1162,": "extra_0x87", + "\u1107,\u1163,": "extra_0x87", + "\u1107,\u1164,": "extra_0x87", + "\u1107,\u1165,": "extra_0x87", + "\u1107,\u1166,": "extra_0x87", + "\u1107,\u1167,": "extra_0x87", + "\u1107,\u1168,": "extra_0x87", + "\u1107,\u1169,": "extra_0x87", + "\u1107,\u116a,": "extra_0x87", + "\u1107,\u116b,": "extra_0x87", + "\u1107,\u116c,": "extra_0x87", + "\u1107,\u116d,": "extra_0x87", + "\u1107,\u116e,": "extra_0x87", + "\u1107,\u116f,": "extra_0x87", + "\u1107,\u1170,": "extra_0x87", + "\u1107,\u1171,": "extra_0x87", + "\u1107,\u1172,": "extra_0x87", + "\u1107,\u1173,": "extra_0x87", + "\u1107,\u1174,": "extra_0x87", + "\u1107,\u1175,": "extra_0x87", + "\u1108,\u1161,": "extra_0x87", + "\u1108,\u1162,": "extra_0x87", + "\u1108,\u1163,": "extra_0x87", + "\u1108,\u1164,": "extra_0x87", + "\u1108,\u1165,": "extra_0x87", + "\u1108,\u1166,": "extra_0x87", + "\u1108,\u1167,": "extra_0x87", + "\u1108,\u1168,": "extra_0x87", + "\u1108,\u1169,": "extra_0x87", + "\u1108,\u116a,": "extra_0x87", + "\u1108,\u116b,": "extra_0x87", + "\u1108,\u116c,": "extra_0x87", + "\u1108,\u116d,": "extra_0x87", + "\u1108,\u116e,": "extra_0x87", + "\u1108,\u116f,": "extra_0x87", + "\u1108,\u1170,": "extra_0x87", + "\u1108,\u1171,": "extra_0x87", + "\u1108,\u1172,": "extra_0x87", + "\u1108,\u1173,": "extra_0x87", + "\u1108,\u1174,": "extra_0x87", + "\u1108,\u1175,": "extra_0x87", + "\u1109,\u1161,": "extra_0x87", + "\u1109,\u1162,": "extra_0x87", + "\u1109,\u1163,": "extra_0x87", + "\u1109,\u1164,": "extra_0x87", + "\u1109,\u1165,": "extra_0x87", + "\u1109,\u1166,": "extra_0x87", + "\u1109,\u1167,": "extra_0x87", + "\u1109,\u1168,": "extra_0x87", + "\u1109,\u1169,": "extra_0x87", + "\u1109,\u116a,": "extra_0x87", + "\u1109,\u116b,": "extra_0x87", + "\u1109,\u116c,": "extra_0x87", + "\u1109,\u116d,": "extra_0x87", + "\u1109,\u116e,": "extra_0x87", + "\u1109,\u116f,": "extra_0x87", + "\u1109,\u1170,": "extra_0x87", + "\u1109,\u1171,": "extra_0x87", + "\u1109,\u1172,": "extra_0x87", + "\u1109,\u1173,": "extra_0x87", + "\u1109,\u1174,": "extra_0x87", + "\u1109,\u1175,": "extra_0x87", + "\u110a,\u1161,": "extra_0x87", + "\u110a,\u1162,": "extra_0x87", + "\u110a,\u1163,": "extra_0x87", + "\u110a,\u1164,": "extra_0x87", + "\u110a,\u1165,": "extra_0x87", + "\u110a,\u1166,": "extra_0x87", + "\u110a,\u1167,": "extra_0x87", + "\u110a,\u1168,": "extra_0x87", + "\u110a,\u1169,": "extra_0x87", + "\u110a,\u116a,": "extra_0x87", + "\u110a,\u116b,": "extra_0x87", + "\u110a,\u116c,": "extra_0x87", + "\u110a,\u116d,": "extra_0x87", + "\u110a,\u116e,": "extra_0x87", + "\u110a,\u116f,": "extra_0x87", + "\u110a,\u1170,": "extra_0x87", + "\u110a,\u1171,": "extra_0x87", + "\u110a,\u1172,": "extra_0x87", + "\u110a,\u1173,": "extra_0x87", + "\u110a,\u1174,": "extra_0x87", + "\u110a,\u1175,": "extra_0x87", + "\u110b,\u1161,": "extra_0x87", + "\u110b,\u1162,": "extra_0x87", + "\u110b,\u1163,": "extra_0x87", + "\u110b,\u1164,": "extra_0x87", + "\u110b,\u1165,": "extra_0x87", + "\u110b,\u1166,": "extra_0x87", + "\u110b,\u1167,": "extra_0x87", + "\u110b,\u1168,": "extra_0x87", + "\u110b,\u1169,": "extra_0x87", + "\u110b,\u116a,": "extra_0x87", + "\u110b,\u116b,": "extra_0x87", + "\u110b,\u116c,": "extra_0x87", + "\u110b,\u116d,": "extra_0x87", + "\u110b,\u116e,": "extra_0x87", + "\u110b,\u116f,": "extra_0x87", + "\u110b,\u1170,": "extra_0x87", + "\u110b,\u1171,": "extra_0x87", + "\u110b,\u1172,": "extra_0x87", + "\u110b,\u1173,": "extra_0x87", + "\u110b,\u1174,": "extra_0x87", + "\u110b,\u1175,": "extra_0x87", + "\u110c,\u1161,": "extra_0x87", + "\u110c,\u1162,": "extra_0x87", + "\u110c,\u1163,": "extra_0x87", + "\u110c,\u1164,": "extra_0x87", + "\u110c,\u1165,": "extra_0x87", + "\u110c,\u1166,": "extra_0x87", + "\u110c,\u1167,": "extra_0x87", + "\u110c,\u1168,": "extra_0x87", + "\u110c,\u1169,": "extra_0x87", + "\u110c,\u116a,": "extra_0x87", + "\u110c,\u116b,": "extra_0x87", + "\u110c,\u116c,": "extra_0x87", + "\u110c,\u116d,": "extra_0x87", + "\u110c,\u116e,": "extra_0x87", + "\u110c,\u116f,": "extra_0x87", + "\u110c,\u1170,": "extra_0x87", + "\u110c,\u1171,": "extra_0x87", + "\u110c,\u1172,": "extra_0x87", + "\u110c,\u1173,": "extra_0x87", + "\u110c,\u1174,": "extra_0x87", + "\u110c,\u1175,": "extra_0x87", + "\u110d,\u1161,": "extra_0x87", + "\u110d,\u1162,": "extra_0x87", + "\u110d,\u1163,": "extra_0x87", + "\u110d,\u1164,": "extra_0x87", + "\u110d,\u1165,": "extra_0x87", + "\u110d,\u1166,": "extra_0x87", + "\u110d,\u1167,": "extra_0x87", + "\u110d,\u1168,": "extra_0x87", + "\u110d,\u1169,": "extra_0x87", + "\u110d,\u116a,": "extra_0x87", + "\u110d,\u116b,": "extra_0x87", + "\u110d,\u116c,": "extra_0x87", + "\u110d,\u116d,": "extra_0x87", + "\u110d,\u116e,": "extra_0x87", + "\u110d,\u116f,": "extra_0x87", + "\u110d,\u1170,": "extra_0x87", + "\u110d,\u1171,": "extra_0x87", + "\u110d,\u1172,": "extra_0x87", + "\u110d,\u1173,": "extra_0x87", + "\u110d,\u1174,": "extra_0x87", + "\u110d,\u1175,": "extra_0x87", + "\u110e,\u1161,": "extra_0x87", + "\u110e,\u1162,": "extra_0x87", + "\u110e,\u1163,": "extra_0x87", + "\u110e,\u1164,": "extra_0x87", + "\u110e,\u1165,": "extra_0x87", + "\u110e,\u1166,": "extra_0x87", + "\u110e,\u1167,": "extra_0x87", + "\u110e,\u1168,": "extra_0x87", + "\u110e,\u1169,": "extra_0x87", + "\u110e,\u116a,": "extra_0x87", + "\u110e,\u116b,": "extra_0x87", + "\u110e,\u116c,": "extra_0x87", + "\u110e,\u116d,": "extra_0x87", + "\u110e,\u116e,": "extra_0x87", + "\u110e,\u116f,": "extra_0x87", + "\u110e,\u1170,": "extra_0x87", + "\u110e,\u1171,": "extra_0x87", + "\u110e,\u1172,": "extra_0x87", + "\u110e,\u1173,": "extra_0x87", + "\u110e,\u1174,": "extra_0x87", + "\u110e,\u1175,": "extra_0x87", + "\u110f,\u1161,": "extra_0x87", + "\u110f,\u1162,": "extra_0x87", + "\u110f,\u1163,": "extra_0x87", + "\u110f,\u1164,": "extra_0x87", + "\u110f,\u1165,": "extra_0x87", + "\u110f,\u1166,": "extra_0x87", + "\u110f,\u1167,": "extra_0x87", + "\u110f,\u1168,": "extra_0x87", + "\u110f,\u1169,": "extra_0x87", + "\u110f,\u116a,": "extra_0x87", + "\u110f,\u116b,": "extra_0x87", + "\u110f,\u116c,": "extra_0x87", + "\u110f,\u116d,": "extra_0x87", + "\u110f,\u116e,": "extra_0x87", + "\u110f,\u116f,": "extra_0x87", + "\u110f,\u1170,": "extra_0x87", + "\u110f,\u1171,": "extra_0x87", + "\u110f,\u1172,": "extra_0x87", + "\u110f,\u1173,": "extra_0x87", + "\u110f,\u1174,": "extra_0x87", + "\u110f,\u1175,": "extra_0x87", + "\u1110,\u1161,": "extra_0x87", + "\u1110,\u1162,": "extra_0x87", + "\u1110,\u1163,": "extra_0x87", + "\u1110,\u1164,": "extra_0x87", + "\u1110,\u1165,": "extra_0x87", + "\u1110,\u1166,": "extra_0x87", + "\u1110,\u1167,": "extra_0x87", + "\u1110,\u1168,": "extra_0x87", + "\u1110,\u1169,": "extra_0x87", + "\u1110,\u116a,": "extra_0x87", + "\u1110,\u116b,": "extra_0x87", + "\u1110,\u116c,": "extra_0x87", + "\u1110,\u116d,": "extra_0x87", + "\u1110,\u116e,": "extra_0x87", + "\u1110,\u116f,": "extra_0x87", + "\u1110,\u1170,": "extra_0x87", + "\u1110,\u1171,": "extra_0x87", + "\u1110,\u1172,": "extra_0x87", + "\u1110,\u1173,": "extra_0x87", + "\u1110,\u1174,": "extra_0x87", + "\u1110,\u1175,": "extra_0x87", + "\u1111,\u1161,": "extra_0x87", + "\u1111,\u1162,": "extra_0x87", + "\u1111,\u1163,": "extra_0x87", + "\u1111,\u1164,": "extra_0x87", + "\u1111,\u1165,": "extra_0x87", + "\u1111,\u1166,": "extra_0x87", + "\u1111,\u1167,": "extra_0x87", + "\u1111,\u1168,": "extra_0x87", + "\u1111,\u1169,": "extra_0x87", + "\u1111,\u116a,": "extra_0x87", + "\u1111,\u116b,": "extra_0x87", + "\u1111,\u116c,": "extra_0x87", + "\u1111,\u116d,": "extra_0x87", + "\u1111,\u116e,": "extra_0x87", + "\u1111,\u116f,": "extra_0x87", + "\u1111,\u1170,": "extra_0x87", + "\u1111,\u1171,": "extra_0x87", + "\u1111,\u1172,": "extra_0x87", + "\u1111,\u1173,": "extra_0x87", + "\u1111,\u1174,": "extra_0x87", + "\u1111,\u1175,": "extra_0x87", + "\u1112,\u1161,": "extra_0x87", + "\u1112,\u1162,": "extra_0x87", + "\u1112,\u1163,": "extra_0x87", + "\u1112,\u1164,": "extra_0x87", + "\u1112,\u1165,": "extra_0x87", + "\u1112,\u1166,": "extra_0x87", + "\u1112,\u1167,": "extra_0x87", + "\u1112,\u1168,": "extra_0x87", + "\u1112,\u1169,": "extra_0x87", + "\u1112,\u116a,": "extra_0x87", + "\u1112,\u116b,": "extra_0x87", + "\u1112,\u116c,": "extra_0x87", + "\u1112,\u116d,": "extra_0x87", + "\u1112,\u116e,": "extra_0x87", + "\u1112,\u116f,": "extra_0x87", + "\u1112,\u1170,": "extra_0x87", + "\u1112,\u1171,": "extra_0x87", + "\u1112,\u1172,": "extra_0x87", + "\u1112,\u1173,": "extra_0x87", + "\u1112,\u1174,": "extra_0x87", + "\u1112,\u1175,": "extra_0x87" + } + } + ], + "\u11b8": [ + null, + null, + null, + { + "defaultGlyph": "0xd3", + "alternatives": {} + }, + { + "defaultGlyph": "0xec", + "alternatives": {} + }, + { + "defaultGlyph": "extra_0x88", + "alternatives": { + "\u1103,\u116c,": "extra_0x88", + "\u1100,\u1161,": "extra_0x88", + "\u1100,\u1162,": "extra_0x88", + "\u1100,\u1163,": "extra_0x88", + "\u1100,\u1164,": "extra_0x88", + "\u1100,\u1165,": "extra_0x88", + "\u1100,\u1166,": "extra_0x88", + "\u1100,\u1167,": "extra_0x88", + "\u1100,\u1168,": "extra_0x88", + "\u1100,\u1169,": "extra_0x88", + "\u1100,\u116a,": "extra_0x88", + "\u1100,\u116b,": "extra_0x88", + "\u1100,\u116c,": "extra_0x88", + "\u1100,\u116d,": "extra_0x88", + "\u1100,\u116e,": "extra_0x88", + "\u1100,\u116f,": "extra_0x88", + "\u1100,\u1170,": "extra_0x88", + "\u1100,\u1171,": "extra_0x88", + "\u1100,\u1172,": "extra_0x88", + "\u1100,\u1173,": "extra_0x88", + "\u1100,\u1174,": "extra_0x88", + "\u1100,\u1175,": "extra_0x88", + "\u1101,\u1161,": "extra_0x88", + "\u1101,\u1162,": "extra_0x88", + "\u1101,\u1163,": "extra_0x88", + "\u1101,\u1164,": "extra_0x88", + "\u1101,\u1165,": "extra_0x88", + "\u1101,\u1166,": "extra_0x88", + "\u1101,\u1167,": "extra_0x88", + "\u1101,\u1168,": "extra_0x88", + "\u1101,\u1169,": "extra_0x88", + "\u1101,\u116a,": "extra_0x88", + "\u1101,\u116b,": "extra_0x88", + "\u1101,\u116c,": "extra_0x88", + "\u1101,\u116d,": "extra_0x88", + "\u1101,\u116e,": "extra_0x88", + "\u1101,\u116f,": "extra_0x88", + "\u1101,\u1170,": "extra_0x88", + "\u1101,\u1171,": "extra_0x88", + "\u1101,\u1172,": "extra_0x88", + "\u1101,\u1173,": "extra_0x88", + "\u1101,\u1174,": "extra_0x88", + "\u1101,\u1175,": "extra_0x88", + "\u1102,\u1161,": "extra_0x88", + "\u1102,\u1162,": "extra_0x88", + "\u1102,\u1163,": "extra_0x88", + "\u1102,\u1164,": "extra_0x88", + "\u1102,\u1165,": "extra_0x88", + "\u1102,\u1166,": "extra_0x88", + "\u1102,\u1167,": "extra_0x88", + "\u1102,\u1168,": "extra_0x88", + "\u1102,\u1169,": "extra_0x88", + "\u1102,\u116a,": "extra_0x88", + "\u1102,\u116b,": "extra_0x88", + "\u1102,\u116c,": "extra_0x88", + "\u1102,\u116d,": "extra_0x88", + "\u1102,\u116e,": "extra_0x88", + "\u1102,\u116f,": "extra_0x88", + "\u1102,\u1170,": "extra_0x88", + "\u1102,\u1171,": "extra_0x88", + "\u1102,\u1172,": "extra_0x88", + "\u1102,\u1173,": "extra_0x88", + "\u1102,\u1174,": "extra_0x88", + "\u1102,\u1175,": "extra_0x88", + "\u1103,\u1161,": "extra_0x88", + "\u1103,\u1162,": "extra_0x88", + "\u1103,\u1163,": "extra_0x88", + "\u1103,\u1164,": "extra_0x88", + "\u1103,\u1165,": "extra_0x88", + "\u1103,\u1166,": "extra_0x88", + "\u1103,\u1167,": "extra_0x88", + "\u1103,\u1168,": "extra_0x88", + "\u1103,\u1169,": "extra_0x88", + "\u1103,\u116a,": "extra_0x88", + "\u1103,\u116b,": "extra_0x88", + "\u1103,\u116d,": "extra_0x88", + "\u1103,\u116e,": "extra_0x88", + "\u1103,\u116f,": "extra_0x88", + "\u1103,\u1170,": "extra_0x88", + "\u1103,\u1171,": "extra_0x88", + "\u1103,\u1172,": "extra_0x88", + "\u1103,\u1173,": "extra_0x88", + "\u1103,\u1174,": "extra_0x88", + "\u1103,\u1175,": "extra_0x88", + "\u1104,\u1161,": "extra_0x88", + "\u1104,\u1162,": "extra_0x88", + "\u1104,\u1163,": "extra_0x88", + "\u1104,\u1164,": "extra_0x88", + "\u1104,\u1165,": "extra_0x88", + "\u1104,\u1166,": "extra_0x88", + "\u1104,\u1167,": "extra_0x88", + "\u1104,\u1168,": "extra_0x88", + "\u1104,\u1169,": "extra_0x88", + "\u1104,\u116a,": "extra_0x88", + "\u1104,\u116b,": "extra_0x88", + "\u1104,\u116c,": "extra_0x88", + "\u1104,\u116d,": "extra_0x88", + "\u1104,\u116e,": "extra_0x88", + "\u1104,\u116f,": "extra_0x88", + "\u1104,\u1170,": "extra_0x88", + "\u1104,\u1171,": "extra_0x88", + "\u1104,\u1172,": "extra_0x88", + "\u1104,\u1173,": "extra_0x88", + "\u1104,\u1174,": "extra_0x88", + "\u1104,\u1175,": "extra_0x88", + "\u1105,\u1161,": "extra_0x88", + "\u1105,\u1162,": "extra_0x88", + "\u1105,\u1163,": "extra_0x88", + "\u1105,\u1164,": "extra_0x88", + "\u1105,\u1165,": "extra_0x88", + "\u1105,\u1166,": "extra_0x88", + "\u1105,\u1167,": "extra_0x88", + "\u1105,\u1168,": "extra_0x88", + "\u1105,\u1169,": "extra_0x88", + "\u1105,\u116a,": "extra_0x88", + "\u1105,\u116b,": "extra_0x88", + "\u1105,\u116c,": "extra_0x88", + "\u1105,\u116d,": "extra_0x88", + "\u1105,\u116e,": "extra_0x88", + "\u1105,\u116f,": "extra_0x88", + "\u1105,\u1170,": "extra_0x88", + "\u1105,\u1171,": "extra_0x88", + "\u1105,\u1172,": "extra_0x88", + "\u1105,\u1173,": "extra_0x88", + "\u1105,\u1174,": "extra_0x88", + "\u1105,\u1175,": "extra_0x88", + "\u1106,\u1161,": "extra_0x88", + "\u1106,\u1162,": "extra_0x88", + "\u1106,\u1163,": "extra_0x88", + "\u1106,\u1164,": "extra_0x88", + "\u1106,\u1165,": "extra_0x88", + "\u1106,\u1166,": "extra_0x88", + "\u1106,\u1167,": "extra_0x88", + "\u1106,\u1168,": "extra_0x88", + "\u1106,\u1169,": "extra_0x88", + "\u1106,\u116a,": "extra_0x88", + "\u1106,\u116b,": "extra_0x88", + "\u1106,\u116c,": "extra_0x88", + "\u1106,\u116d,": "extra_0x88", + "\u1106,\u116e,": "extra_0x88", + "\u1106,\u116f,": "extra_0x88", + "\u1106,\u1170,": "extra_0x88", + "\u1106,\u1171,": "extra_0x88", + "\u1106,\u1172,": "extra_0x88", + "\u1106,\u1173,": "extra_0x88", + "\u1106,\u1174,": "extra_0x88", + "\u1106,\u1175,": "extra_0x88", + "\u1107,\u1161,": "extra_0x88", + "\u1107,\u1162,": "extra_0x88", + "\u1107,\u1163,": "extra_0x88", + "\u1107,\u1164,": "extra_0x88", + "\u1107,\u1165,": "extra_0x88", + "\u1107,\u1166,": "extra_0x88", + "\u1107,\u1167,": "extra_0x88", + "\u1107,\u1168,": "extra_0x88", + "\u1107,\u1169,": "extra_0x88", + "\u1107,\u116a,": "extra_0x88", + "\u1107,\u116b,": "extra_0x88", + "\u1107,\u116c,": "extra_0x88", + "\u1107,\u116d,": "extra_0x88", + "\u1107,\u116e,": "extra_0x88", + "\u1107,\u116f,": "extra_0x88", + "\u1107,\u1170,": "extra_0x88", + "\u1107,\u1171,": "extra_0x88", + "\u1107,\u1172,": "extra_0x88", + "\u1107,\u1173,": "extra_0x88", + "\u1107,\u1174,": "extra_0x88", + "\u1107,\u1175,": "extra_0x88", + "\u1108,\u1161,": "extra_0x88", + "\u1108,\u1162,": "extra_0x88", + "\u1108,\u1163,": "extra_0x88", + "\u1108,\u1164,": "extra_0x88", + "\u1108,\u1165,": "extra_0x88", + "\u1108,\u1166,": "extra_0x88", + "\u1108,\u1167,": "extra_0x88", + "\u1108,\u1168,": "extra_0x88", + "\u1108,\u1169,": "extra_0x88", + "\u1108,\u116a,": "extra_0x88", + "\u1108,\u116b,": "extra_0x88", + "\u1108,\u116c,": "extra_0x88", + "\u1108,\u116d,": "extra_0x88", + "\u1108,\u116e,": "extra_0x88", + "\u1108,\u116f,": "extra_0x88", + "\u1108,\u1170,": "extra_0x88", + "\u1108,\u1171,": "extra_0x88", + "\u1108,\u1172,": "extra_0x88", + "\u1108,\u1173,": "extra_0x88", + "\u1108,\u1174,": "extra_0x88", + "\u1108,\u1175,": "extra_0x88", + "\u1109,\u1161,": "extra_0x88", + "\u1109,\u1162,": "extra_0x88", + "\u1109,\u1163,": "extra_0x88", + "\u1109,\u1164,": "extra_0x88", + "\u1109,\u1165,": "extra_0x88", + "\u1109,\u1166,": "extra_0x88", + "\u1109,\u1167,": "extra_0x88", + "\u1109,\u1168,": "extra_0x88", + "\u1109,\u1169,": "extra_0x88", + "\u1109,\u116a,": "extra_0x88", + "\u1109,\u116b,": "extra_0x88", + "\u1109,\u116c,": "extra_0x88", + "\u1109,\u116d,": "extra_0x88", + "\u1109,\u116e,": "extra_0x88", + "\u1109,\u116f,": "extra_0x88", + "\u1109,\u1170,": "extra_0x88", + "\u1109,\u1171,": "extra_0x88", + "\u1109,\u1172,": "extra_0x88", + "\u1109,\u1173,": "extra_0x88", + "\u1109,\u1174,": "extra_0x88", + "\u1109,\u1175,": "extra_0x88", + "\u110a,\u1161,": "extra_0x88", + "\u110a,\u1162,": "extra_0x88", + "\u110a,\u1163,": "extra_0x88", + "\u110a,\u1164,": "extra_0x88", + "\u110a,\u1165,": "extra_0x88", + "\u110a,\u1166,": "extra_0x88", + "\u110a,\u1167,": "extra_0x88", + "\u110a,\u1168,": "extra_0x88", + "\u110a,\u1169,": "extra_0x88", + "\u110a,\u116a,": "extra_0x88", + "\u110a,\u116b,": "extra_0x88", + "\u110a,\u116c,": "extra_0x88", + "\u110a,\u116d,": "extra_0x88", + "\u110a,\u116e,": "extra_0x88", + "\u110a,\u116f,": "extra_0x88", + "\u110a,\u1170,": "extra_0x88", + "\u110a,\u1171,": "extra_0x88", + "\u110a,\u1172,": "extra_0x88", + "\u110a,\u1173,": "extra_0x88", + "\u110a,\u1174,": "extra_0x88", + "\u110a,\u1175,": "extra_0x88", + "\u110b,\u1161,": "extra_0x88", + "\u110b,\u1162,": "extra_0x88", + "\u110b,\u1163,": "extra_0x88", + "\u110b,\u1164,": "extra_0x88", + "\u110b,\u1165,": "extra_0x88", + "\u110b,\u1166,": "extra_0x88", + "\u110b,\u1167,": "extra_0x88", + "\u110b,\u1168,": "extra_0x88", + "\u110b,\u1169,": "extra_0x88", + "\u110b,\u116a,": "extra_0x88", + "\u110b,\u116b,": "extra_0x88", + "\u110b,\u116c,": "extra_0x88", + "\u110b,\u116d,": "extra_0x88", + "\u110b,\u116e,": "extra_0x88", + "\u110b,\u116f,": "extra_0x88", + "\u110b,\u1170,": "extra_0x88", + "\u110b,\u1171,": "extra_0x88", + "\u110b,\u1172,": "extra_0x88", + "\u110b,\u1173,": "extra_0x88", + "\u110b,\u1174,": "extra_0x88", + "\u110b,\u1175,": "extra_0x88", + "\u110c,\u1161,": "extra_0x88", + "\u110c,\u1162,": "extra_0x88", + "\u110c,\u1163,": "extra_0x88", + "\u110c,\u1164,": "extra_0x88", + "\u110c,\u1165,": "extra_0x88", + "\u110c,\u1166,": "extra_0x88", + "\u110c,\u1167,": "extra_0x88", + "\u110c,\u1168,": "extra_0x88", + "\u110c,\u1169,": "extra_0x88", + "\u110c,\u116a,": "extra_0x88", + "\u110c,\u116b,": "extra_0x88", + "\u110c,\u116c,": "extra_0x88", + "\u110c,\u116d,": "extra_0x88", + "\u110c,\u116e,": "extra_0x88", + "\u110c,\u116f,": "extra_0x88", + "\u110c,\u1170,": "extra_0x88", + "\u110c,\u1171,": "extra_0x88", + "\u110c,\u1172,": "extra_0x88", + "\u110c,\u1173,": "extra_0x88", + "\u110c,\u1174,": "extra_0x88", + "\u110c,\u1175,": "extra_0x88", + "\u110d,\u1161,": "extra_0x88", + "\u110d,\u1162,": "extra_0x88", + "\u110d,\u1163,": "extra_0x88", + "\u110d,\u1164,": "extra_0x88", + "\u110d,\u1165,": "extra_0x88", + "\u110d,\u1166,": "extra_0x88", + "\u110d,\u1167,": "extra_0x88", + "\u110d,\u1168,": "extra_0x88", + "\u110d,\u1169,": "extra_0x88", + "\u110d,\u116a,": "extra_0x88", + "\u110d,\u116b,": "extra_0x88", + "\u110d,\u116c,": "extra_0x88", + "\u110d,\u116d,": "extra_0x88", + "\u110d,\u116e,": "extra_0x88", + "\u110d,\u116f,": "extra_0x88", + "\u110d,\u1170,": "extra_0x88", + "\u110d,\u1171,": "extra_0x88", + "\u110d,\u1172,": "extra_0x88", + "\u110d,\u1173,": "extra_0x88", + "\u110d,\u1174,": "extra_0x88", + "\u110d,\u1175,": "extra_0x88", + "\u110e,\u1161,": "extra_0x88", + "\u110e,\u1162,": "extra_0x88", + "\u110e,\u1163,": "extra_0x88", + "\u110e,\u1164,": "extra_0x88", + "\u110e,\u1165,": "extra_0x88", + "\u110e,\u1166,": "extra_0x88", + "\u110e,\u1167,": "extra_0x88", + "\u110e,\u1168,": "extra_0x88", + "\u110e,\u1169,": "extra_0x88", + "\u110e,\u116a,": "extra_0x88", + "\u110e,\u116b,": "extra_0x88", + "\u110e,\u116c,": "extra_0x88", + "\u110e,\u116d,": "extra_0x88", + "\u110e,\u116e,": "extra_0x88", + "\u110e,\u116f,": "extra_0x88", + "\u110e,\u1170,": "extra_0x88", + "\u110e,\u1171,": "extra_0x88", + "\u110e,\u1172,": "extra_0x88", + "\u110e,\u1173,": "extra_0x88", + "\u110e,\u1174,": "extra_0x88", + "\u110e,\u1175,": "extra_0x88", + "\u110f,\u1161,": "extra_0x88", + "\u110f,\u1162,": "extra_0x88", + "\u110f,\u1163,": "extra_0x88", + "\u110f,\u1164,": "extra_0x88", + "\u110f,\u1165,": "extra_0x88", + "\u110f,\u1166,": "extra_0x88", + "\u110f,\u1167,": "extra_0x88", + "\u110f,\u1168,": "extra_0x88", + "\u110f,\u1169,": "extra_0x88", + "\u110f,\u116a,": "extra_0x88", + "\u110f,\u116b,": "extra_0x88", + "\u110f,\u116c,": "extra_0x88", + "\u110f,\u116d,": "extra_0x88", + "\u110f,\u116e,": "extra_0x88", + "\u110f,\u116f,": "extra_0x88", + "\u110f,\u1170,": "extra_0x88", + "\u110f,\u1171,": "extra_0x88", + "\u110f,\u1172,": "extra_0x88", + "\u110f,\u1173,": "extra_0x88", + "\u110f,\u1174,": "extra_0x88", + "\u110f,\u1175,": "extra_0x88", + "\u1110,\u1161,": "extra_0x88", + "\u1110,\u1162,": "extra_0x88", + "\u1110,\u1163,": "extra_0x88", + "\u1110,\u1164,": "extra_0x88", + "\u1110,\u1165,": "extra_0x88", + "\u1110,\u1166,": "extra_0x88", + "\u1110,\u1167,": "extra_0x88", + "\u1110,\u1168,": "extra_0x88", + "\u1110,\u1169,": "extra_0x88", + "\u1110,\u116a,": "extra_0x88", + "\u1110,\u116b,": "extra_0x88", + "\u1110,\u116c,": "extra_0x88", + "\u1110,\u116d,": "extra_0x88", + "\u1110,\u116e,": "extra_0x88", + "\u1110,\u116f,": "extra_0x88", + "\u1110,\u1170,": "extra_0x88", + "\u1110,\u1171,": "extra_0x88", + "\u1110,\u1172,": "extra_0x88", + "\u1110,\u1173,": "extra_0x88", + "\u1110,\u1174,": "extra_0x88", + "\u1110,\u1175,": "extra_0x88", + "\u1111,\u1161,": "extra_0x88", + "\u1111,\u1162,": "extra_0x88", + "\u1111,\u1163,": "extra_0x88", + "\u1111,\u1164,": "extra_0x88", + "\u1111,\u1165,": "extra_0x88", + "\u1111,\u1166,": "extra_0x88", + "\u1111,\u1167,": "extra_0x88", + "\u1111,\u1168,": "extra_0x88", + "\u1111,\u1169,": "extra_0x88", + "\u1111,\u116a,": "extra_0x88", + "\u1111,\u116b,": "extra_0x88", + "\u1111,\u116c,": "extra_0x88", + "\u1111,\u116d,": "extra_0x88", + "\u1111,\u116e,": "extra_0x88", + "\u1111,\u116f,": "extra_0x88", + "\u1111,\u1170,": "extra_0x88", + "\u1111,\u1171,": "extra_0x88", + "\u1111,\u1172,": "extra_0x88", + "\u1111,\u1173,": "extra_0x88", + "\u1111,\u1174,": "extra_0x88", + "\u1111,\u1175,": "extra_0x88", + "\u1112,\u1161,": "extra_0x88", + "\u1112,\u1162,": "extra_0x88", + "\u1112,\u1163,": "extra_0x88", + "\u1112,\u1164,": "extra_0x88", + "\u1112,\u1165,": "extra_0x88", + "\u1112,\u1166,": "extra_0x88", + "\u1112,\u1167,": "extra_0x88", + "\u1112,\u1168,": "extra_0x88", + "\u1112,\u1169,": "extra_0x88", + "\u1112,\u116a,": "extra_0x88", + "\u1112,\u116b,": "extra_0x88", + "\u1112,\u116c,": "extra_0x88", + "\u1112,\u116d,": "extra_0x88", + "\u1112,\u116e,": "extra_0x88", + "\u1112,\u116f,": "extra_0x88", + "\u1112,\u1170,": "extra_0x88", + "\u1112,\u1171,": "extra_0x88", + "\u1112,\u1172,": "extra_0x88", + "\u1112,\u1173,": "extra_0x88", + "\u1112,\u1174,": "extra_0x88", + "\u1112,\u1175,": "extra_0x88" + } + } + ], + "\u11b9": [ + null, + null, + null, + { + "defaultGlyph": "0xd4", + "alternatives": {} + }, + { + "defaultGlyph": "0xd4", + "alternatives": {} + }, + { + "defaultGlyph": "0xd4", + "alternatives": {} + } + ], + "\u11ba": [ + null, + null, + null, + { + "defaultGlyph": "0xd5", + "alternatives": {} + }, + { + "defaultGlyph": "0xed", + "alternatives": {} + }, + { + "defaultGlyph": "extra_0x89", + "alternatives": { + "\u110b,\u116a,": "extra_0x89", + "\u1100,\u1161,": "extra_0x89", + "\u1100,\u1162,": "extra_0x89", + "\u1100,\u1163,": "extra_0x89", + "\u1100,\u1164,": "extra_0x89", + "\u1100,\u1165,": "extra_0x89", + "\u1100,\u1166,": "extra_0x89", + "\u1100,\u1167,": "extra_0x89", + "\u1100,\u1168,": "extra_0x89", + "\u1100,\u1169,": "extra_0x89", + "\u1100,\u116a,": "extra_0x89", + "\u1100,\u116b,": "extra_0x89", + "\u1100,\u116c,": "extra_0x89", + "\u1100,\u116d,": "extra_0x89", + "\u1100,\u116e,": "extra_0x89", + "\u1100,\u116f,": "extra_0x89", + "\u1100,\u1170,": "extra_0x89", + "\u1100,\u1171,": "extra_0x89", + "\u1100,\u1172,": "extra_0x89", + "\u1100,\u1173,": "extra_0x89", + "\u1100,\u1174,": "extra_0x89", + "\u1100,\u1175,": "extra_0x89", + "\u1101,\u1161,": "extra_0x89", + "\u1101,\u1162,": "extra_0x89", + "\u1101,\u1163,": "extra_0x89", + "\u1101,\u1164,": "extra_0x89", + "\u1101,\u1165,": "extra_0x89", + "\u1101,\u1166,": "extra_0x89", + "\u1101,\u1167,": "extra_0x89", + "\u1101,\u1168,": "extra_0x89", + "\u1101,\u1169,": "extra_0x89", + "\u1101,\u116a,": "extra_0x89", + "\u1101,\u116b,": "extra_0x89", + "\u1101,\u116c,": "extra_0x89", + "\u1101,\u116d,": "extra_0x89", + "\u1101,\u116e,": "extra_0x89", + "\u1101,\u116f,": "extra_0x89", + "\u1101,\u1170,": "extra_0x89", + "\u1101,\u1171,": "extra_0x89", + "\u1101,\u1172,": "extra_0x89", + "\u1101,\u1173,": "extra_0x89", + "\u1101,\u1174,": "extra_0x89", + "\u1101,\u1175,": "extra_0x89", + "\u1102,\u1161,": "extra_0x89", + "\u1102,\u1162,": "extra_0x89", + "\u1102,\u1163,": "extra_0x89", + "\u1102,\u1164,": "extra_0x89", + "\u1102,\u1165,": "extra_0x89", + "\u1102,\u1166,": "extra_0x89", + "\u1102,\u1167,": "extra_0x89", + "\u1102,\u1168,": "extra_0x89", + "\u1102,\u1169,": "extra_0x89", + "\u1102,\u116a,": "extra_0x89", + "\u1102,\u116b,": "extra_0x89", + "\u1102,\u116c,": "extra_0x89", + "\u1102,\u116d,": "extra_0x89", + "\u1102,\u116e,": "extra_0x89", + "\u1102,\u116f,": "extra_0x89", + "\u1102,\u1170,": "extra_0x89", + "\u1102,\u1171,": "extra_0x89", + "\u1102,\u1172,": "extra_0x89", + "\u1102,\u1173,": "extra_0x89", + "\u1102,\u1174,": "extra_0x89", + "\u1102,\u1175,": "extra_0x89", + "\u1103,\u1161,": "extra_0x89", + "\u1103,\u1162,": "extra_0x89", + "\u1103,\u1163,": "extra_0x89", + "\u1103,\u1164,": "extra_0x89", + "\u1103,\u1165,": "extra_0x89", + "\u1103,\u1166,": "extra_0x89", + "\u1103,\u1167,": "extra_0x89", + "\u1103,\u1168,": "extra_0x89", + "\u1103,\u1169,": "extra_0x89", + "\u1103,\u116a,": "extra_0x89", + "\u1103,\u116b,": "extra_0x89", + "\u1103,\u116c,": "extra_0x89", + "\u1103,\u116d,": "extra_0x89", + "\u1103,\u116e,": "extra_0x89", + "\u1103,\u116f,": "extra_0x89", + "\u1103,\u1170,": "extra_0x89", + "\u1103,\u1171,": "extra_0x89", + "\u1103,\u1172,": "extra_0x89", + "\u1103,\u1173,": "extra_0x89", + "\u1103,\u1174,": "extra_0x89", + "\u1103,\u1175,": "extra_0x89", + "\u1104,\u1161,": "extra_0x89", + "\u1104,\u1162,": "extra_0x89", + "\u1104,\u1163,": "extra_0x89", + "\u1104,\u1164,": "extra_0x89", + "\u1104,\u1165,": "extra_0x89", + "\u1104,\u1166,": "extra_0x89", + "\u1104,\u1167,": "extra_0x89", + "\u1104,\u1168,": "extra_0x89", + "\u1104,\u1169,": "extra_0x89", + "\u1104,\u116a,": "extra_0x89", + "\u1104,\u116b,": "extra_0x89", + "\u1104,\u116c,": "extra_0x89", + "\u1104,\u116d,": "extra_0x89", + "\u1104,\u116e,": "extra_0x89", + "\u1104,\u116f,": "extra_0x89", + "\u1104,\u1170,": "extra_0x89", + "\u1104,\u1171,": "extra_0x89", + "\u1104,\u1172,": "extra_0x89", + "\u1104,\u1173,": "extra_0x89", + "\u1104,\u1174,": "extra_0x89", + "\u1104,\u1175,": "extra_0x89", + "\u1105,\u1161,": "extra_0x89", + "\u1105,\u1162,": "extra_0x89", + "\u1105,\u1163,": "extra_0x89", + "\u1105,\u1164,": "extra_0x89", + "\u1105,\u1165,": "extra_0x89", + "\u1105,\u1166,": "extra_0x89", + "\u1105,\u1167,": "extra_0x89", + "\u1105,\u1168,": "extra_0x89", + "\u1105,\u1169,": "extra_0x89", + "\u1105,\u116a,": "extra_0x89", + "\u1105,\u116b,": "extra_0x89", + "\u1105,\u116c,": "extra_0x89", + "\u1105,\u116d,": "extra_0x89", + "\u1105,\u116e,": "extra_0x89", + "\u1105,\u116f,": "extra_0x89", + "\u1105,\u1170,": "extra_0x89", + "\u1105,\u1171,": "extra_0x89", + "\u1105,\u1172,": "extra_0x89", + "\u1105,\u1173,": "extra_0x89", + "\u1105,\u1174,": "extra_0x89", + "\u1105,\u1175,": "extra_0x89", + "\u1106,\u1161,": "extra_0x89", + "\u1106,\u1162,": "extra_0x89", + "\u1106,\u1163,": "extra_0x89", + "\u1106,\u1164,": "extra_0x89", + "\u1106,\u1165,": "extra_0x89", + "\u1106,\u1166,": "extra_0x89", + "\u1106,\u1167,": "extra_0x89", + "\u1106,\u1168,": "extra_0x89", + "\u1106,\u1169,": "extra_0x89", + "\u1106,\u116a,": "extra_0x89", + "\u1106,\u116b,": "extra_0x89", + "\u1106,\u116c,": "extra_0x89", + "\u1106,\u116d,": "extra_0x89", + "\u1106,\u116e,": "extra_0x89", + "\u1106,\u116f,": "extra_0x89", + "\u1106,\u1170,": "extra_0x89", + "\u1106,\u1171,": "extra_0x89", + "\u1106,\u1172,": "extra_0x89", + "\u1106,\u1173,": "extra_0x89", + "\u1106,\u1174,": "extra_0x89", + "\u1106,\u1175,": "extra_0x89", + "\u1107,\u1161,": "extra_0x89", + "\u1107,\u1162,": "extra_0x89", + "\u1107,\u1163,": "extra_0x89", + "\u1107,\u1164,": "extra_0x89", + "\u1107,\u1165,": "extra_0x89", + "\u1107,\u1166,": "extra_0x89", + "\u1107,\u1167,": "extra_0x89", + "\u1107,\u1168,": "extra_0x89", + "\u1107,\u1169,": "extra_0x89", + "\u1107,\u116a,": "extra_0x89", + "\u1107,\u116b,": "extra_0x89", + "\u1107,\u116c,": "extra_0x89", + "\u1107,\u116d,": "extra_0x89", + "\u1107,\u116e,": "extra_0x89", + "\u1107,\u116f,": "extra_0x89", + "\u1107,\u1170,": "extra_0x89", + "\u1107,\u1171,": "extra_0x89", + "\u1107,\u1172,": "extra_0x89", + "\u1107,\u1173,": "extra_0x89", + "\u1107,\u1174,": "extra_0x89", + "\u1107,\u1175,": "extra_0x89", + "\u1108,\u1161,": "extra_0x89", + "\u1108,\u1162,": "extra_0x89", + "\u1108,\u1163,": "extra_0x89", + "\u1108,\u1164,": "extra_0x89", + "\u1108,\u1165,": "extra_0x89", + "\u1108,\u1166,": "extra_0x89", + "\u1108,\u1167,": "extra_0x89", + "\u1108,\u1168,": "extra_0x89", + "\u1108,\u1169,": "extra_0x89", + "\u1108,\u116a,": "extra_0x89", + "\u1108,\u116b,": "extra_0x89", + "\u1108,\u116c,": "extra_0x89", + "\u1108,\u116d,": "extra_0x89", + "\u1108,\u116e,": "extra_0x89", + "\u1108,\u116f,": "extra_0x89", + "\u1108,\u1170,": "extra_0x89", + "\u1108,\u1171,": "extra_0x89", + "\u1108,\u1172,": "extra_0x89", + "\u1108,\u1173,": "extra_0x89", + "\u1108,\u1174,": "extra_0x89", + "\u1108,\u1175,": "extra_0x89", + "\u1109,\u1161,": "extra_0x89", + "\u1109,\u1162,": "extra_0x89", + "\u1109,\u1163,": "extra_0x89", + "\u1109,\u1164,": "extra_0x89", + "\u1109,\u1165,": "extra_0x89", + "\u1109,\u1166,": "extra_0x89", + "\u1109,\u1167,": "extra_0x89", + "\u1109,\u1168,": "extra_0x89", + "\u1109,\u1169,": "extra_0x89", + "\u1109,\u116a,": "extra_0x89", + "\u1109,\u116b,": "extra_0x89", + "\u1109,\u116c,": "extra_0x89", + "\u1109,\u116d,": "extra_0x89", + "\u1109,\u116e,": "extra_0x89", + "\u1109,\u116f,": "extra_0x89", + "\u1109,\u1170,": "extra_0x89", + "\u1109,\u1171,": "extra_0x89", + "\u1109,\u1172,": "extra_0x89", + "\u1109,\u1173,": "extra_0x89", + "\u1109,\u1174,": "extra_0x89", + "\u1109,\u1175,": "extra_0x89", + "\u110a,\u1161,": "extra_0x89", + "\u110a,\u1162,": "extra_0x89", + "\u110a,\u1163,": "extra_0x89", + "\u110a,\u1164,": "extra_0x89", + "\u110a,\u1165,": "extra_0x89", + "\u110a,\u1166,": "extra_0x89", + "\u110a,\u1167,": "extra_0x89", + "\u110a,\u1168,": "extra_0x89", + "\u110a,\u1169,": "extra_0x89", + "\u110a,\u116a,": "extra_0x89", + "\u110a,\u116b,": "extra_0x89", + "\u110a,\u116c,": "extra_0x89", + "\u110a,\u116d,": "extra_0x89", + "\u110a,\u116e,": "extra_0x89", + "\u110a,\u116f,": "extra_0x89", + "\u110a,\u1170,": "extra_0x89", + "\u110a,\u1171,": "extra_0x89", + "\u110a,\u1172,": "extra_0x89", + "\u110a,\u1173,": "extra_0x89", + "\u110a,\u1174,": "extra_0x89", + "\u110a,\u1175,": "extra_0x89", + "\u110b,\u1161,": "extra_0x89", + "\u110b,\u1162,": "extra_0x89", + "\u110b,\u1163,": "extra_0x89", + "\u110b,\u1164,": "extra_0x89", + "\u110b,\u1165,": "extra_0x89", + "\u110b,\u1166,": "extra_0x89", + "\u110b,\u1167,": "extra_0x89", + "\u110b,\u1168,": "extra_0x89", + "\u110b,\u1169,": "extra_0x89", + "\u110b,\u116b,": "extra_0x89", + "\u110b,\u116c,": "extra_0x89", + "\u110b,\u116d,": "extra_0x89", + "\u110b,\u116e,": "extra_0x89", + "\u110b,\u116f,": "extra_0x89", + "\u110b,\u1170,": "extra_0x89", + "\u110b,\u1171,": "extra_0x89", + "\u110b,\u1172,": "extra_0x89", + "\u110b,\u1173,": "extra_0x89", + "\u110b,\u1174,": "extra_0x89", + "\u110b,\u1175,": "extra_0x89", + "\u110c,\u1161,": "extra_0x89", + "\u110c,\u1162,": "extra_0x89", + "\u110c,\u1163,": "extra_0x89", + "\u110c,\u1164,": "extra_0x89", + "\u110c,\u1165,": "extra_0x89", + "\u110c,\u1166,": "extra_0x89", + "\u110c,\u1167,": "extra_0x89", + "\u110c,\u1168,": "extra_0x89", + "\u110c,\u1169,": "extra_0x89", + "\u110c,\u116a,": "extra_0x89", + "\u110c,\u116b,": "extra_0x89", + "\u110c,\u116c,": "extra_0x89", + "\u110c,\u116d,": "extra_0x89", + "\u110c,\u116e,": "extra_0x89", + "\u110c,\u116f,": "extra_0x89", + "\u110c,\u1170,": "extra_0x89", + "\u110c,\u1171,": "extra_0x89", + "\u110c,\u1172,": "extra_0x89", + "\u110c,\u1173,": "extra_0x89", + "\u110c,\u1174,": "extra_0x89", + "\u110c,\u1175,": "extra_0x89", + "\u110d,\u1161,": "extra_0x89", + "\u110d,\u1162,": "extra_0x89", + "\u110d,\u1163,": "extra_0x89", + "\u110d,\u1164,": "extra_0x89", + "\u110d,\u1165,": "extra_0x89", + "\u110d,\u1166,": "extra_0x89", + "\u110d,\u1167,": "extra_0x89", + "\u110d,\u1168,": "extra_0x89", + "\u110d,\u1169,": "extra_0x89", + "\u110d,\u116a,": "extra_0x89", + "\u110d,\u116b,": "extra_0x89", + "\u110d,\u116c,": "extra_0x89", + "\u110d,\u116d,": "extra_0x89", + "\u110d,\u116e,": "extra_0x89", + "\u110d,\u116f,": "extra_0x89", + "\u110d,\u1170,": "extra_0x89", + "\u110d,\u1171,": "extra_0x89", + "\u110d,\u1172,": "extra_0x89", + "\u110d,\u1173,": "extra_0x89", + "\u110d,\u1174,": "extra_0x89", + "\u110d,\u1175,": "extra_0x89", + "\u110e,\u1161,": "extra_0x89", + "\u110e,\u1162,": "extra_0x89", + "\u110e,\u1163,": "extra_0x89", + "\u110e,\u1164,": "extra_0x89", + "\u110e,\u1165,": "extra_0x89", + "\u110e,\u1166,": "extra_0x89", + "\u110e,\u1167,": "extra_0x89", + "\u110e,\u1168,": "extra_0x89", + "\u110e,\u1169,": "extra_0x89", + "\u110e,\u116a,": "extra_0x89", + "\u110e,\u116b,": "extra_0x89", + "\u110e,\u116c,": "extra_0x89", + "\u110e,\u116d,": "extra_0x89", + "\u110e,\u116e,": "extra_0x89", + "\u110e,\u116f,": "extra_0x89", + "\u110e,\u1170,": "extra_0x89", + "\u110e,\u1171,": "extra_0x89", + "\u110e,\u1172,": "extra_0x89", + "\u110e,\u1173,": "extra_0x89", + "\u110e,\u1174,": "extra_0x89", + "\u110e,\u1175,": "extra_0x89", + "\u110f,\u1161,": "extra_0x89", + "\u110f,\u1162,": "extra_0x89", + "\u110f,\u1163,": "extra_0x89", + "\u110f,\u1164,": "extra_0x89", + "\u110f,\u1165,": "extra_0x89", + "\u110f,\u1166,": "extra_0x89", + "\u110f,\u1167,": "extra_0x89", + "\u110f,\u1168,": "extra_0x89", + "\u110f,\u1169,": "extra_0x89", + "\u110f,\u116a,": "extra_0x89", + "\u110f,\u116b,": "extra_0x89", + "\u110f,\u116c,": "extra_0x89", + "\u110f,\u116d,": "extra_0x89", + "\u110f,\u116e,": "extra_0x89", + "\u110f,\u116f,": "extra_0x89", + "\u110f,\u1170,": "extra_0x89", + "\u110f,\u1171,": "extra_0x89", + "\u110f,\u1172,": "extra_0x89", + "\u110f,\u1173,": "extra_0x89", + "\u110f,\u1174,": "extra_0x89", + "\u110f,\u1175,": "extra_0x89", + "\u1110,\u1161,": "extra_0x89", + "\u1110,\u1162,": "extra_0x89", + "\u1110,\u1163,": "extra_0x89", + "\u1110,\u1164,": "extra_0x89", + "\u1110,\u1165,": "extra_0x89", + "\u1110,\u1166,": "extra_0x89", + "\u1110,\u1167,": "extra_0x89", + "\u1110,\u1168,": "extra_0x89", + "\u1110,\u1169,": "extra_0x89", + "\u1110,\u116a,": "extra_0x89", + "\u1110,\u116b,": "extra_0x89", + "\u1110,\u116c,": "extra_0x89", + "\u1110,\u116d,": "extra_0x89", + "\u1110,\u116e,": "extra_0x89", + "\u1110,\u116f,": "extra_0x89", + "\u1110,\u1170,": "extra_0x89", + "\u1110,\u1171,": "extra_0x89", + "\u1110,\u1172,": "extra_0x89", + "\u1110,\u1173,": "extra_0x89", + "\u1110,\u1174,": "extra_0x89", + "\u1110,\u1175,": "extra_0x89", + "\u1111,\u1161,": "extra_0x89", + "\u1111,\u1162,": "extra_0x89", + "\u1111,\u1163,": "extra_0x89", + "\u1111,\u1164,": "extra_0x89", + "\u1111,\u1165,": "extra_0x89", + "\u1111,\u1166,": "extra_0x89", + "\u1111,\u1167,": "extra_0x89", + "\u1111,\u1168,": "extra_0x89", + "\u1111,\u1169,": "extra_0x89", + "\u1111,\u116a,": "extra_0x89", + "\u1111,\u116b,": "extra_0x89", + "\u1111,\u116c,": "extra_0x89", + "\u1111,\u116d,": "extra_0x89", + "\u1111,\u116e,": "extra_0x89", + "\u1111,\u116f,": "extra_0x89", + "\u1111,\u1170,": "extra_0x89", + "\u1111,\u1171,": "extra_0x89", + "\u1111,\u1172,": "extra_0x89", + "\u1111,\u1173,": "extra_0x89", + "\u1111,\u1174,": "extra_0x89", + "\u1111,\u1175,": "extra_0x89", + "\u1112,\u1161,": "extra_0x89", + "\u1112,\u1162,": "extra_0x89", + "\u1112,\u1163,": "extra_0x89", + "\u1112,\u1164,": "extra_0x89", + "\u1112,\u1165,": "extra_0x89", + "\u1112,\u1166,": "extra_0x89", + "\u1112,\u1167,": "extra_0x89", + "\u1112,\u1168,": "extra_0x89", + "\u1112,\u1169,": "extra_0x89", + "\u1112,\u116a,": "extra_0x89", + "\u1112,\u116b,": "extra_0x89", + "\u1112,\u116c,": "extra_0x89", + "\u1112,\u116d,": "extra_0x89", + "\u1112,\u116e,": "extra_0x89", + "\u1112,\u116f,": "extra_0x89", + "\u1112,\u1170,": "extra_0x89", + "\u1112,\u1171,": "extra_0x89", + "\u1112,\u1172,": "extra_0x89", + "\u1112,\u1173,": "extra_0x89", + "\u1112,\u1174,": "extra_0x89", + "\u1112,\u1175,": "extra_0x89" + } + } + ], + "\u11bb": [ + null, + null, + null, + { + "defaultGlyph": "0xd6", + "alternatives": {} + }, + { + "defaultGlyph": "0xfc", + "alternatives": {} + }, + { + "defaultGlyph": "0xfc", + "alternatives": { + "\u110c,\u116f,": "extra_0x8a", + "\u110b,\u116f,": "extra_0x8a", + "\u1100,\u1161,": "extra_0x8a", + "\u1100,\u1162,": "extra_0x8a", + "\u1100,\u1163,": "extra_0x8a", + "\u1100,\u1164,": "extra_0x8a", + "\u1100,\u1165,": "extra_0x8a", + "\u1100,\u1166,": "extra_0x8a", + "\u1100,\u1167,": "extra_0x8a", + "\u1100,\u1168,": "extra_0x8a", + "\u1100,\u1169,": "extra_0x8a", + "\u1100,\u116a,": "extra_0x8a", + "\u1100,\u116b,": "extra_0x8a", + "\u1100,\u116c,": "extra_0x8a", + "\u1100,\u116d,": "extra_0x8a", + "\u1100,\u116e,": "extra_0x8a", + "\u1100,\u116f,": "extra_0x8a", + "\u1100,\u1170,": "extra_0x8a", + "\u1100,\u1171,": "extra_0x8a", + "\u1100,\u1172,": "extra_0x8a", + "\u1100,\u1173,": "extra_0x8a", + "\u1100,\u1174,": "extra_0x8a", + "\u1100,\u1175,": "extra_0x8a", + "\u1101,\u1161,": "extra_0x8a", + "\u1101,\u1162,": "extra_0x8a", + "\u1101,\u1163,": "extra_0x8a", + "\u1101,\u1164,": "extra_0x8a", + "\u1101,\u1165,": "extra_0x8a", + "\u1101,\u1166,": "extra_0x8a", + "\u1101,\u1167,": "extra_0x8a", + "\u1101,\u1168,": "extra_0x8a", + "\u1101,\u1169,": "extra_0x8a", + "\u1101,\u116a,": "extra_0x8a", + "\u1101,\u116b,": "extra_0x8a", + "\u1101,\u116c,": "extra_0x8a", + "\u1101,\u116d,": "extra_0x8a", + "\u1101,\u116e,": "extra_0x8a", + "\u1101,\u116f,": "extra_0x8a", + "\u1101,\u1170,": "extra_0x8a", + "\u1101,\u1171,": "extra_0x8a", + "\u1101,\u1172,": "extra_0x8a", + "\u1101,\u1173,": "extra_0x8a", + "\u1101,\u1174,": "extra_0x8a", + "\u1101,\u1175,": "extra_0x8a", + "\u1102,\u1161,": "extra_0x8a", + "\u1102,\u1162,": "extra_0x8a", + "\u1102,\u1163,": "extra_0x8a", + "\u1102,\u1164,": "extra_0x8a", + "\u1102,\u1165,": "extra_0x8a", + "\u1102,\u1166,": "extra_0x8a", + "\u1102,\u1167,": "extra_0x8a", + "\u1102,\u1168,": "extra_0x8a", + "\u1102,\u1169,": "extra_0x8a", + "\u1102,\u116a,": "extra_0x8a", + "\u1102,\u116b,": "extra_0x8a", + "\u1102,\u116c,": "extra_0x8a", + "\u1102,\u116d,": "extra_0x8a", + "\u1102,\u116e,": "extra_0x8a", + "\u1102,\u116f,": "extra_0x8a", + "\u1102,\u1170,": "extra_0x8a", + "\u1102,\u1171,": "extra_0x8a", + "\u1102,\u1172,": "extra_0x8a", + "\u1102,\u1173,": "extra_0x8a", + "\u1102,\u1174,": "extra_0x8a", + "\u1102,\u1175,": "extra_0x8a", + "\u1103,\u1161,": "extra_0x8a", + "\u1103,\u1162,": "extra_0x8a", + "\u1103,\u1163,": "extra_0x8a", + "\u1103,\u1164,": "extra_0x8a", + "\u1103,\u1165,": "extra_0x8a", + "\u1103,\u1166,": "extra_0x8a", + "\u1103,\u1167,": "extra_0x8a", + "\u1103,\u1168,": "extra_0x8a", + "\u1103,\u1169,": "extra_0x8a", + "\u1103,\u116a,": "extra_0x8a", + "\u1103,\u116b,": "extra_0x8a", + "\u1103,\u116c,": "extra_0x8a", + "\u1103,\u116d,": "extra_0x8a", + "\u1103,\u116e,": "extra_0x8a", + "\u1103,\u116f,": "extra_0x8a", + "\u1103,\u1170,": "extra_0x8a", + "\u1103,\u1171,": "extra_0x8a", + "\u1103,\u1172,": "extra_0x8a", + "\u1103,\u1173,": "extra_0x8a", + "\u1103,\u1174,": "extra_0x8a", + "\u1103,\u1175,": "extra_0x8a", + "\u1104,\u1161,": "extra_0x8a", + "\u1104,\u1162,": "extra_0x8a", + "\u1104,\u1163,": "extra_0x8a", + "\u1104,\u1164,": "extra_0x8a", + "\u1104,\u1165,": "extra_0x8a", + "\u1104,\u1166,": "extra_0x8a", + "\u1104,\u1167,": "extra_0x8a", + "\u1104,\u1168,": "extra_0x8a", + "\u1104,\u1169,": "extra_0x8a", + "\u1104,\u116a,": "extra_0x8a", + "\u1104,\u116b,": "extra_0x8a", + "\u1104,\u116c,": "extra_0x8a", + "\u1104,\u116d,": "extra_0x8a", + "\u1104,\u116e,": "extra_0x8a", + "\u1104,\u116f,": "extra_0x8a", + "\u1104,\u1170,": "extra_0x8a", + "\u1104,\u1171,": "extra_0x8a", + "\u1104,\u1172,": "extra_0x8a", + "\u1104,\u1173,": "extra_0x8a", + "\u1104,\u1174,": "extra_0x8a", + "\u1104,\u1175,": "extra_0x8a", + "\u1105,\u1161,": "extra_0x8a", + "\u1105,\u1162,": "extra_0x8a", + "\u1105,\u1163,": "extra_0x8a", + "\u1105,\u1164,": "extra_0x8a", + "\u1105,\u1165,": "extra_0x8a", + "\u1105,\u1166,": "extra_0x8a", + "\u1105,\u1167,": "extra_0x8a", + "\u1105,\u1168,": "extra_0x8a", + "\u1105,\u1169,": "extra_0x8a", + "\u1105,\u116a,": "extra_0x8a", + "\u1105,\u116b,": "extra_0x8a", + "\u1105,\u116c,": "extra_0x8a", + "\u1105,\u116d,": "extra_0x8a", + "\u1105,\u116e,": "extra_0x8a", + "\u1105,\u116f,": "extra_0x8a", + "\u1105,\u1170,": "extra_0x8a", + "\u1105,\u1171,": "extra_0x8a", + "\u1105,\u1172,": "extra_0x8a", + "\u1105,\u1173,": "extra_0x8a", + "\u1105,\u1174,": "extra_0x8a", + "\u1105,\u1175,": "extra_0x8a", + "\u1106,\u1161,": "extra_0x8a", + "\u1106,\u1162,": "extra_0x8a", + "\u1106,\u1163,": "extra_0x8a", + "\u1106,\u1164,": "extra_0x8a", + "\u1106,\u1165,": "extra_0x8a", + "\u1106,\u1166,": "extra_0x8a", + "\u1106,\u1167,": "extra_0x8a", + "\u1106,\u1168,": "extra_0x8a", + "\u1106,\u1169,": "extra_0x8a", + "\u1106,\u116a,": "extra_0x8a", + "\u1106,\u116b,": "extra_0x8a", + "\u1106,\u116c,": "extra_0x8a", + "\u1106,\u116d,": "extra_0x8a", + "\u1106,\u116e,": "extra_0x8a", + "\u1106,\u116f,": "extra_0x8a", + "\u1106,\u1170,": "extra_0x8a", + "\u1106,\u1171,": "extra_0x8a", + "\u1106,\u1172,": "extra_0x8a", + "\u1106,\u1173,": "extra_0x8a", + "\u1106,\u1174,": "extra_0x8a", + "\u1106,\u1175,": "extra_0x8a", + "\u1107,\u1161,": "extra_0x8a", + "\u1107,\u1162,": "extra_0x8a", + "\u1107,\u1163,": "extra_0x8a", + "\u1107,\u1164,": "extra_0x8a", + "\u1107,\u1165,": "extra_0x8a", + "\u1107,\u1166,": "extra_0x8a", + "\u1107,\u1167,": "extra_0x8a", + "\u1107,\u1168,": "extra_0x8a", + "\u1107,\u1169,": "extra_0x8a", + "\u1107,\u116a,": "extra_0x8a", + "\u1107,\u116b,": "extra_0x8a", + "\u1107,\u116c,": "extra_0x8a", + "\u1107,\u116d,": "extra_0x8a", + "\u1107,\u116e,": "extra_0x8a", + "\u1107,\u116f,": "extra_0x8a", + "\u1107,\u1170,": "extra_0x8a", + "\u1107,\u1171,": "extra_0x8a", + "\u1107,\u1172,": "extra_0x8a", + "\u1107,\u1173,": "extra_0x8a", + "\u1107,\u1174,": "extra_0x8a", + "\u1107,\u1175,": "extra_0x8a", + "\u1108,\u1161,": "extra_0x8a", + "\u1108,\u1162,": "extra_0x8a", + "\u1108,\u1163,": "extra_0x8a", + "\u1108,\u1164,": "extra_0x8a", + "\u1108,\u1165,": "extra_0x8a", + "\u1108,\u1166,": "extra_0x8a", + "\u1108,\u1167,": "extra_0x8a", + "\u1108,\u1168,": "extra_0x8a", + "\u1108,\u1169,": "extra_0x8a", + "\u1108,\u116a,": "extra_0x8a", + "\u1108,\u116b,": "extra_0x8a", + "\u1108,\u116c,": "extra_0x8a", + "\u1108,\u116d,": "extra_0x8a", + "\u1108,\u116e,": "extra_0x8a", + "\u1108,\u116f,": "extra_0x8a", + "\u1108,\u1170,": "extra_0x8a", + "\u1108,\u1171,": "extra_0x8a", + "\u1108,\u1172,": "extra_0x8a", + "\u1108,\u1173,": "extra_0x8a", + "\u1108,\u1174,": "extra_0x8a", + "\u1108,\u1175,": "extra_0x8a", + "\u1109,\u1161,": "extra_0x8a", + "\u1109,\u1162,": "extra_0x8a", + "\u1109,\u1163,": "extra_0x8a", + "\u1109,\u1164,": "extra_0x8a", + "\u1109,\u1165,": "extra_0x8a", + "\u1109,\u1166,": "extra_0x8a", + "\u1109,\u1167,": "extra_0x8a", + "\u1109,\u1168,": "extra_0x8a", + "\u1109,\u1169,": "extra_0x8a", + "\u1109,\u116a,": "extra_0x8a", + "\u1109,\u116b,": "extra_0x8a", + "\u1109,\u116c,": "extra_0x8a", + "\u1109,\u116d,": "extra_0x8a", + "\u1109,\u116e,": "extra_0x8a", + "\u1109,\u116f,": "extra_0x8a", + "\u1109,\u1170,": "extra_0x8a", + "\u1109,\u1171,": "extra_0x8a", + "\u1109,\u1172,": "extra_0x8a", + "\u1109,\u1173,": "extra_0x8a", + "\u1109,\u1174,": "extra_0x8a", + "\u1109,\u1175,": "extra_0x8a", + "\u110a,\u1161,": "extra_0x8a", + "\u110a,\u1162,": "extra_0x8a", + "\u110a,\u1163,": "extra_0x8a", + "\u110a,\u1164,": "extra_0x8a", + "\u110a,\u1165,": "extra_0x8a", + "\u110a,\u1166,": "extra_0x8a", + "\u110a,\u1167,": "extra_0x8a", + "\u110a,\u1168,": "extra_0x8a", + "\u110a,\u1169,": "extra_0x8a", + "\u110a,\u116a,": "extra_0x8a", + "\u110a,\u116b,": "extra_0x8a", + "\u110a,\u116c,": "extra_0x8a", + "\u110a,\u116d,": "extra_0x8a", + "\u110a,\u116e,": "extra_0x8a", + "\u110a,\u116f,": "extra_0x8a", + "\u110a,\u1170,": "extra_0x8a", + "\u110a,\u1171,": "extra_0x8a", + "\u110a,\u1172,": "extra_0x8a", + "\u110a,\u1173,": "extra_0x8a", + "\u110a,\u1174,": "extra_0x8a", + "\u110a,\u1175,": "extra_0x8a", + "\u110b,\u1161,": "extra_0x8a", + "\u110b,\u1162,": "extra_0x8a", + "\u110b,\u1163,": "extra_0x8a", + "\u110b,\u1164,": "extra_0x8a", + "\u110b,\u1165,": "extra_0x8a", + "\u110b,\u1166,": "extra_0x8a", + "\u110b,\u1167,": "extra_0x8a", + "\u110b,\u1168,": "extra_0x8a", + "\u110b,\u1169,": "extra_0x8a", + "\u110b,\u116a,": "extra_0x8a", + "\u110b,\u116b,": "extra_0x8a", + "\u110b,\u116c,": "extra_0x8a", + "\u110b,\u116d,": "extra_0x8a", + "\u110b,\u116e,": "extra_0x8a", + "\u110b,\u1170,": "extra_0x8a", + "\u110b,\u1171,": "extra_0x8a", + "\u110b,\u1172,": "extra_0x8a", + "\u110b,\u1173,": "extra_0x8a", + "\u110b,\u1174,": "extra_0x8a", + "\u110b,\u1175,": "extra_0x8a", + "\u110c,\u1161,": "extra_0x8a", + "\u110c,\u1162,": "extra_0x8a", + "\u110c,\u1163,": "extra_0x8a", + "\u110c,\u1164,": "extra_0x8a", + "\u110c,\u1165,": "extra_0x8a", + "\u110c,\u1166,": "extra_0x8a", + "\u110c,\u1167,": "extra_0x8a", + "\u110c,\u1168,": "extra_0x8a", + "\u110c,\u1169,": "extra_0x8a", + "\u110c,\u116a,": "extra_0x8a", + "\u110c,\u116b,": "extra_0x8a", + "\u110c,\u116c,": "extra_0x8a", + "\u110c,\u116d,": "extra_0x8a", + "\u110c,\u116e,": "extra_0x8a", + "\u110c,\u1170,": "extra_0x8a", + "\u110c,\u1171,": "extra_0x8a", + "\u110c,\u1172,": "extra_0x8a", + "\u110c,\u1173,": "extra_0x8a", + "\u110c,\u1174,": "extra_0x8a", + "\u110c,\u1175,": "extra_0x8a", + "\u110d,\u1161,": "extra_0x8a", + "\u110d,\u1162,": "extra_0x8a", + "\u110d,\u1163,": "extra_0x8a", + "\u110d,\u1164,": "extra_0x8a", + "\u110d,\u1165,": "extra_0x8a", + "\u110d,\u1166,": "extra_0x8a", + "\u110d,\u1167,": "extra_0x8a", + "\u110d,\u1168,": "extra_0x8a", + "\u110d,\u1169,": "extra_0x8a", + "\u110d,\u116a,": "extra_0x8a", + "\u110d,\u116b,": "extra_0x8a", + "\u110d,\u116c,": "extra_0x8a", + "\u110d,\u116d,": "extra_0x8a", + "\u110d,\u116e,": "extra_0x8a", + "\u110d,\u116f,": "extra_0x8a", + "\u110d,\u1170,": "extra_0x8a", + "\u110d,\u1171,": "extra_0x8a", + "\u110d,\u1172,": "extra_0x8a", + "\u110d,\u1173,": "extra_0x8a", + "\u110d,\u1174,": "extra_0x8a", + "\u110d,\u1175,": "extra_0x8a", + "\u110e,\u1161,": "extra_0x8a", + "\u110e,\u1162,": "extra_0x8a", + "\u110e,\u1163,": "extra_0x8a", + "\u110e,\u1164,": "extra_0x8a", + "\u110e,\u1165,": "extra_0x8a", + "\u110e,\u1166,": "extra_0x8a", + "\u110e,\u1167,": "extra_0x8a", + "\u110e,\u1168,": "extra_0x8a", + "\u110e,\u1169,": "extra_0x8a", + "\u110e,\u116a,": "extra_0x8a", + "\u110e,\u116b,": "extra_0x8a", + "\u110e,\u116c,": "extra_0x8a", + "\u110e,\u116d,": "extra_0x8a", + "\u110e,\u116e,": "extra_0x8a", + "\u110e,\u116f,": "extra_0x8a", + "\u110e,\u1170,": "extra_0x8a", + "\u110e,\u1171,": "extra_0x8a", + "\u110e,\u1172,": "extra_0x8a", + "\u110e,\u1173,": "extra_0x8a", + "\u110e,\u1174,": "extra_0x8a", + "\u110e,\u1175,": "extra_0x8a", + "\u110f,\u1161,": "extra_0x8a", + "\u110f,\u1162,": "extra_0x8a", + "\u110f,\u1163,": "extra_0x8a", + "\u110f,\u1164,": "extra_0x8a", + "\u110f,\u1165,": "extra_0x8a", + "\u110f,\u1166,": "extra_0x8a", + "\u110f,\u1167,": "extra_0x8a", + "\u110f,\u1168,": "extra_0x8a", + "\u110f,\u1169,": "extra_0x8a", + "\u110f,\u116a,": "extra_0x8a", + "\u110f,\u116b,": "extra_0x8a", + "\u110f,\u116c,": "extra_0x8a", + "\u110f,\u116d,": "extra_0x8a", + "\u110f,\u116e,": "extra_0x8a", + "\u110f,\u116f,": "extra_0x8a", + "\u110f,\u1170,": "extra_0x8a", + "\u110f,\u1171,": "extra_0x8a", + "\u110f,\u1172,": "extra_0x8a", + "\u110f,\u1173,": "extra_0x8a", + "\u110f,\u1174,": "extra_0x8a", + "\u110f,\u1175,": "extra_0x8a", + "\u1110,\u1161,": "extra_0x8a", + "\u1110,\u1162,": "extra_0x8a", + "\u1110,\u1163,": "extra_0x8a", + "\u1110,\u1164,": "extra_0x8a", + "\u1110,\u1165,": "extra_0x8a", + "\u1110,\u1166,": "extra_0x8a", + "\u1110,\u1167,": "extra_0x8a", + "\u1110,\u1168,": "extra_0x8a", + "\u1110,\u1169,": "extra_0x8a", + "\u1110,\u116a,": "extra_0x8a", + "\u1110,\u116b,": "extra_0x8a", + "\u1110,\u116c,": "extra_0x8a", + "\u1110,\u116d,": "extra_0x8a", + "\u1110,\u116e,": "extra_0x8a", + "\u1110,\u116f,": "extra_0x8a", + "\u1110,\u1170,": "extra_0x8a", + "\u1110,\u1171,": "extra_0x8a", + "\u1110,\u1172,": "extra_0x8a", + "\u1110,\u1173,": "extra_0x8a", + "\u1110,\u1174,": "extra_0x8a", + "\u1110,\u1175,": "extra_0x8a", + "\u1111,\u1161,": "extra_0x8a", + "\u1111,\u1162,": "extra_0x8a", + "\u1111,\u1163,": "extra_0x8a", + "\u1111,\u1164,": "extra_0x8a", + "\u1111,\u1165,": "extra_0x8a", + "\u1111,\u1166,": "extra_0x8a", + "\u1111,\u1167,": "extra_0x8a", + "\u1111,\u1168,": "extra_0x8a", + "\u1111,\u1169,": "extra_0x8a", + "\u1111,\u116a,": "extra_0x8a", + "\u1111,\u116b,": "extra_0x8a", + "\u1111,\u116c,": "extra_0x8a", + "\u1111,\u116d,": "extra_0x8a", + "\u1111,\u116e,": "extra_0x8a", + "\u1111,\u116f,": "extra_0x8a", + "\u1111,\u1170,": "extra_0x8a", + "\u1111,\u1171,": "extra_0x8a", + "\u1111,\u1172,": "extra_0x8a", + "\u1111,\u1173,": "extra_0x8a", + "\u1111,\u1174,": "extra_0x8a", + "\u1111,\u1175,": "extra_0x8a", + "\u1112,\u1161,": "extra_0x8a", + "\u1112,\u1162,": "extra_0x8a", + "\u1112,\u1163,": "extra_0x8a", + "\u1112,\u1164,": "extra_0x8a", + "\u1112,\u1165,": "extra_0x8a", + "\u1112,\u1166,": "extra_0x8a", + "\u1112,\u1167,": "extra_0x8a", + "\u1112,\u1168,": "extra_0x8a", + "\u1112,\u1169,": "extra_0x8a", + "\u1112,\u116a,": "extra_0x8a", + "\u1112,\u116b,": "extra_0x8a", + "\u1112,\u116c,": "extra_0x8a", + "\u1112,\u116d,": "extra_0x8a", + "\u1112,\u116e,": "extra_0x8a", + "\u1112,\u116f,": "extra_0x8a", + "\u1112,\u1170,": "extra_0x8a", + "\u1112,\u1171,": "extra_0x8a", + "\u1112,\u1172,": "extra_0x8a", + "\u1112,\u1173,": "extra_0x8a", + "\u1112,\u1174,": "extra_0x8a", + "\u1112,\u1175,": "extra_0x8a" + } + } + ], + "\u11bc": [ + null, + null, + null, + { + "defaultGlyph": "0xd7", + "alternatives": {} + }, + { + "defaultGlyph": "0xee", + "alternatives": {} + }, + { + "defaultGlyph": "0xfd", + "alternatives": { + "\u1100,\u1161,": "extra_0x8b", + "\u1100,\u1162,": "extra_0x8b", + "\u1100,\u1163,": "extra_0x8b", + "\u1100,\u1164,": "extra_0x8b", + "\u1100,\u1165,": "extra_0x8b", + "\u1100,\u1166,": "extra_0x8b", + "\u1100,\u1167,": "extra_0x8b", + "\u1100,\u1168,": "extra_0x8b", + "\u1100,\u1169,": "extra_0x8b", + "\u1100,\u116a,": "extra_0x8b", + "\u1100,\u116b,": "extra_0x8b", + "\u1100,\u116c,": "extra_0x8b", + "\u1100,\u116d,": "extra_0x8b", + "\u1100,\u116e,": "extra_0x8b", + "\u1100,\u116f,": "extra_0x8b", + "\u1100,\u1170,": "extra_0x8b", + "\u1100,\u1171,": "extra_0x8b", + "\u1100,\u1172,": "extra_0x8b", + "\u1100,\u1173,": "extra_0x8b", + "\u1100,\u1174,": "extra_0x8b", + "\u1100,\u1175,": "extra_0x8b", + "\u1101,\u1161,": "extra_0x8b", + "\u1101,\u1162,": "extra_0x8b", + "\u1101,\u1163,": "extra_0x8b", + "\u1101,\u1164,": "extra_0x8b", + "\u1101,\u1165,": "extra_0x8b", + "\u1101,\u1166,": "extra_0x8b", + "\u1101,\u1167,": "extra_0x8b", + "\u1101,\u1168,": "extra_0x8b", + "\u1101,\u1169,": "extra_0x8b", + "\u1101,\u116a,": "extra_0x8b", + "\u1101,\u116b,": "extra_0x8b", + "\u1101,\u116c,": "extra_0x8b", + "\u1101,\u116d,": "extra_0x8b", + "\u1101,\u116e,": "extra_0x8b", + "\u1101,\u116f,": "extra_0x8b", + "\u1101,\u1170,": "extra_0x8b", + "\u1101,\u1171,": "extra_0x8b", + "\u1101,\u1172,": "extra_0x8b", + "\u1101,\u1173,": "extra_0x8b", + "\u1101,\u1174,": "extra_0x8b", + "\u1101,\u1175,": "extra_0x8b", + "\u1102,\u1161,": "extra_0x8b", + "\u1102,\u1162,": "extra_0x8b", + "\u1102,\u1163,": "extra_0x8b", + "\u1102,\u1164,": "extra_0x8b", + "\u1102,\u1165,": "extra_0x8b", + "\u1102,\u1166,": "extra_0x8b", + "\u1102,\u1167,": "extra_0x8b", + "\u1102,\u1168,": "extra_0x8b", + "\u1102,\u1169,": "extra_0x8b", + "\u1102,\u116a,": "extra_0x8b", + "\u1102,\u116b,": "extra_0x8b", + "\u1102,\u116c,": "extra_0x8b", + "\u1102,\u116d,": "extra_0x8b", + "\u1102,\u116e,": "extra_0x8b", + "\u1102,\u116f,": "extra_0x8b", + "\u1102,\u1170,": "extra_0x8b", + "\u1102,\u1171,": "extra_0x8b", + "\u1102,\u1172,": "extra_0x8b", + "\u1102,\u1173,": "extra_0x8b", + "\u1102,\u1174,": "extra_0x8b", + "\u1102,\u1175,": "extra_0x8b", + "\u1103,\u1161,": "extra_0x8b", + "\u1103,\u1162,": "extra_0x8b", + "\u1103,\u1163,": "extra_0x8b", + "\u1103,\u1164,": "extra_0x8b", + "\u1103,\u1165,": "extra_0x8b", + "\u1103,\u1166,": "extra_0x8b", + "\u1103,\u1167,": "extra_0x8b", + "\u1103,\u1168,": "extra_0x8b", + "\u1103,\u1169,": "extra_0x8b", + "\u1103,\u116a,": "extra_0x8b", + "\u1103,\u116b,": "extra_0x8b", + "\u1103,\u116c,": "extra_0x8b", + "\u1103,\u116d,": "extra_0x8b", + "\u1103,\u116e,": "extra_0x8b", + "\u1103,\u116f,": "extra_0x8b", + "\u1103,\u1170,": "extra_0x8b", + "\u1103,\u1171,": "extra_0x8b", + "\u1103,\u1172,": "extra_0x8b", + "\u1103,\u1173,": "extra_0x8b", + "\u1103,\u1174,": "extra_0x8b", + "\u1103,\u1175,": "extra_0x8b", + "\u1104,\u1161,": "extra_0x8b", + "\u1104,\u1162,": "extra_0x8b", + "\u1104,\u1163,": "extra_0x8b", + "\u1104,\u1164,": "extra_0x8b", + "\u1104,\u1165,": "extra_0x8b", + "\u1104,\u1166,": "extra_0x8b", + "\u1104,\u1167,": "extra_0x8b", + "\u1104,\u1168,": "extra_0x8b", + "\u1104,\u1169,": "extra_0x8b", + "\u1104,\u116a,": "extra_0x8b", + "\u1104,\u116b,": "extra_0x8b", + "\u1104,\u116c,": "extra_0x8b", + "\u1104,\u116d,": "extra_0x8b", + "\u1104,\u116e,": "extra_0x8b", + "\u1104,\u116f,": "extra_0x8b", + "\u1104,\u1170,": "extra_0x8b", + "\u1104,\u1171,": "extra_0x8b", + "\u1104,\u1172,": "extra_0x8b", + "\u1104,\u1173,": "extra_0x8b", + "\u1104,\u1174,": "extra_0x8b", + "\u1104,\u1175,": "extra_0x8b", + "\u1105,\u1161,": "extra_0x8b", + "\u1105,\u1162,": "extra_0x8b", + "\u1105,\u1163,": "extra_0x8b", + "\u1105,\u1164,": "extra_0x8b", + "\u1105,\u1165,": "extra_0x8b", + "\u1105,\u1166,": "extra_0x8b", + "\u1105,\u1167,": "extra_0x8b", + "\u1105,\u1168,": "extra_0x8b", + "\u1105,\u1169,": "extra_0x8b", + "\u1105,\u116a,": "extra_0x8b", + "\u1105,\u116b,": "extra_0x8b", + "\u1105,\u116c,": "extra_0x8b", + "\u1105,\u116d,": "extra_0x8b", + "\u1105,\u116e,": "extra_0x8b", + "\u1105,\u116f,": "extra_0x8b", + "\u1105,\u1170,": "extra_0x8b", + "\u1105,\u1171,": "extra_0x8b", + "\u1105,\u1172,": "extra_0x8b", + "\u1105,\u1173,": "extra_0x8b", + "\u1105,\u1174,": "extra_0x8b", + "\u1105,\u1175,": "extra_0x8b", + "\u1106,\u1161,": "extra_0x8b", + "\u1106,\u1162,": "extra_0x8b", + "\u1106,\u1163,": "extra_0x8b", + "\u1106,\u1164,": "extra_0x8b", + "\u1106,\u1165,": "extra_0x8b", + "\u1106,\u1166,": "extra_0x8b", + "\u1106,\u1167,": "extra_0x8b", + "\u1106,\u1168,": "extra_0x8b", + "\u1106,\u1169,": "extra_0x8b", + "\u1106,\u116a,": "extra_0x8b", + "\u1106,\u116b,": "extra_0x8b", + "\u1106,\u116c,": "extra_0x8b", + "\u1106,\u116d,": "extra_0x8b", + "\u1106,\u116e,": "extra_0x8b", + "\u1106,\u116f,": "extra_0x8b", + "\u1106,\u1170,": "extra_0x8b", + "\u1106,\u1171,": "extra_0x8b", + "\u1106,\u1172,": "extra_0x8b", + "\u1106,\u1173,": "extra_0x8b", + "\u1106,\u1174,": "extra_0x8b", + "\u1106,\u1175,": "extra_0x8b", + "\u1107,\u1161,": "extra_0x8b", + "\u1107,\u1162,": "extra_0x8b", + "\u1107,\u1163,": "extra_0x8b", + "\u1107,\u1164,": "extra_0x8b", + "\u1107,\u1165,": "extra_0x8b", + "\u1107,\u1166,": "extra_0x8b", + "\u1107,\u1167,": "extra_0x8b", + "\u1107,\u1168,": "extra_0x8b", + "\u1107,\u1169,": "extra_0x8b", + "\u1107,\u116a,": "extra_0x8b", + "\u1107,\u116b,": "extra_0x8b", + "\u1107,\u116c,": "extra_0x8b", + "\u1107,\u116d,": "extra_0x8b", + "\u1107,\u116e,": "extra_0x8b", + "\u1107,\u116f,": "extra_0x8b", + "\u1107,\u1170,": "extra_0x8b", + "\u1107,\u1171,": "extra_0x8b", + "\u1107,\u1172,": "extra_0x8b", + "\u1107,\u1173,": "extra_0x8b", + "\u1107,\u1174,": "extra_0x8b", + "\u1107,\u1175,": "extra_0x8b", + "\u1108,\u1161,": "extra_0x8b", + "\u1108,\u1162,": "extra_0x8b", + "\u1108,\u1163,": "extra_0x8b", + "\u1108,\u1164,": "extra_0x8b", + "\u1108,\u1165,": "extra_0x8b", + "\u1108,\u1166,": "extra_0x8b", + "\u1108,\u1167,": "extra_0x8b", + "\u1108,\u1168,": "extra_0x8b", + "\u1108,\u1169,": "extra_0x8b", + "\u1108,\u116a,": "extra_0x8b", + "\u1108,\u116b,": "extra_0x8b", + "\u1108,\u116c,": "extra_0x8b", + "\u1108,\u116d,": "extra_0x8b", + "\u1108,\u116e,": "extra_0x8b", + "\u1108,\u116f,": "extra_0x8b", + "\u1108,\u1170,": "extra_0x8b", + "\u1108,\u1171,": "extra_0x8b", + "\u1108,\u1172,": "extra_0x8b", + "\u1108,\u1173,": "extra_0x8b", + "\u1108,\u1174,": "extra_0x8b", + "\u1108,\u1175,": "extra_0x8b", + "\u1109,\u1161,": "extra_0x8b", + "\u1109,\u1162,": "extra_0x8b", + "\u1109,\u1163,": "extra_0x8b", + "\u1109,\u1164,": "extra_0x8b", + "\u1109,\u1165,": "extra_0x8b", + "\u1109,\u1166,": "extra_0x8b", + "\u1109,\u1167,": "extra_0x8b", + "\u1109,\u1168,": "extra_0x8b", + "\u1109,\u1169,": "extra_0x8b", + "\u1109,\u116a,": "extra_0x8b", + "\u1109,\u116b,": "extra_0x8b", + "\u1109,\u116c,": "extra_0x8b", + "\u1109,\u116d,": "extra_0x8b", + "\u1109,\u116e,": "extra_0x8b", + "\u1109,\u116f,": "extra_0x8b", + "\u1109,\u1170,": "extra_0x8b", + "\u1109,\u1171,": "extra_0x8b", + "\u1109,\u1172,": "extra_0x8b", + "\u1109,\u1173,": "extra_0x8b", + "\u1109,\u1174,": "extra_0x8b", + "\u1109,\u1175,": "extra_0x8b", + "\u110a,\u1161,": "extra_0x8b", + "\u110a,\u1162,": "extra_0x8b", + "\u110a,\u1163,": "extra_0x8b", + "\u110a,\u1164,": "extra_0x8b", + "\u110a,\u1165,": "extra_0x8b", + "\u110a,\u1166,": "extra_0x8b", + "\u110a,\u1167,": "extra_0x8b", + "\u110a,\u1168,": "extra_0x8b", + "\u110a,\u1169,": "extra_0x8b", + "\u110a,\u116a,": "extra_0x8b", + "\u110a,\u116b,": "extra_0x8b", + "\u110a,\u116c,": "extra_0x8b", + "\u110a,\u116d,": "extra_0x8b", + "\u110a,\u116e,": "extra_0x8b", + "\u110a,\u116f,": "extra_0x8b", + "\u110a,\u1170,": "extra_0x8b", + "\u110a,\u1171,": "extra_0x8b", + "\u110a,\u1172,": "extra_0x8b", + "\u110a,\u1173,": "extra_0x8b", + "\u110a,\u1174,": "extra_0x8b", + "\u110a,\u1175,": "extra_0x8b", + "\u110b,\u1161,": "extra_0x8b", + "\u110b,\u1162,": "extra_0x8b", + "\u110b,\u1163,": "extra_0x8b", + "\u110b,\u1164,": "extra_0x8b", + "\u110b,\u1165,": "extra_0x8b", + "\u110b,\u1166,": "extra_0x8b", + "\u110b,\u1167,": "extra_0x8b", + "\u110b,\u1168,": "extra_0x8b", + "\u110b,\u1169,": "extra_0x8b", + "\u110b,\u116a,": "extra_0x8b", + "\u110b,\u116b,": "extra_0x8b", + "\u110b,\u116c,": "extra_0x8b", + "\u110b,\u116d,": "extra_0x8b", + "\u110b,\u116e,": "extra_0x8b", + "\u110b,\u116f,": "extra_0x8b", + "\u110b,\u1170,": "extra_0x8b", + "\u110b,\u1171,": "extra_0x8b", + "\u110b,\u1172,": "extra_0x8b", + "\u110b,\u1173,": "extra_0x8b", + "\u110b,\u1174,": "extra_0x8b", + "\u110b,\u1175,": "extra_0x8b", + "\u110c,\u1161,": "extra_0x8b", + "\u110c,\u1162,": "extra_0x8b", + "\u110c,\u1163,": "extra_0x8b", + "\u110c,\u1164,": "extra_0x8b", + "\u110c,\u1165,": "extra_0x8b", + "\u110c,\u1166,": "extra_0x8b", + "\u110c,\u1167,": "extra_0x8b", + "\u110c,\u1168,": "extra_0x8b", + "\u110c,\u1169,": "extra_0x8b", + "\u110c,\u116a,": "extra_0x8b", + "\u110c,\u116b,": "extra_0x8b", + "\u110c,\u116c,": "extra_0x8b", + "\u110c,\u116d,": "extra_0x8b", + "\u110c,\u116e,": "extra_0x8b", + "\u110c,\u116f,": "extra_0x8b", + "\u110c,\u1170,": "extra_0x8b", + "\u110c,\u1171,": "extra_0x8b", + "\u110c,\u1172,": "extra_0x8b", + "\u110c,\u1173,": "extra_0x8b", + "\u110c,\u1174,": "extra_0x8b", + "\u110c,\u1175,": "extra_0x8b", + "\u110d,\u1161,": "extra_0x8b", + "\u110d,\u1162,": "extra_0x8b", + "\u110d,\u1163,": "extra_0x8b", + "\u110d,\u1164,": "extra_0x8b", + "\u110d,\u1165,": "extra_0x8b", + "\u110d,\u1166,": "extra_0x8b", + "\u110d,\u1167,": "extra_0x8b", + "\u110d,\u1168,": "extra_0x8b", + "\u110d,\u1169,": "extra_0x8b", + "\u110d,\u116a,": "extra_0x8b", + "\u110d,\u116b,": "extra_0x8b", + "\u110d,\u116c,": "extra_0x8b", + "\u110d,\u116d,": "extra_0x8b", + "\u110d,\u116e,": "extra_0x8b", + "\u110d,\u116f,": "extra_0x8b", + "\u110d,\u1170,": "extra_0x8b", + "\u110d,\u1171,": "extra_0x8b", + "\u110d,\u1172,": "extra_0x8b", + "\u110d,\u1173,": "extra_0x8b", + "\u110d,\u1174,": "extra_0x8b", + "\u110d,\u1175,": "extra_0x8b", + "\u110e,\u1161,": "extra_0x8b", + "\u110e,\u1162,": "extra_0x8b", + "\u110e,\u1163,": "extra_0x8b", + "\u110e,\u1164,": "extra_0x8b", + "\u110e,\u1165,": "extra_0x8b", + "\u110e,\u1166,": "extra_0x8b", + "\u110e,\u1167,": "extra_0x8b", + "\u110e,\u1168,": "extra_0x8b", + "\u110e,\u1169,": "extra_0x8b", + "\u110e,\u116a,": "extra_0x8b", + "\u110e,\u116b,": "extra_0x8b", + "\u110e,\u116c,": "extra_0x8b", + "\u110e,\u116d,": "extra_0x8b", + "\u110e,\u116e,": "extra_0x8b", + "\u110e,\u116f,": "extra_0x8b", + "\u110e,\u1170,": "extra_0x8b", + "\u110e,\u1171,": "extra_0x8b", + "\u110e,\u1172,": "extra_0x8b", + "\u110e,\u1173,": "extra_0x8b", + "\u110e,\u1174,": "extra_0x8b", + "\u110e,\u1175,": "extra_0x8b", + "\u110f,\u1161,": "extra_0x8b", + "\u110f,\u1162,": "extra_0x8b", + "\u110f,\u1163,": "extra_0x8b", + "\u110f,\u1164,": "extra_0x8b", + "\u110f,\u1165,": "extra_0x8b", + "\u110f,\u1166,": "extra_0x8b", + "\u110f,\u1167,": "extra_0x8b", + "\u110f,\u1168,": "extra_0x8b", + "\u110f,\u1169,": "extra_0x8b", + "\u110f,\u116a,": "extra_0x8b", + "\u110f,\u116b,": "extra_0x8b", + "\u110f,\u116c,": "extra_0x8b", + "\u110f,\u116d,": "extra_0x8b", + "\u110f,\u116e,": "extra_0x8b", + "\u110f,\u116f,": "extra_0x8b", + "\u110f,\u1170,": "extra_0x8b", + "\u110f,\u1171,": "extra_0x8b", + "\u110f,\u1172,": "extra_0x8b", + "\u110f,\u1173,": "extra_0x8b", + "\u110f,\u1174,": "extra_0x8b", + "\u110f,\u1175,": "extra_0x8b", + "\u1110,\u1161,": "extra_0x8b", + "\u1110,\u1162,": "extra_0x8b", + "\u1110,\u1163,": "extra_0x8b", + "\u1110,\u1164,": "extra_0x8b", + "\u1110,\u1165,": "extra_0x8b", + "\u1110,\u1166,": "extra_0x8b", + "\u1110,\u1167,": "extra_0x8b", + "\u1110,\u1168,": "extra_0x8b", + "\u1110,\u1169,": "extra_0x8b", + "\u1110,\u116a,": "extra_0x8b", + "\u1110,\u116b,": "extra_0x8b", + "\u1110,\u116c,": "extra_0x8b", + "\u1110,\u116d,": "extra_0x8b", + "\u1110,\u116e,": "extra_0x8b", + "\u1110,\u116f,": "extra_0x8b", + "\u1110,\u1170,": "extra_0x8b", + "\u1110,\u1171,": "extra_0x8b", + "\u1110,\u1172,": "extra_0x8b", + "\u1110,\u1173,": "extra_0x8b", + "\u1110,\u1174,": "extra_0x8b", + "\u1110,\u1175,": "extra_0x8b", + "\u1111,\u1161,": "extra_0x8b", + "\u1111,\u1162,": "extra_0x8b", + "\u1111,\u1163,": "extra_0x8b", + "\u1111,\u1164,": "extra_0x8b", + "\u1111,\u1165,": "extra_0x8b", + "\u1111,\u1166,": "extra_0x8b", + "\u1111,\u1167,": "extra_0x8b", + "\u1111,\u1168,": "extra_0x8b", + "\u1111,\u1169,": "extra_0x8b", + "\u1111,\u116a,": "extra_0x8b", + "\u1111,\u116b,": "extra_0x8b", + "\u1111,\u116c,": "extra_0x8b", + "\u1111,\u116d,": "extra_0x8b", + "\u1111,\u116e,": "extra_0x8b", + "\u1111,\u116f,": "extra_0x8b", + "\u1111,\u1170,": "extra_0x8b", + "\u1111,\u1171,": "extra_0x8b", + "\u1111,\u1172,": "extra_0x8b", + "\u1111,\u1173,": "extra_0x8b", + "\u1111,\u1174,": "extra_0x8b", + "\u1111,\u1175,": "extra_0x8b", + "\u1112,\u1161,": "extra_0x8b", + "\u1112,\u1162,": "extra_0x8b", + "\u1112,\u1163,": "extra_0x8b", + "\u1112,\u1164,": "extra_0x8b", + "\u1112,\u1165,": "extra_0x8b", + "\u1112,\u1166,": "extra_0x8b", + "\u1112,\u1167,": "extra_0x8b", + "\u1112,\u1168,": "extra_0x8b", + "\u1112,\u1169,": "extra_0x8b", + "\u1112,\u116a,": "extra_0x8b", + "\u1112,\u116b,": "extra_0x8b", + "\u1112,\u116c,": "extra_0x8b", + "\u1112,\u116d,": "extra_0x8b", + "\u1112,\u116e,": "extra_0x8b", + "\u1112,\u116f,": "extra_0x8b", + "\u1112,\u1170,": "extra_0x8b", + "\u1112,\u1171,": "extra_0x8b", + "\u1112,\u1172,": "extra_0x8b", + "\u1112,\u1173,": "extra_0x8b", + "\u1112,\u1174,": "extra_0x8b", + "\u1112,\u1175,": "extra_0x8b" + } + } + ], + "\u11bd": [ + null, + null, + null, + { + "defaultGlyph": "0xd8", + "alternatives": {} + }, + { + "defaultGlyph": "0xef", + "alternatives": {} + }, + { + "defaultGlyph": "0xef", + "alternatives": {} + } + ], + "\u11be": [ + null, + null, + null, + { + "defaultGlyph": "0xd9", + "alternatives": {} + }, + { + "defaultGlyph": "0xf0", + "alternatives": {} + }, + { + "defaultGlyph": "0xf0", + "alternatives": {} + } + ], + "\u11bf": [ + null, + null, + null, + { + "defaultGlyph": "0xda", + "alternatives": {} + }, + { + "defaultGlyph": "0xf1", + "alternatives": {} + }, + { + "defaultGlyph": "0xf1", + "alternatives": {} + } + ], + "\u11c0": [ + null, + null, + null, + { + "defaultGlyph": "0xdb", + "alternatives": {} + }, + { + "defaultGlyph": "0xf2", + "alternatives": {} + }, + { + "defaultGlyph": "0xf2", + "alternatives": {} + } + ], + "\u11c1": [ + null, + null, + null, + { + "defaultGlyph": "0xdc", + "alternatives": {} + }, + { + "defaultGlyph": "0xf3", + "alternatives": {} + }, + { + "defaultGlyph": "0xf3", + "alternatives": {} + } + ], + "\u11c2": [ + null, + null, + null, + { + "defaultGlyph": "0xdd", + "alternatives": {} + }, + { + "defaultGlyph": "0xf4", + "alternatives": {} + }, + { + "defaultGlyph": "0xf4", + "alternatives": {} + } + ] +} \ No newline at end of file diff --git a/game/assets/jak1/subtitle/subtitle_lines_fi-FI.json b/game/assets/jak1/subtitle/subtitle_lines_fi-FI.json index 06a3aa6304..595221dbb2 100644 --- a/game/assets/jak1/subtitle/subtitle_lines_fi-FI.json +++ b/game/assets/jak1/subtitle/subtitle_lines_fi-FI.json @@ -2840,4 +2840,4 @@ "WOMAN": "NAINEN", "YELLOW SAGE": "KELTAINEN TIETÄJÄ" } -} \ No newline at end of file +} diff --git a/game/assets/jak2/subtitle/subtitle_lines_fi-FI.json b/game/assets/jak2/subtitle/subtitle_lines_fi-FI.json index 76c33da665..2a5dc78628 100644 --- a/game/assets/jak2/subtitle/subtitle_lines_fi-FI.json +++ b/game/assets/jak2/subtitle/subtitle_lines_fi-FI.json @@ -9829,4 +9829,4 @@ "youngsamos": "Nuori Samos", "youngsamos-before-rescue": "Samos" } -} \ No newline at end of file +} diff --git a/game/assets/jak2/subtitle/subtitle_lines_it-IT.json b/game/assets/jak2/subtitle/subtitle_lines_it-IT.json index 561c8e11ad..a96e393c2b 100644 --- a/game/assets/jak2/subtitle/subtitle_lines_it-IT.json +++ b/game/assets/jak2/subtitle/subtitle_lines_it-IT.json @@ -7732,4 +7732,4 @@ "youngsamos": "Giovane Samos", "youngsamos-before-rescue": "Samos" } -} \ No newline at end of file +} diff --git a/game/assets/jak2/temp-text-id-mapping.json b/game/assets/jak2/temp-text-id-mapping.json deleted file mode 100644 index 1f25354bc6..0000000000 --- a/game/assets/jak2/temp-text-id-mapping.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "1a3": "138", - "1b5": "161", - "133a": "1113", - "1200": "1031", - "1201": "1032", - "1202": "1034", - "1203": "1033", - "120c": "10c0", - "120d": "103b", - "120e": "1042", - "1215": "10d0", - "123a": "1035", - "123c": "1070", - "123d": "1071", - "123f": "107b", - "1242": "107c", - "1240": "107d", - "1241": "107e", - "1248": "1050", - "1249": "1051", - "124e": "100c", - "124d": "100e", - "124f": "100d", - "125e": "1097", - "1280": "1000", - "1286": "1001", - "1287": "1002", - "1289": "1030", - "128f": "100f", - "1290": "1500", - "1291": "1600", - "1292": "1007", - "1293": "160d", - "1294": "1601", - "1295": "1602", - "1296": "1603", - "1297": "1604", - "1299": "160e", - "129a": "160f", - "129b": "1610", - "129c": "1606", - "129d": "1607", - "129e": "1608", - "129f": "1609", - "1300": "1613", - "1301": "1611", - "1302": "160a", - "1303": "160b", - "1304": "160c", - "1307": "1614", - "1308": "1615" -} diff --git a/game/assets/jak2/update-text-from-jak1.py b/game/assets/jak2/update-text-from-jak1.py deleted file mode 100644 index 432c8b28dd..0000000000 --- a/game/assets/jak2/update-text-from-jak1.py +++ /dev/null @@ -1,49 +0,0 @@ -# Jak 2 shares many of the same custom menu strings as jak 1 obviously -# this is to copy them over so they are already translated. - -import json -import os - - -with open("temp-text-id-mapping.json", "r", encoding="utf-8") as f: - mapping = json.load(f) - -with open("./text/game_custom_text_en-US.json", "r", encoding="utf-8") as f: - default_jak2_english = json.load(f) - -def create_text_file(locale): - if not os.path.exists(f"./text/game_custom_text_{locale}.json"): - with open(f"./text/game_custom_text_{locale}.json", "w", encoding="utf-8") as f: - json.dump(default_jak2_english, f, indent=2, ensure_ascii=False) - - with open(f"./text/game_custom_text_{locale}.json", "r", encoding="utf-8") as f: - jak2_file = json.load(f) - - with open( - f"../jak1/text/game_custom_text_{locale}.json", "r", encoding="utf-8" - ) as f: - jak1_file = json.load(f) - - for jak2_id, jak1_id in mapping.items(): - jak2_file[jak2_id] = jak1_file[jak1_id].title() - - with open(f"./text/game_custom_text_{locale}.json", "w", encoding="utf-8") as f: - json.dump(jak2_file, f, indent=2, ensure_ascii=False) - - -create_text_file("ca-ES") -create_text_file("da-DK") -create_text_file("de-DE") -create_text_file("es-ES") -create_text_file("fi-FI") -create_text_file("fr-FR") -create_text_file("hu-HU") -create_text_file("is-IS") -create_text_file("it-IT") -create_text_file("ja-JP") -create_text_file("nl-NL") -create_text_file("no-NO") -create_text_file("pl-PL") -create_text_file("pt-PT") -create_text_file("pt-BR") -create_text_file("sv-SE") diff --git a/game/kernel/common/kmachine.cpp b/game/kernel/common/kmachine.cpp index 4dba2d2b58..f775cca88d 100644 --- a/game/kernel/common/kmachine.cpp +++ b/game/kernel/common/kmachine.cpp @@ -6,8 +6,8 @@ #include "common/log/log.h" #include "common/symbols.h" #include "common/util/FileUtil.h" -#include "common/util/FontUtils.h" #include "common/util/Timer.h" +#include "common/util/font/font_utils.h" #include "common/util/string_util.h" #include "game/external/discord.h" diff --git a/game/kernel/jak2/kmachine.cpp b/game/kernel/jak2/kmachine.cpp index 397eb1ba33..97af545e98 100644 --- a/game/kernel/jak2/kmachine.cpp +++ b/game/kernel/jak2/kmachine.cpp @@ -9,7 +9,7 @@ #include "common/log/log.h" #include "common/symbols.h" #include "common/util/FileUtil.h" -#include "common/util/FontUtils.h" +#include "common/util/font/font_utils.h" #include "common/util/string_util.h" #include "game/external/discord_jak2.h" diff --git a/game/kernel/jak2/kmachine_extras.cpp b/game/kernel/jak2/kmachine_extras.cpp index 7faf3d806d..a96601314e 100644 --- a/game/kernel/jak2/kmachine_extras.cpp +++ b/game/kernel/jak2/kmachine_extras.cpp @@ -6,10 +6,9 @@ #include "kscheme.h" #include "common/symbols.h" -#include "common/util/FontUtils.h" +#include "common/util/font/font_utils.h" #include "game/external/discord.h" -#include "game/external/discord_jak1.h" #include "game/external/discord_jak2.h" #include "game/kernel/common/Symbol4.h" #include "game/kernel/common/kmachine.h" diff --git a/game/kernel/jak3/kmachine_extras.cpp b/game/kernel/jak3/kmachine_extras.cpp index 55a4e32b20..1ac38b1e43 100644 --- a/game/kernel/jak3/kmachine_extras.cpp +++ b/game/kernel/jak3/kmachine_extras.cpp @@ -6,7 +6,7 @@ #include "kscheme.h" #include "common/symbols.h" -#include "common/util/FontUtils.h" +#include "common/util/font/font_utils.h" #include "game/external/discord_jak3.h" #include "game/kernel/common/Symbol4.h" diff --git a/goal_src/jak2/engine/scene/scene.gc b/goal_src/jak2/engine/scene/scene.gc index 3a126fcab8..875e6ce39d 100644 --- a/goal_src/jak2/engine/scene/scene.gc +++ b/goal_src/jak2/engine/scene/scene.gc @@ -764,6 +764,16 @@ (case (-> s3-0 type) ((string) (when (= (-> *setting-control* user-default subtitle-language) (language-enum korean)) + ;; EXPORT SUBTITLE LINES + ;; dont export the same string multiple times + ;; (when (not (string= *pc-subtitle-export-temp-string* (the-as string s3-0))) + ;; (clear *pc-subtitle-export-temp-string*) + ;; (copy-string<-string *pc-subtitle-export-temp-string* (the-as string s3-0)) + ;; (format 0 "subtitle length: ~D~%" (length (the-as string s3-0))) + ;; (let ((file (new 'stack 'file-stream "/Users/tyler/repos/jak-project/decompiler_out/jak2/assets/subtitles.txt" 'append))) + ;; (format file "~S::~f::\"" (-> (the scene-player self) anim name) f30-0) + ;; (log-string-bytes (the-as string s3-0) file) + ;; (file-stream-close file))) (set! s3-0 (convert-korean-text (the-as string s3-0))) (let ((v1-27 s2-0)) (set! (-> v1-27 scale) 0.6) diff --git a/goal_src/jak2/engine/ui/text.gc b/goal_src/jak2/engine/ui/text.gc index 6b00ab1ec7..31a2a00e82 100644 --- a/goal_src/jak2/engine/ui/text.gc +++ b/goal_src/jak2/engine/ui/text.gc @@ -72,76 +72,98 @@ this ) -(defun convert-korean-text ((arg0 string)) +(defun convert-korean-text ((src-str string)) "Converts the provided [[string]] of [[game-text]] into korean. Returns a [[string]]" (local-vars (v1-21 int)) - (let ((charp (-> arg0 data))) - *expanded-text-line0* - (let ((s4-0 0)) - 0 - (let ((s1-0 0) - (s5-0 (length arg0)) - ) + ;; iterate through the bytes in the string + (let ((src-ptr (-> src-str data))) + (let ((src-i 0)) + (let ((dst-i 0) + (src-len (length src-str))) + ;; use line0 unless expand flag is set (set! *expand-buf-number* (logxor *expand-buf-number* 1)) - (let ((s3-0 (if (zero? *expand-buf-number*) - *expanded-text-line0* - *expanded-text-line1* - ) - ) - ) - (let ((s2-0 (+ (-> s3-0 allocated-length) -1))) - (clear s3-0) - (while (< s4-0 s5-0) + (let ((dst (if (zero? *expand-buf-number*) + *expanded-text-line0* + *expanded-text-line1*))) + (let ((dst-max (+ (-> dst allocated-length) -1))) + (clear dst) + (while (< src-i src-len) (cond - ((= (-> charp s4-0) 3) - (+! s4-0 1) - (while (and (< s4-0 s5-0) (!= (-> charp s4-0) 3) (!= (-> charp s4-0) 4)) - (set! (-> s3-0 data s1-0) (-> charp s4-0)) - (+! s4-0 1) - (+! s1-0 1) - ) - ) + ;; code 3 = copy chars into destination until we reach a code 3 or 4 + ;; i believe this handles non-syllable blocks, like spaces, which are represented like `0x3 0x20` + ((= (-> src-ptr src-i) 3) + (+! src-i 1) + (while (and (< src-i src-len) + (!= (-> src-ptr src-i) 3) + (!= (-> src-ptr src-i) 4)) + (set! (-> dst data dst-i) (-> src-ptr src-i)) + (+! src-i 1) + (+! dst-i 1))) + ;; any other byte (for example #4, which is the start of all syllable blocks) (else - (let ((v1-17 (+ s4-0 1))) - (-> charp v1-17) - (set! s4-0 (+ v1-17 1)) - ) - (set! (-> s3-0 data s1-0) (the-as uint 126)) - (let ((v1-19 (+ s1-0 1))) - (set! (-> s3-0 data v1-19) (the-as uint 89)) - (let ((v1-20 (+ v1-19 1))) - (while (and (< s4-0 s5-0) (< v1-20 s2-0) (!= (-> charp s4-0) 3) (!= (-> charp s4-0) 4)) + ;; look ahead 1 byte (bounds assumed) + (let ((next-byte (+ src-i 1))) + (-> src-ptr next-byte) ;; meaningless, left-over code? + ;; set the src-index to the value of `next-byte`+1 + ;; so this would be...the number of characters (or perhaps the number of syllable elements) + 1 + ;; this is very important i feel + (set! src-i (+ next-byte 1))) + ;; the idea here is we render the jamo all at the same position as the texture for each jamo accounts for their offset + ;; and then advance when we're done. + ;; we use a code of 4 to mark the beginning of a jamo sequence, a.k.a. one hangeul letter. + ;; there is jamo at code-page 1 (#x100-#x1ff) and code-page 3 (#x300-#x3ff), though only a handful are in code-page 1. + ;; since this requires two bytes per jamo, we assume the jamo is in code-page 3 by default and thus only have to read 1 byte per jamo. + ;; however, if we read a code of '5' then that means it is in code-page 1, which means we read 2 bytes. + ;; the jamo sequence terminates when we reach a code 3 (copy chars) or code 4 (new letter). + ;; when the sequence terminates, we move the font trans forwards and move on with our life. + ;; save font trans (~Y) + (set! (-> dst data dst-i) (the-as uint 126)) ;; ~ + (let ((v1-19 (+ dst-i 1))) + (set! (-> dst data v1-19) (the-as uint 89)) ;; Y + (let ((dest-index (+ v1-19 1))) + ;; inner while loop, go until 0x3 or 0x4, or end of the string + (while (and (< src-i src-len) + (< dest-index dst-max) + (!= (-> src-ptr src-i) 3) + (!= (-> src-ptr src-i) 4)) (cond - ((= (-> charp s4-0) 5) - (set! (-> s3-0 data v1-20) (the-as uint 1)) - (+! s4-0 1) - (set! v1-21 (+ v1-20 1)) + ;; we hit a 0x5 + ((= (-> src-ptr src-i) 5) + ;; code-page `0x1` byte + (set! (-> dst data dest-index) (the-as uint 1)) + ;; increment the src-index since we just manually wrote a `0x1` in place of the `0x5` + (+! src-i 1) + (set! v1-21 (+ dest-index 1)) ) (else - (set! (-> s3-0 data v1-20) (the-as uint 3)) - (set! v1-21 (+ v1-20 1)) + ;; code-page `0x3` byte + (set! (-> dst data dest-index) (the-as uint 3)) + (set! v1-21 (+ dest-index 1)) ) ) - (set! (-> s3-0 data v1-21) (-> charp s4-0)) - (+! s4-0 1) + ;; now add the byte that we are looking at the current index + (set! (-> dst data v1-21) (-> src-ptr src-i)) + (+! src-i 1) + ;; restore font trans (~Z) (let ((v1-22 (+ v1-21 1))) - (set! (-> s3-0 data v1-22) (the-as uint 126)) + (set! (-> dst data v1-22) (the-as uint 126)) ;; ~ (let ((v1-23 (+ v1-22 1))) - (set! (-> s3-0 data v1-23) (the-as uint 90)) - (set! v1-20 (+ v1-23 1)) + (set! (-> dst data v1-23) (the-as uint 90)) ;; Z + (set! dest-index (+ v1-23 1)) ) ) ) - (set! (-> s3-0 data v1-20) (the-as uint 126)) - (let ((v1-24 (+ v1-20 1))) - (set! (-> s3-0 data v1-24) (the-as uint 43)) + ;; advance font trans by 26 (~+26H) + (set! (-> dst data dest-index) (the-as uint 126)) ;; ~ + (let ((v1-24 (+ dest-index 1))) + (set! (-> dst data v1-24) (the-as uint 43)) ;; + (let ((v1-25 (+ v1-24 1))) - (set! (-> s3-0 data v1-25) (the-as uint 50)) + (set! (-> dst data v1-25) (the-as uint 50)) ;; 2 (let ((v1-26 (+ v1-25 1))) - (set! (-> s3-0 data v1-26) (the-as uint 54)) + (set! (-> dst data v1-26) (the-as uint 54)) ;; 6 (let ((v1-27 (+ v1-26 1))) - (set! (-> s3-0 data v1-27) (the-as uint 72)) - (set! s1-0 (+ v1-27 1)) + (set! (-> dst data v1-27) (the-as uint 72)) ;; H + (set! dst-i (+ v1-27 1)) ) ) ) @@ -152,8 +174,9 @@ ) ) ) - (set! (-> s3-0 data s1-0) (the-as uint 0)) - s3-0 + ;; null terminate string + (set! (-> dst data dst-i) (the-as uint 0)) + dst ) ) ) diff --git a/goal_src/jak2/kernel/gstring.gc b/goal_src/jak2/kernel/gstring.gc index 4b41e4ae7a..4d071498dc 100644 --- a/goal_src/jak2/kernel/gstring.gc +++ b/goal_src/jak2/kernel/gstring.gc @@ -5,6 +5,27 @@ ;; name in dgo: gstring ;; dgos: KERNEL +(defun print-string-bytes ((arg0 string)) + (let ((str-ptr (-> arg0 data)) + (first-line-break #f)) + (while (and (nonzero? (-> str-ptr 0))) + (when (and first-line-break (or (= (-> str-ptr 0) #x4) (= (-> str-ptr 0) #x59))) + (format #t "~%")) + (when (or (= (-> str-ptr 0) #x4) (= (-> str-ptr 0) #x59)) + (set! first-line-break #t)) + (format #t "0x~X " (-> str-ptr 0)) + (set! str-ptr (&-> str-ptr 1)))) + (format #t "\"~%") + (none)) + +(defun log-string-bytes ((arg0 string) (arg1 object)) + (let ((str-ptr (-> arg0 data))) + (while (and (nonzero? (-> str-ptr 0))) + (format arg1 "0x~X " (-> str-ptr 0)) + (set! str-ptr (&-> str-ptr 1)))) + (format arg1 "~%~%") + (none)) + ;; DECOMP BEGINS (defmethod length ((this string)) @@ -824,5 +845,6 @@ ) (define *pc-encoded-temp-string* (new 'global 'string 2048 (the-as string #f))) +;; (define *pc-subtitle-export-temp-string* (new 'global 'string 2048 (the-as string #f))) (kmemclose) diff --git a/goal_src/jak2/pc/subtitle2.gc b/goal_src/jak2/pc/subtitle2.gc index 0389f89ab2..96b467d471 100644 --- a/goal_src/jak2/pc/subtitle2.gc +++ b/goal_src/jak2/pc/subtitle2.gc @@ -332,18 +332,26 @@ (set! (-> line text) (-> obj movie-line)) (return (the string #f)))) - (cond - ((= (pc-subtitle2-speaker none) (-> line speaker)) - ;; there's no speaker so who cares. - (string-format "~S" (-> line text))) - ((or (= #t (-> *pc-settings* subtitle-speaker?)) - (and (= 'auto (-> *pc-settings* subtitle-speaker?)) (subtitle2-flags? line offscreen))) - ;; there is a speaker and we do want it. - ;; we use color 33 which gets set at runtime to any color we want - (string-format "~33L~S:~0L ~S" (get-speaker *subtitle2-text* (-> line speaker)) (-> line text))) - (else - (string-format "~S" (-> line text))) - ) + ;; if we are in korean language mode and printing hint subtitles (which were never in the original game) + ;; then the text did NOT come from `scene.gc` so we must convert it + ;; + ;; this code is somewhat of a mess, but modifying the line text itself was proving to be a problem + ;; clean it up if you wish! + (let ((convert-to-korean? (and (not (-> obj movie-mode?)) + (= (-> *setting-control* user-default subtitle-language) (language-enum korean))))) + (cond + ((= (pc-subtitle2-speaker none) (-> line speaker)) + ;; there's no speaker so who cares. + (string-format "~S" (if convert-to-korean? (convert-korean-text (-> line text)) (-> line text)))) + ((or (= #t (-> *pc-settings* subtitle-speaker?)) + (and (= 'auto (-> *pc-settings* subtitle-speaker?)) (subtitle2-flags? line offscreen))) + ;; there is a speaker and we do want it. + ;; we use color 33 which gets set at runtime to any color we want + (string-format "~33L~S:~0L ~S" + (if convert-to-korean? (convert-korean-text (get-speaker *subtitle2-text* (-> line speaker))) (get-speaker *subtitle2-text* (-> line speaker))) + (if convert-to-korean? (convert-korean-text (-> line text)) (-> line text)))) + (else + (string-format "~S" (if convert-to-korean? (convert-korean-text (-> line text)) (-> line text)))))) *temp-string*) (defbehavior current-subtitle2-pos subtitle2 ((id sound-id)) @@ -480,9 +488,9 @@ (when (= (gui-status active) (get-status *gui-control* (-> self gui-id))) (true! subtitles-drawn?) (protect (*display-text-box*) - (set! *display-text-box* (or *display-text-box* PC_SUBTITLE_DEBUG)) - (set-speaker-color (-> line-queue elts i line speaker)) - (print-game-text *temp-string* (-> self font) #f 44 (bucket-id debug-no-zbuf2)))) + (set! *display-text-box* (or *display-text-box* PC_SUBTITLE_DEBUG)) + (set-speaker-color (-> line-queue elts i line speaker)) + (print-game-text *temp-string* (-> self font) #f 44 (bucket-id debug-no-zbuf2)))) ) ;; save this for later usage @@ -851,7 +859,7 @@ (set! (-> self have-subtitles?) #f) (set! (-> self movie-mode?) #f) - (set! (-> self movie-line) (new 'process 'string (+ 7 (* 15 16)) (the string #f))) + (set! (-> self movie-line) (new 'process 'string 1024 (the string #f))) (set! (-> self current-debug-scene) 0) (set! (-> self current-debug-line) 0) diff --git a/goal_src/jak2/pc/util/font-encode-test.gc b/goal_src/jak2/pc/util/font-encode-test.gc index 9cf58e4924..a0147414eb 100644 --- a/goal_src/jak2/pc/util/font-encode-test.gc +++ b/goal_src/jak2/pc/util/font-encode-test.gc @@ -98,6 +98,8 @@ (set-origin! fnt (get-screen-x 0.5) (+ FONT_ENCODE_TEXT_Y 75)) (set-scale! fnt 0.75) (draw-string (lookup-text! *common-text* (the text-id *text-id-val*) #f) buf fnt) + (set-origin! fnt (get-screen-x 0.5) (+ FONT_ENCODE_TEXT_Y 100)) + (draw-string (convert-korean-text "\\c04\\c03\\c79\\c7f\\cee\\c04\\c02\\c72\\c83\\c04\\c02\\c2e\\c1a\\c04\\c02\\c06\\c1c") buf fnt) ) ) ) diff --git a/goal_src/jak2/pc/util/korean-tester.gc b/goal_src/jak2/pc/util/korean-tester.gc new file mode 100644 index 0000000000..44f0d2e16c --- /dev/null +++ b/goal_src/jak2/pc/util/korean-tester.gc @@ -0,0 +1,155 @@ +;;-*-Lisp-*- +(in-package goal) + +;; To run this: + +#| +(mng) ;; build the engine +(lt) ;; connect to the runtime +(ml "goal_src/jak2/pc/util/korean-tester.gc") ;; build and load this file. +|# + +(declare-file (debug)) + +(defconstant KOREAN_TESTER_TEXT_Y (get-screen-y 0.5)) + +(defun korean-tester-test-stop () + "stop the encode test proc" + (kill-by-name "korean-tester" *active-pool*) + ) + +(define *korean-tester-initial-jamos-o1* (new 'static 'boxed-array :type int64 )) +(define *korean-tester-initial-jamos-o2* (new 'static 'boxed-array :type int64 )) +(define *korean-tester-initial-jamos-o3* (new 'static 'boxed-array :type int64 #x8b #xb3 #x92 #x93 #x94 #x95 #x96 #x97 #x98 #x99 #x9a #x9b #x9c #x9d #x9e #x8c #x9f #xa0 #xa1)) +(define *korean-tester-initial-jamos-o4* (new 'static 'boxed-array :type int64 #x6 #x34 #x8 #x9 #xa #xb #xc #x0d #xe #x20 #x21 #xf #x10 #x11 #x2d #x12 #x13 #x14 #x2e)) +(define *korean-tester-initial-jamos-o5* (new 'static 'boxed-array :type int64 #x5e #x65 #x69 #x70 #x71 #x72 #x73 #x74 #x75 #x76 #x77 #x78 #x79 #x7a #x7b #x5f #x7c #x7d #x7e)) +(define *korean-tester-initial-jamos-o6* (new 'static 'boxed-array :type int64 #x8b #x91 #x92 #x93 #x94 #x95 #x96 #x97 #x98 #x99 #x9a #x9b #x9c #x9d #x9e #x8c #x9f #xa0 #xa1)) +(define *korean-tester-initial-jamos-o6-alt* (new 'static 'boxed-array :type int64 #xae #xb3 #xb4 #xb5 #xb6 #xb7 #xb2 #xb8 #x98 #xb9 #xba #xbb #xbc #xbd #xbe #xaf #xbf #xa0 #xc0)) + +(define *korean-tester-middle-vertical-jamos-o1* (new 'static 'boxed-array :type int64 #x1a #x46 #x1b #x47 #x1d #x48 #x1e #x49 #x1c)) +(define *korean-tester-middle-horizontal-jamos-o2* (new 'static 'boxed-array :type int64 #x82 #x83 #x87 #x88 #x84)) +(define *korean-tester-middle-vertical-jamos-o4* (new 'static 'boxed-array :type int64 #x15 #x42 #x16 #x47 #x18 #x44 #x19 #x45 #x17)) +(define *korean-tester-middle-horizontal-jamos-o5* (new 'static 'boxed-array :type int64 #x7f #x80 #x85 #x86 #x81)) + +(define *korean-tester-final-jamos-o4* (new 'static 'boxed-array :type int64 #xc5 #xc6 #xc7 #xc8 #xc9 #xca #xcb #xcc #xcd #xce #xcf #xe7 #xd0 #xe9 #xd1 #xd2 #xd3 #xd4 #xd5 #xd6 #xd7 #xd8 #xd9 #xda #xdb #xdc #xdd)) +(define *korean-tester-final-jamos-o5* (new 'static 'boxed-array :type int64 #xde #xdf #xe0 #xe1 #xc9 #xe2 #xe3 #xe4 #xe5 #xe6 #xcf #xe7 #xe8 #xe9 #xea #xeb #xec #xd4 #xed #xfc #xee #xef #xf0 #xf1 #xf2 #xf3 #xf4)) +(define *korean-tester-final-jamos-o6* (new 'static 'boxed-array :type int64 #xf5 #xdf #xe0 #xf6 #xc9 #xe2 #xe3 #xf7 #xe5 #xf8 #xcf #xe7 #xe8 #xe9 #xea #xf9 #xfa #xd4 #xfb #xfc #xfd #xef #xf0 #xf1 #xf2 #xf3 #xf4)) + +(define *korean-tester-tmp-str* (new 'global 'string 4 (the-as string #f))) +(define *korean-tester-static-combined-jamo* (new 'static 'boxed-array :type int64 #xa3 #xa7)) +(define *korean-tester-static-jamo-1* #x84) +(define *korean-tester-static-jamo-2* #x0) +(define *korean-tester-static-jamo-3* #x0) +(define *korean-tester-current-jamo-coll-1* *korean-tester-initial-jamos-o6-alt*) +(define *korean-tester-current-jamo-index-1* 0) + +(define *korean-tester-current-jamo-coll-2* *korean-tester-final-jamos-o6*) +(define *korean-tester-current-jamo-index-2* 0) + +(defun korean-tester-test-start () + "start the encode test proc" + (korean-tester-test-stop) + (process-spawn-function process :name "korean-tester" + (lambda :behavior process () + (let ((fnt (new 'stack 'font-context *font-default-matrix* (get-screen-x 0.35) (get-screen-y 0.4) 0.0 + (font-color red) (font-flags shadow kerning large middle))) + ) + + (set-width! fnt (get-screen-x 0.8)) + (set-height! fnt (get-screen-y 0.1)) + + (loop + (suspend) + + (if (or (cpad-pressed? 0 left)) + (-! *korean-tester-current-jamo-index-1* 1)) + (if (or (cpad-pressed? 0 right)) + (+! *korean-tester-current-jamo-index-1* 1)) + (minmax! *korean-tester-current-jamo-index-1* #x0 (dec (-> *korean-tester-current-jamo-coll-1* length))) + + (if (or (cpad-pressed? 0 down)) + (-! *korean-tester-current-jamo-index-2* 1)) + (if (or (cpad-pressed? 0 up)) + (+! *korean-tester-current-jamo-index-2* 1)) + (minmax! *korean-tester-current-jamo-index-2* #x0 (dec (-> *korean-tester-current-jamo-coll-2* length))) + + (with-dma-buffer-add-bucket ((buf (-> (current-frame) debug-buf)) + (bucket-id debug-no-zbuf2)) + ;; print out the current pure hex values + (set-scale! fnt 0.5) + (set-origin! fnt (get-screen-x 0.5) (- KOREAN_TESTER_TEXT_Y 10)) + ;; - 2 glyphs + ;; (draw-string (string-format "0x~X, 0x~X" *korean-tester-static-jamo-1* (-> *korean-tester-current-jamo-coll* *korean-tester-current-jamo-index*)) buf fnt) + ;; - 3 glyphs + ;; (draw-string (string-format "0x~X , 0x~X , 0x~X" + ;; *korean-tester-static-jamo-1* + ;; (-> *korean-tester-current-jamo-coll-1* *korean-tester-current-jamo-index-1*) + ;; (-> *korean-tester-current-jamo-coll-2* *korean-tester-current-jamo-index-2*)) buf fnt) + ;; - 3 glyphs combined + (draw-string (string-format "0x~X , 0x~X" + (-> *korean-tester-current-jamo-coll-1* *korean-tester-current-jamo-index-1*) + (-> *korean-tester-current-jamo-coll-2* *korean-tester-current-jamo-index-2*)) buf fnt) + + ;; print out the korean symbol now + (set-scale! fnt 1.0) + (clear *korean-tester-tmp-str*) + ;; - 2 glyphs + ;; (set! (-> *korean-tester-tmp-str* data 0) 4) + ;; (set! (-> *korean-tester-tmp-str* data 1) 2) + ;; (set! (-> *korean-tester-tmp-str* data 2) *korean-tester-static-jamo-1*) + ;; (if (= *korean-tester-static-jamo-2* #x0) + ;; (set! (-> *korean-tester-tmp-str* data 3) (-> *korean-tester-current-jamo-coll* *korean-tester-current-jamo-index*)) + ;; (set! (-> *korean-tester-tmp-str* data 3) *korean-tester-static-jamo-2*)) + ;; (set! (-> *korean-tester-tmp-str* data 4) 0) + + ;; - 3 glyphs + ;; (set! (-> *korean-tester-tmp-str* data 0) 4) + ;; (set! (-> *korean-tester-tmp-str* data 1) 3) + ;; (set! (-> *korean-tester-tmp-str* data 2) *korean-tester-static-jamo-1*) + ;; (if (= *korean-tester-static-jamo-2* #x0) + ;; (set! (-> *korean-tester-tmp-str* data 3) (-> *korean-tester-current-jamo-coll-1* *korean-tester-current-jamo-index-1*)) + ;; (set! (-> *korean-tester-tmp-str* data 3) *korean-tester-static-jamo-2*)) + ;; (if (= *korean-tester-static-jamo-3* #x0) + ;; (set! (-> *korean-tester-tmp-str* data 4) (-> *korean-tester-current-jamo-coll-2* *korean-tester-current-jamo-index-2*)) + ;; (set! (-> *korean-tester-tmp-str* data 4) *korean-tester-static-jamo-3*)) + ;; (set! (-> *korean-tester-tmp-str* data 5) 0) + + ;; - 3 glyphs (combined static) + (set! (-> *korean-tester-tmp-str* data 0) 4) + (if (= 2 (-> *korean-tester-static-combined-jamo* length)) + (begin + (set! (-> *korean-tester-tmp-str* data 1) 4) + (set! (-> *korean-tester-tmp-str* data 2) (-> *korean-tester-static-combined-jamo* 0)) + (set! (-> *korean-tester-tmp-str* data 3) (-> *korean-tester-static-combined-jamo* 1)) + (if (= *korean-tester-static-jamo-2* #x0) + (set! (-> *korean-tester-tmp-str* data 4) (-> *korean-tester-current-jamo-coll-1* *korean-tester-current-jamo-index-1*)) + (set! (-> *korean-tester-tmp-str* data 4) *korean-tester-static-jamo-2*)) + (if (= *korean-tester-static-jamo-3* #x0) + (set! (-> *korean-tester-tmp-str* data 5) (-> *korean-tester-current-jamo-coll-2* *korean-tester-current-jamo-index-2*)) + (set! (-> *korean-tester-tmp-str* data 5) *korean-tester-static-jamo-3*)) + (set! (-> *korean-tester-tmp-str* data 6) 0)) + (begin + (set! (-> *korean-tester-tmp-str* data 1) 3) + (set! (-> *korean-tester-tmp-str* data 2) (-> *korean-tester-static-combined-jamo* 0)) + (if (= *korean-tester-static-jamo-2* #x0) + (set! (-> *korean-tester-tmp-str* data 3) (-> *korean-tester-current-jamo-coll-1* *korean-tester-current-jamo-index-1*)) + (set! (-> *korean-tester-tmp-str* data 3) *korean-tester-static-jamo-2*)) + (if (= *korean-tester-static-jamo-3* #x0) + (set! (-> *korean-tester-tmp-str* data 4) (-> *korean-tester-current-jamo-coll-2* *korean-tester-current-jamo-index-2*)) + (set! (-> *korean-tester-tmp-str* data 4) *korean-tester-static-jamo-3*)) + (set! (-> *korean-tester-tmp-str* data 5) 0))) + + + ;; (log-string-bytes *korean-tester-tmp-str* 0) + (set-origin! fnt (get-screen-x 0.5) (+ KOREAN_TESTER_TEXT_Y 10)) + (draw-string (convert-korean-text *korean-tester-tmp-str*) buf fnt) + ) + ) + ) + + ) + ) + ) + +(korean-tester-test-start) + diff --git a/goal_src/jak2/pc/util/string-viewer.gc b/goal_src/jak2/pc/util/string-viewer.gc new file mode 100644 index 0000000000..e5fcecd470 --- /dev/null +++ b/goal_src/jak2/pc/util/string-viewer.gc @@ -0,0 +1,108 @@ +;;-*-Lisp-*- +(in-package goal) + +;; To run this: + +#| +(mng) ;; build the engine +(lt) ;; connect to the runtime +(ml "goal_src/jak2/pc/util/string-viewer.gc") ;; build and load this file. +|# + +(declare-file (debug)) + +(define *string-viewer-text-id-val* #x0100) +(defconstant STRING_VIEWER_TEXT_Y (get-screen-y 0.05)) + +(defun string-viewer-test-stop () + "stop the encode test proc" + (kill-by-name "string-viewer" *active-pool*) + ) + +(define *string-viewer-tmp-str* (new 'global 'string 128 (the-as string #f))) + +(defun string-viewer-test-start () + "start the encode test proc" + + (string-viewer-test-stop) + (process-spawn-function process :name "string-viewer" + (lambda :behavior process () + (let ((fnt (new 'stack 'font-context *font-default-matrix* (get-screen-x 0.35) (get-screen-y 0.4) 0.0 + (font-color red) (font-flags shadow kerning large middle))) + ) + + (set-width! fnt (get-screen-x 0.8)) + (set-height! fnt (get-screen-y 0.1)) + + (loop + (suspend) + + (if (or (cpad-pressed? 0 left) (cpad-hold? 0 l1)) + (-! *string-viewer-text-id-val* 1)) + (if (or (cpad-pressed? 0 right) (cpad-hold? 0 r1)) + (+! *string-viewer-text-id-val* 1)) + + (minmax! *string-viewer-text-id-val* #x0 #x134c) + + (with-dma-buffer-add-bucket ((buf (-> (current-frame) debug-buf)) + (bucket-id debug-no-zbuf2)) + (set-scale! fnt 0.5) + (set-origin! fnt (get-screen-x 0.5) (- STRING_VIEWER_TEXT_Y 10)) + (draw-string (string-format "Text ID: ~x" *string-viewer-text-id-val*) buf fnt) + + (set-origin! fnt (get-screen-x 0.5) (+ STRING_VIEWER_TEXT_Y 10)) + (draw-string "English:" buf fnt) + + (set-origin! fnt (get-screen-x 0.5) (+ STRING_VIEWER_TEXT_Y 30)) + (draw-string (lookup-text! *fallback-text* (the text-id *string-viewer-text-id-val*) #f) buf fnt) + + ;; Assumes you have your text set to korean + (set-origin! fnt (get-screen-x 0.5) (+ STRING_VIEWER_TEXT_Y 50)) + (draw-string "Korean:" buf fnt) + + (set-scale! fnt 1.0) + (set-origin! fnt (get-screen-x 0.5) (+ STRING_VIEWER_TEXT_Y 75)) + (draw-string (lookup-text! *common-text* (the text-id *string-viewer-text-id-val*) #f) buf fnt) + (lookup-text! *common-text* (the text-id *string-viewer-text-id-val*) #t) + + ;; draw the bytes of each character + (set-scale! fnt 0.35) + (set-origin! fnt (get-screen-x 0.5) (+ STRING_VIEWER_TEXT_Y 115)) + (clear *pc-cpp-temp-string*) + (clear *string-viewer-tmp-str*) + (let ((raw-str (lookup-text-string *common-text* (the text-id *string-viewer-text-id-val*)))) + (let ((str-ptr (-> raw-str data)) + (first-line-break #f) + (y-origin (+ STRING_VIEWER_TEXT_Y 115)) + (last-byte (the-as uint 0))) + (while (and (nonzero? (-> str-ptr 0))) + (when (and first-line-break (= (-> str-ptr 0) #x4)) + (draw-string (string-format "~S~S~S~S" "~[~1L" *string-viewer-tmp-str* "~[~6L" *pc-cpp-temp-string*) buf fnt) + (set! y-origin (+ y-origin 15)) + (set-origin! fnt (get-screen-x 0.5) y-origin) + (clear *pc-cpp-temp-string*) + (clear *string-viewer-tmp-str*)) + (when (= (-> str-ptr 0) #x4) + (set! first-line-break #t) + (format *string-viewer-tmp-str* "0x~X " (-> str-ptr 0))) + (when (and (or (= (-> str-ptr 0) #x3) (= (-> str-ptr 0) #x2)) (= last-byte #x4)) + (format *string-viewer-tmp-str* "0x~X " (-> str-ptr 0))) + (when (and (not (= (-> str-ptr 0) #x4)) + (not (and (or (= (-> str-ptr 0) #x3) (= (-> str-ptr 0) #x2)) (= last-byte #x4)))) + (format *pc-cpp-temp-string* "0x~X " (-> str-ptr 0))) + (set! last-byte (-> str-ptr 0)) + (set! str-ptr (&-> str-ptr 1))) + (draw-string (string-format "~S~S~S~S" "~[~1L" *string-viewer-tmp-str* "~[~6L" *pc-cpp-temp-string*) buf fnt) + ) + ) + (clear *temp-string*) + ) + ) + ) + + ) + ) + ) + +(string-viewer-test-start) + diff --git a/goal_src/jak3/pc/progress/progress-static-pc.gc b/goal_src/jak3/pc/progress/progress-static-pc.gc index f6e56a14a3..ece21f9774 100644 --- a/goal_src/jak3/pc/progress/progress-static-pc.gc +++ b/goal_src/jak3/pc/progress/progress-static-pc.gc @@ -461,24 +461,25 @@ This gives us more freedom to write code how we want. (text-id progress-language-portuguese) (text-id progress-language-dutch) (text-id progress-language-english-uk) - ; (text-id language-name-finnish) - ; (text-id language-name-swedish) - ; (text-id language-name-danish) - ; (text-id language-name-norwegian) - ; (text-id language-name-dutch) - ; (text-id language-name-br-portuguese) - ; (text-id language-name-hungarian) - ; (text-id language-name-catalan) - ; (text-id language-name-icelandic) - ; (text-id language-name-polish) - ; (text-id language-name-lithuanian) - ; (text-id language-name-czech) - ; (text-id language-name-croatian) - ; (text-id language-name-galician) + (text-id language-name-finnish) + (text-id language-name-swedish) + (text-id language-name-danish) + (text-id language-name-norwegian) + (text-id language-name-dutch) + (text-id language-name-br-portuguese) + (text-id language-name-hungarian) + (text-id language-name-catalan) + (text-id language-name-icelandic) + (text-id language-name-polish) + (text-id language-name-lithuanian) + (text-id language-name-czech) + (text-id language-name-croatian) + (text-id language-name-galician) ) :get-item-index-fn (lambda () (-> *pc-settings* subtitle-language)) :on-confirm (lambda ((index int) (the-progress progress)) (set! (-> *pc-settings* subtitle-language) (the-as pc-language index)) + (set! (-> *setting-control* user-default subtitle-language) (the-as language-enum index)) (pc-settings-save)))) (defmacro game-options-pc-sound-language () diff --git a/goal_src/jak3/pc/subtitle3.gc b/goal_src/jak3/pc/subtitle3.gc index b34c653e4a..43cad5e22d 100644 --- a/goal_src/jak3/pc/subtitle3.gc +++ b/goal_src/jak3/pc/subtitle3.gc @@ -327,18 +327,26 @@ (set! (-> line text) (-> obj movie-line)) (return (the string #f)))) - (cond - ((= (pc-subtitle3-speaker none) (-> line speaker)) - ;; there's no speaker so who cares. - (string-format "~S" (-> line text))) - ((or (= #t (-> *pc-settings* subtitle-speaker?)) - (and (= 'auto (-> *pc-settings* subtitle-speaker?)) (subtitle3-flags? line offscreen))) - ;; there is a speaker and we do want it. - ;; we use color 42 which gets set at runtime to any color we want - (string-format "~42L~S:~0L ~S" (get-speaker *subtitle3-text* (-> line speaker)) (-> line text))) - (else - (string-format "~S" (-> line text))) - ) + ;; if we are in korean language mode and printing hint subtitles (which were never in the original game) + ;; then the text did NOT come from `scene.gc` so we must convert it + ;; + ;; this code is somewhat of a mess, but modifying the line text itself was proving to be a problem + ;; clean it up if you wish! + (let ((convert-to-korean? (and (not (-> obj movie-mode?)) + (= (-> *setting-control* user-default subtitle-language) (language-enum korean))))) + (cond + ((= (pc-subtitle3-speaker none) (-> line speaker)) + ;; there's no speaker so who cares. + (string-format "~S" (if convert-to-korean? (convert-korean-text (-> line text)) (-> line text)))) + ((or (= #t (-> *pc-settings* subtitle-speaker?)) + (and (= 'auto (-> *pc-settings* subtitle-speaker?)) (subtitle3-flags? line offscreen))) + ;; there is a speaker and we do want it. + ;; we use color 33 which gets set at runtime to any color we want + (string-format "~33L~S:~0L ~S" + (if convert-to-korean? (convert-korean-text (get-speaker *subtitle3-text* (-> line speaker))) (get-speaker *subtitle3-text* (-> line speaker))) + (if convert-to-korean? (convert-korean-text (-> line text)) (-> line text)))) + (else + (string-format "~S" (if convert-to-korean? (convert-korean-text (-> line text)) (-> line text)))))) *temp-string*) (defbehavior current-subtitle3-pos subtitle3 ((id sound-id)) @@ -475,9 +483,9 @@ (when (= (gui-status active) (get-status *gui-control* (-> self gui-id))) (true! subtitles-drawn?) (protect (*display-text-box*) - (set! *display-text-box* (or *display-text-box* PC_SUBTITLE_DEBUG)) - (set-speaker-color (-> line-queue elts i line speaker)) - (print-game-text *temp-string* (-> self font) #f 44 (bucket-id debug-no-zbuf2)))) + (set! *display-text-box* (or *display-text-box* PC_SUBTITLE_DEBUG)) + (set-speaker-color (-> line-queue elts i line speaker)) + (print-game-text *temp-string* (-> self font) #f 44 (bucket-id debug-no-zbuf2)))) ) ;; save this for later usage @@ -846,7 +854,7 @@ (set! (-> self have-subtitles?) #f) (set! (-> self movie-mode?) #f) - (set! (-> self movie-line) (new 'process 'string (+ 7 (* 15 16)) (the string #f))) + (set! (-> self movie-line) (new 'process 'string 1024 (the string #f))) (set! (-> self current-debug-scene) 0) (set! (-> self current-debug-line) 0) diff --git a/goalc/compiler/compilation/CompilerControl.cpp b/goalc/compiler/compilation/CompilerControl.cpp index 61929e5408..8c77c96b7a 100644 --- a/goalc/compiler/compilation/CompilerControl.cpp +++ b/goalc/compiler/compilation/CompilerControl.cpp @@ -619,19 +619,12 @@ std::vector Compiler::lookup_symbol_info_by_prefix( std::set Compiler::lookup_symbol_names_starting_with(const std::string& prefix, int max_count) const { - if (m_goos.reader.check_string_is_valid(prefix)) { - return m_symbol_info.lookup_names_starting_with(prefix, max_count); - } - return {}; + return m_symbol_info.lookup_names_starting_with(prefix, max_count); } std::vector Compiler::lookup_exact_name_info( const std::string& name) const { - if (m_goos.reader.check_string_is_valid(name)) { - return m_symbol_info.lookup_exact_name(name); - } else { - return {}; - } + return m_symbol_info.lookup_exact_name(name); } std::optional Compiler::lookup_typespec(const std::string& symbol_name) { diff --git a/goalc/data_compiler/game_text_common.cpp b/goalc/data_compiler/game_text_common.cpp index 91213a3399..1fc3c53339 100644 --- a/goalc/data_compiler/game_text_common.cpp +++ b/goalc/data_compiler/game_text_common.cpp @@ -21,8 +21,9 @@ #include "common/goos/ParseHelpers.h" #include "common/goos/Reader.h" #include "common/util/FileUtil.h" -#include "common/util/FontUtils.h" +#include "common/util/font/font_utils.h" #include "common/util/json_util.h" +#include "common/util/string_util.h" #include "game/runtime.h" @@ -30,19 +31,6 @@ namespace { -// TODO - replace with str_util::to_upper? -std::string uppercase(const std::string& in) { - std::string result; - result.reserve(in.size()); - for (auto c : in) { - if (c >= 'a' && c <= 'z') { - c -= ('a' - 'A'); - } - result.push_back(c); - } - return result; -} - /* (deftype game-text (structure) ((id uint32 :offset-assert 0) @@ -86,8 +74,8 @@ void compile_text(GameTextDB& db, const std::string& output_prefix) { file_util::create_dir_if_needed(file_util::get_file_path({"out", output_prefix, "iso"})); file_util::write_binary_file( - file_util::get_file_path( - {"out", output_prefix, "iso", fmt::format("{}{}.TXT", lang, uppercase(group_name))}), + file_util::get_file_path({"out", output_prefix, "iso", + fmt::format("{}{}.TXT", lang, str_util::to_upper(group_name))}), data.data(), data.size()); } } @@ -157,8 +145,8 @@ void compile_subtitles_v1(GameSubtitleDB& db, const std::string& output_prefix) file_util::create_dir_if_needed(file_util::get_file_path({"out", output_prefix, "iso"})); file_util::write_binary_file( - file_util::get_file_path( - {"out", output_prefix, "iso", fmt::format("{}{}.TXT", lang, uppercase("subtit"))}), + file_util::get_file_path({"out", output_prefix, "iso", + fmt::format("{}{}.TXT", lang, str_util::to_upper("subtit"))}), data.data(), data.size()); } } @@ -202,7 +190,12 @@ void compile_subtitles_v2(GameSubtitleDB& db, const std::string& output_prefix) if (line.metadata.merge) { gen.add_symbol_link("#f"); } else { - gen.add_ref_to_string_in_pool(font->convert_utf8_to_game(line.text)); // line text + if (font->is_language_id_korean(lang)) { + gen.add_ref_to_string_in_pool( + font->convert_utf8_to_game_korean(line.text)); // line text + } else { + gen.add_ref_to_string_in_pool(font->convert_utf8_to_game(line.text)); // line text + } } u16 speaker = bank->speaker_enum_value_from_name(line.metadata.speaker); u16 flags = 0; @@ -218,7 +211,11 @@ void compile_subtitles_v2(GameSubtitleDB& db, const std::string& output_prefix) for (auto& speaker_localized : localized_speakers) { // No need to check for invalid speakers here, they are checked at the scene line level above // and throw an error - gen.add_ref_to_string_in_pool(font->convert_utf8_to_game(speaker_localized)); + if (font->is_language_id_korean(lang)) { + gen.add_ref_to_string_in_pool(font->convert_utf8_to_game_korean(speaker_localized)); + } else { + gen.add_ref_to_string_in_pool(font->convert_utf8_to_game(speaker_localized)); + } } auto data = gen.generate_v2(); @@ -226,8 +223,8 @@ void compile_subtitles_v2(GameSubtitleDB& db, const std::string& output_prefix) file_util::create_dir_if_needed(file_util::get_file_path({"out", output_prefix, "iso"})); auto file_name = get_text_version_name(bank->m_text_version) == "jak3" ? "subti3" : "subti2"; file_util::write_binary_file( - file_util::get_file_path( - {"out", output_prefix, "iso", fmt::format("{}{}.TXT", lang, uppercase(file_name))}), + file_util::get_file_path({"out", output_prefix, "iso", + fmt::format("{}{}.TXT", lang, str_util::to_upper(file_name))}), data.data(), data.size()); } } diff --git a/goalc/data_compiler/game_text_common.h b/goalc/data_compiler/game_text_common.h index 75b7e32303..0e490e4733 100644 --- a/goalc/data_compiler/game_text_common.h +++ b/goalc/data_compiler/game_text_common.h @@ -10,7 +10,7 @@ #include "common/serialization/subtitles/subtitles_v2.h" #include "common/serialization/text/text_ser.h" #include "common/util/Assert.h" -#include "common/util/FontUtils.h" +#include "common/util/font/font_utils.h" void compile_game_text(const std::vector& filenames, GameTextDB& db, diff --git a/goalc/emitter/CodeTester.cpp b/goalc/emitter/CodeTester.cpp index 64f9da3fd8..fece3b8c69 100644 --- a/goalc/emitter/CodeTester.cpp +++ b/goalc/emitter/CodeTester.cpp @@ -119,7 +119,9 @@ void CodeTester::clear() { * Execute the buffered code with no arguments, return the value of RAX. */ u64 CodeTester::execute() { + // clang-format off return ((u64(*)())code_buffer)(); + // clang-format on } /*! @@ -127,7 +129,9 @@ u64 CodeTester::execute() { * arguments will appear in (will handle windows/linux differences) */ u64 CodeTester::execute(u64 in0, u64 in1, u64 in2, u64 in3) { + // clang-format off return ((u64(*)(u64, u64, u64, u64))code_buffer)(in0, in1, in2, in3); + // clang-format on } /*! diff --git a/goalc/emitter/CodeTester.h b/goalc/emitter/CodeTester.h index aaa9650856..a25abef5f0 100644 --- a/goalc/emitter/CodeTester.h +++ b/goalc/emitter/CodeTester.h @@ -40,7 +40,9 @@ class CodeTester { */ template T execute_ret(u64 in0, u64 in1, u64 in2, u64 in3) { + // clang-format off u64 result_u64 = ((u64(*)(u64, u64, u64, u64))code_buffer)(in0, in1, in2, in3); + // clang-format on T result_T; memcpy(&result_T, &result_u64, sizeof(T)); return result_T; diff --git a/goalc/main.cpp b/goalc/main.cpp index c9c54f5c62..c7e5952551 100644 --- a/goalc/main.cpp +++ b/goalc/main.cpp @@ -6,6 +6,7 @@ #include "common/repl/repl_wrapper.h" #include "common/util/FileUtil.h" #include "common/util/diff.h" +#include "common/util/font/font_utils_korean.h" #include "common/util/string_util.h" #include "common/util/term_util.h" #include "common/util/unicode_util.h" diff --git a/scripts/analyze_korean.py b/scripts/analyze_korean.py new file mode 100644 index 0000000000..2713b1e2cc --- /dev/null +++ b/scripts/analyze_korean.py @@ -0,0 +1,1400 @@ +# The idea is to parse through all of the game's korean strings and +# determine the glyph combinations that are used to construct the syllable blocks + +# In terms of font setting, korean syllable blocks have 6 main configurations +# not all jamos are relevant for all these configurations, which reduces the complexity +# For example, the first 3 configurations involve no third jamo. + +# 1 (2) - left -> right. For example 가 +# 2 (2) - top -> middle. For example 고 +# 3 (2) - left + right + middle. For example 과 +# +# 4 (3) - left + right + bottom (no combined middle). For example 갈 +# 5 (3) - top down. For example 골 +# 6 (3) - left + right + bottom with middle. For example 괄 + +# Thinking about the characters this way eliminates a ton of permutations +# and allows us to use existing glyphs to fill in the gaps + +# The hope is that by analyzing all of the korean text, we can atleast find where every glyph is used +# and then any glyphs left over we can do manually. + +# read in the `game_text.txt` file and extract all the korean strings +from itertools import product +from pprint import pprint +import json + +with open( + "../decompiler_out/jak2/assets/game_text.txt", mode="r", encoding="utf-8" +) as f: + game_text_lines = f.readlines() + +korean_lines = {} +i = 0 +while i < len(game_text_lines): + curr_line = game_text_lines[i].strip() + if curr_line.startswith("(#x"): + id = curr_line.split("(#x")[1] + korean_lines[id] = game_text_lines[i + 7].strip().replace("\\c", ",0x")[2:-1] + i = i + 1 + +# also parse subtitles +with open( + "../decompiler_out/jak2/assets/subtitles_raw.txt", mode="r", encoding="utf-8" +) as f: + subtitle_text_lines = f.readlines() +for line in subtitle_text_lines: + parts = line.split("::") + text = parts[2].replace('"', "").replace(" ", ",") + # pad with 0s for single hex digits + for c in [ + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "a", + "b", + "c", + "d", + "e", + "f", + ]: + text = text.replace(f"0x{c},", f"0x0{c},") + key = f"{parts[0]}_{parts[1]}" + korean_lines[key] = text[:-1] + +print(f"Analyzing {len(korean_lines)} lines of korean text") + +# we will fill up this structure, which will allow us to recreate / fill in the gaps in their korean encoding +jamo_combinations = { + # jamo : 6 orientations + # if the orientation is irrelvevant, null instead of a list + # the reason we use lists is because multiple glyphs may be used to represent the same jamo + # even in the same orientation, depending on the surrounding characters + # + # we will store these surrounding "context" characters to deduce a pattern at the end + # ie. 0x06 is always used for ᄀ unless if it becomes before ᅦ then it uses 0x33 + # + # Choseong (initial) + "ᄀ": [[], [], [], [], [], []], + "ᄁ": [[], [], [], [], [], []], + "ᄂ": [[], [], [], [], [], []], + "ᄃ": [[], [], [], [], [], []], + "ᄄ": [[], [], [], [], [], []], + "ᄅ": [[], [], [], [], [], []], + "ᄆ": [[], [], [], [], [], []], + "ᄇ": [[], [], [], [], [], []], + "ᄈ": [[], [], [], [], [], []], + "ᄉ": [[], [], [], [], [], []], + "ᄊ": [[], [], [], [], [], []], + "ᄋ": [[], [], [], [], [], []], + "ᄌ": [[], [], [], [], [], []], + "ᄍ": [[], [], [], [], [], []], + "ᄎ": [[], [], [], [], [], []], + "ᄏ": [[], [], [], [], [], []], + "ᄐ": [[], [], [], [], [], []], + "ᄑ": [[], [], [], [], [], []], + "ᄒ": [[], [], [], [], [], []], + # Jungseong (middle) + # - verticals + "ᅵ": [[], None, None, [], None, None], + "ᅡ": [[], None, None, [], None, None], + "ᅢ": [[], None, None, [], None, None], + "ᅣ": [[], None, None, [], None, None], + "ᅤ": [[], None, None, [], None, None], + "ᅥ": [[], None, None, [], None, None], + "ᅦ": [[], None, None, [], None, None], + "ᅧ": [[], None, None, [], None, None], + "ᅨ": [[], None, None, [], None, None], + # - horizontals + "ᅩ": [None, [], None, None, [], None], + "ᅭ": [None, [], None, None, [], None], + "ᅮ": [None, [], None, None, [], None], + "ᅲ": [None, [], None, None, [], None], + "ᅳ": [None, [], None, None, [], None], + # - combinations + "ᅪ": [None, None, [], None, None, []], + "ᅫ": [None, None, [], None, None, []], + "ᅬ": [None, None, [], None, None, []], + "ᅯ": [None, None, [], None, None, []], + "ᅰ": [None, None, [], None, None, []], + "ᅱ": [None, None, [], None, None, []], + "ᅴ": [None, None, [], None, None, []], + # Jongseong (final) + "ᆨ": [None, None, None, [], [], []], + "ᆩ": [None, None, None, [], [], []], + "ᆪ": [None, None, None, [], [], []], + "ᆫ": [None, None, None, [], [], []], + "ᆬ": [None, None, None, [], [], []], + "ᆭ": [None, None, None, [], [], []], + "ᆮ": [None, None, None, [], [], []], + "ᆯ": [None, None, None, [], [], []], + "ᆰ": [None, None, None, [], [], []], + "ᆱ": [None, None, None, [], [], []], + "ᆲ": [None, None, None, [], [], []], + "ᆳ": [None, None, None, [], [], []], + "ᆴ": [None, None, None, [], [], []], + "ᆵ": [None, None, None, [], [], []], + "ᆶ": [None, None, None, [], [], []], + "ᆷ": [None, None, None, [], [], []], + "ᆸ": [None, None, None, [], [], []], + "ᆹ": [None, None, None, [], [], []], + "ᆺ": [None, None, None, [], [], []], + "ᆻ": [None, None, None, [], [], []], + "ᆼ": [None, None, None, [], [], []], + "ᆽ": [None, None, None, [], [], []], + "ᆾ": [None, None, None, [], [], []], + "ᆿ": [None, None, None, [], [], []], + "ᇀ": [None, None, None, [], [], []], + "ᇁ": [None, None, None, [], [], []], + "ᇂ": [None, None, None, [], [], []], +} +# we will be reading byte strings from the game, these correspond to the font glyphs +# we can deduce all of these +jamo_glyph_mappings = { + "0x06": "ᄀ", + "0x07": "ᄁ", + "0x08": "ᄂ", + "0x09": "ᄃ", + "0x0a": "ᄄ", + "0x0b": "ᄅ", + "0x0c": "ᄆ", + "0x0d": "ᄇ", + "0x0e": "ᄈ", + "0x0f": "ᄋ", + "0x10": "ᄌ", + "0x11": "ᄍ", + "0x12": "ᄏ", + "0x13": "ᄐ", + "0x14": "ᄑ", + "0x15": "ᅡ", + "0x16": "ᅣ", + "0x17": "ᅵ", + "0x18": "ᅥ", + "0x19": "ᅧ", + "0x1a": "ᅡ", + "0x1b": "ᅣ", + "0x1c": "ᅵ", + "0x1d": "ᅥ", + "0x1e": "ᅧ", + "0x1f": "ᄂ", + "0x20": "ᄉ", + "0x21": "ᄊ", + "0x22": "ᅥ", + "0x23": "ᅧ", + "0x24": "ᅥ", + "0x25": "ᅧ", + "0x26": "ᄃ", + "0x27": "ᄄ", + "0x28": "ᄅ", + "0x29": "ᄐ", + "0x2a": "ᄑ", + "0x2b": "ᅧ", + "0x2c": "ᅧ", + "0x2d": "ᄎ", + "0x2e": "ᄒ", + "0x2f": "ᅥ", + "0x30": "ᅧ", + "0x31": "ᅥ", + "0x32": "ᅧ", + "0x33": "ᄀ", + "0x34": "ᄁ", + "0x35": "ᄂ", + "0x36": "ᄃ", + "0x37": "ᄄ", + "0x38": "ᄅ", + "0x39": "ᄆ", + "0x3a": "ᄇ", + "0x3b": "ᄈ", + "0x3c": "ᄋ", + "0x3d": "ᄌ", + "0x3e": "ᄍ", + "0x3f": "ᄏ", + "0x40": "ᄐ", + "0x41": "ᄑ", + "0x42": "ᅢ", + "0x43": "ᅤ", + "0x44": "ᅦ", + "0x45": "ᅨ", + "0x46": "ᅢ", + "0x47": "ᅤ", + "0x48": "ᅦ", + "0x49": "ᅨ", + "0x4a": "ᄂ", + "0x4b": "ᄉ", + "0x4c": "ᄊ", + "0x4d": "ᅦ", + "0x4e": "ᅨ", + "0x4f": "ᅦ", + "0x50": "ᅨ", + "0x51": "ᄃ", + "0x52": "ᄄ", + "0x53": "ᄅ", + "0x54": "ᄐ", + "0x55": "ᄑ", + "0x56": "ᅨ", + "0x57": "ᅨ", + "0x58": "ᄎ", + "0x59": "ᄒ", + "0x5a": "ᅦ", + "0x5b": "ᅨ", + "0x5c": "ᅦ", + "0x5d": "ᅨ", + "0x5e": "ᄀ", + "0x5f": "ᄏ", + "0x60": "ᅩ", + "0x61": "ᅭ", + "0x62": "ᅩ", + "0x63": "ᅭ", + "0x64": ["ᄁ", "ᅫ"], + "0x65": ["ᄁ", "ᅩ"], + "0x66": ["ᄁ", "ᅩ"], + "0x67": ["ᄁ", "ᅭ"], + "0x68": "ᄁ", + "0x69": "ᄂ", + "0x6a": "ᅳ", + "0x6b": "ᅮ", + "0x6c": "ᅲ", + "0x6d": "ᅳ", + "0x6e": "ᅮ", + "0x6f": "ᅲ", + "0x70": "ᄃ", + "0x71": "ᄄ", + "0x72": "ᄅ", + "0x73": "ᄆ", + "0x74": "ᄇ", + "0x75": "ᄈ", + "0x76": "ᄉ", + "0x77": "ᄊ", + "0x78": "ᄋ", + "0x79": "ᄌ", + "0x7a": "ᄍ", + "0x7b": "ᄎ", + "0x7c": "ᄐ", + "0x7d": "ᄑ", + "0x7e": "ᄒ", + "0x7f": "ᅩ", + "0x80": "ᅭ", + "0x81": "ᅳ", + "0x82": "ᅩ", + "0x83": "ᅭ", + "0x84": "ᅳ", + "0x85": "ᅮ", + "0x86": "ᅲ", + "0x87": "ᅮ", + "0x88": "ᅲ", + "0x89": ["ᅮ", "ᆫ"], + "0x8a": ["ᅲ", "ᆫ"], + "0x8b": "ᄀ", + "0x8c": "ᄏ", + "0x8d": "ᅩ", + "0x8e": "ᅩ", + "0x8f": ["ᄁ", "ᅩ"], + "0x90": ["ᄁ", "ᅩ"], + "0x91": "ᄁ", + "0x92": "ᄂ", + "0x93": "ᄃ", + "0x94": "ᄄ", + "0x95": "ᄅ", + "0x96": "ᄆ", + "0x97": "ᄇ", + "0x98": "ᄈ", + "0x99": "ᄉ", + "0x9a": "ᄊ", + "0x9b": "ᄋ", + "0x9c": "ᄌ", + "0x9d": "ᄍ", + "0x9e": "ᄎ", + "0x9f": "ᄐ", + "0xa0": "ᄑ", + "0xa1": "ᄒ", + "0xa2": "ᅩ", + "0xa3": "ᅳ", + "0xa4": "ᅩ", + "0xa5": "ᅳ", + "0xa6": "ᅡ", + "0xa7": "ᅵ", + "0xa8": "ᅡ", + "0xa9": "ᅵ", + "0xaa": "ᅯ", + "0xab": "ᅱ", + "0xac": "ᅯ", + "0xad": "ᅱ", + "0xae": "ᄀ", + "0xaf": "ᄏ", + "0xb0": "ᅫ", + "0xb1": "ᅫ", + "0xb2": "ᄆ", + "0xb3": "ᄁ", + "0xb4": "ᄂ", + "0xb5": "ᄃ", + "0xb6": "ᄄ", + "0xb7": "ᄅ", + "0xb8": "ᄇ", + "0xb9": "ᄉ", + "0xba": "ᄊ", + "0xbb": "ᄋ", + "0xbc": "ᄌ", + "0xbd": "ᄍ", + "0xbe": "ᄎ", + "0xbf": "ᄐ", + "0xc0": "ᄒ", + "0xc1": "ᅫ", + "0xc2": "ᅫ", + "0xc3": "ᅰ", + "0xc4": "ᅰ", + "0xc5": "ᆨ", + "0xc6": "ᆩ", + "0xc7": "ᆪ", + "0xc8": "ᆫ", + "0xc9": "ᆬ", + "0xca": "ᆭ", + "0xcb": "ᆮ", + "0xcc": "ᆯ", + "0xcd": "ᆰ", + "0xce": "ᆱ", + "0xcf": "ᆲ", + "0xd0": "ᆴ", + "0xd1": "ᆶ", + "0xd2": "ᆷ", + "0xd3": "ᆸ", + "0xd4": "ᆹ", + "0xd5": "ᆺ", + "0xd6": "ᆻ", + "0xd7": "ᆼ", + "0xd8": "ᆽ", + "0xd9": "ᆾ", + "0xda": "ᆿ", + "0xdb": "ᇀ", + "0xdc": "ᇁ", + "0xdd": "ᇂ", + "0xde": "ᆨ", + "0xdf": "ᆩ", + "0xe0": "ᆪ", + "0xe1": "ᆫ", + "0xe2": "ᆭ", + "0xe3": "ᆮ", + "0xe4": "ᆯ", + "0xe5": "ᆰ", + "0xe6": "ᆱ", + "0xe7": "ᆳ", + "0xe8": "ᆴ", + "0xe9": "ᆵ", + "0xea": "ᆶ", + "0xeb": "ᆷ", + "0xec": "ᆸ", + "0xed": "ᆺ", + "0xee": "ᆼ", + "0xef": "ᆽ", + "0xf0": "ᆾ", + "0xf1": "ᆿ", + "0xf2": "ᇀ", + "0xf3": "ᇁ", + "0xf4": "ᇂ", + "0xf5": "ᆨ", + "0xf6": "ᆫ", + "0xf7": "ᆯ", + "0xf8": "ᆱ", + "0xf9": "ᆷ", + "0xfa": "ᆸ", + "0xfb": "ᆺ", + "0xfc": "ᆻ", + "0xfd": "ᆼ", + "0xfe": "ᆨ", + "0xff": "ᆫ", + "extra_0x86": "ᆯ", + "extra_0x87": "ᆷ", + "extra_0x88": "ᆸ", + "extra_0x89": "ᆺ", + "extra_0x8a": "ᆻ", + "extra_0x8b": "ᆼ", +} +jamo_groupings = { + "initial": [ + "ᄀ", + "ᄁ", + "ᄂ", + "ᄃ", + "ᄄ", + "ᄅ", + "ᄆ", + "ᄇ", + "ᄈ", + "ᄉ", + "ᄊ", + "ᄋ", + "ᄌ", + "ᄍ", + "ᄎ", + "ᄏ", + "ᄐ", + "ᄑ", + "ᄒ", + ], + "median": [ + "ᅡ", + "ᅢ", + "ᅣ", + "ᅤ", + "ᅥ", + "ᅦ", + "ᅧ", + "ᅨ", + "ᅩ", + "ᅪ", + "ᅫ", + "ᅬ", + "ᅭ", + "ᅮ", + "ᅯ", + "ᅰ", + "ᅱ", + "ᅲ", + "ᅳ", + "ᅴ", + "ᅵ", + ], + "final": [ + "ᆨ", + "ᆩ", + "ᆪ", + "ᆫ", + "ᆬ", + "ᆭ", + "ᆮ", + "ᆯ", + "ᆰ", + "ᆱ", + "ᆲ", + "ᆳ", + "ᆴ", + "ᆵ", + "ᆶ", + "ᆷ", + "ᆸ", + "ᆹ", + "ᆺ", + "ᆻ", + "ᆼ", + "ᆽ", + "ᆾ", + "ᆿ", + "ᇀ", + "ᇁ", + "ᇂ", + ], +} +median_jamo_groupings = { + "right": ["ᅡ", "ᅢ", "ᅣ", "ᅤ", "ᅥ", "ᅦ", "ᅧ", "ᅨ", "ᅵ"], + "bottom": ["ᅩ", "ᅭ", "ᅮ", "ᅲ", "ᅳ"], + "combined": ["ᅪ", "ᅫ", "ᅬ", "ᅯ", "ᅰ", "ᅱ", "ᅴ"], +} +median_combos = { + "ᅪ": ["ᅩ", "ᅡ"], + "ᅫ": ["ᅩ", "ᅢ"], + "ᅬ": ["ᅩ", "ᅵ"], + "ᅯ": ["ᅮ", "ᅥ"], + "ᅰ": ["ᅮ", "ᅦ"], + "ᅱ": ["ᅮ", "ᅵ"], + "ᅴ": ["ᅳ", "ᅵ"], +} + + +def derive_syllable_block_info(glyph_list): + jamos = [] + # iterate the glyphs, convert them into their mappings + for glyph in glyph_list: + if glyph not in jamo_glyph_mappings: + print(f"{glyph} not in mapping dictionary, fix it") + exit(1) + mapping = jamo_glyph_mappings[glyph] + # TODO - ugly for figuring out what glyphs by jamo! + if isinstance(mapping, list): + # there are a few select glyphs that are multiple jamos + for jamo in mapping: + jamos.append([jamo, glyph]) + else: + jamos.append([mapping, glyph]) + # Associate each jamo with it's initial/median/final grouping + jamo_info = [] + found_medians = [] + for jamo_and_glyph in jamos: + jamo = jamo_and_glyph[0] + glyph = jamo_and_glyph[1] + for [grouping, jamos_in_group] in jamo_groupings.items(): + if jamo in jamos_in_group: + jamo_grouping = grouping + break + if jamo_grouping == "median": + found_medians.append([jamo, glyph]) + jamo_info.append({"jamo": jamo, "grouping": jamo_grouping, "glyph": glyph}) + if len(found_medians) > 2: + print(f"found more than 2 median vowels in {jamo_info}") + exit(1) + # Consolidate median vowels, as jak typically typically draws them as a combination of two + # glyphs + if len(found_medians) > 1: + combined_median = None + combined_glyphs = None + for [vowel, vowel_parts] in median_combos.items(): + if ( + found_medians[0][0] in vowel_parts + and found_medians[1][0] in vowel_parts + ): + combined_median = vowel + combined_glyphs = [found_medians[0][1], found_medians[1][1]] + break + if combined_median == None: + print(f"unable to combine median in {jamo_info}") + exit(1) + new_jamo_info = [] + skip_rest = False + for info in jamo_info: + if info["grouping"] != "median": + new_jamo_info.append(info) + elif not skip_rest: + new_jamo_info.append( + { + "jamo": combined_median, + "grouping": "median", + "glyph": combined_glyphs, + } + ) + skip_rest = True + jamo_info = new_jamo_info + # Now we can consolidate median vowels and determine the orientation + if len(jamo_info) == 2: + for [grouping, jamos_in_group] in median_jamo_groupings.items(): + if jamo_info[1]["jamo"] in jamos_in_group: + median_group = grouping + break + if median_group == "right": + writing_orientation = 0 + elif median_group == "bottom": + writing_orientation = 1 + elif median_group == "combined": + writing_orientation = 2 + else: + print(f"couldnt figure out median group for {jamo_info}") + exit(1) + elif len(jamo_info) == 3: + for [grouping, jamos_in_group] in median_jamo_groupings.items(): + if jamo_info[1]["jamo"] in jamos_in_group: + median_group = grouping + break + if median_group == "right": + writing_orientation = 3 + elif median_group == "bottom": + writing_orientation = 4 + elif median_group == "combined": + writing_orientation = 5 + else: + print(f"couldnt figure out median group for {jamo_info}") + exit(1) + else: + print(f"unhandled jamo configuration {jamo_info}") + exit(1) + return {"writingOrientation": writing_orientation, "jamos": jamo_info} + + +# finally start going through the real text to figure out the mappings +total_syllable_blocks = 0 +for [id, game_text_line] in korean_lines.items(): + # print() + # print(game_text_line) + # split the bytes into characters, sound the alarm if we see a `0x05` + # NOTE - hopefully this is not a hack (seems like the font textures dont start until 0x6...how conveniant!) + game_text_line = game_text_line.replace("0x05,", "extra_") + text_bytes = game_text_line.split(",") + syllable_blocks = [] + i = 0 + while i < len(text_bytes): + curr_byte = text_bytes[i] + if curr_byte == "0x04": + total_syllable_blocks = total_syllable_blocks + 1 + expected_num_glyphs = int(text_bytes[i + 1], 16) + syllable_blocks.append( + { + "numGlyphs": expected_num_glyphs, + "rawGlyphs": text_bytes[i + 2 : i + 2 + expected_num_glyphs], + } + ) + i = i + 2 + expected_num_glyphs + continue + i = i + 1 + # now we will inspect the choice of glyphs (which are individual jamo or jamo combinations) + # to determine the jamo and the writing orientation + for block in syllable_blocks: + jamo_info = derive_syllable_block_info(block["rawGlyphs"]) + block["jamos"] = jamo_info["jamos"] + block["writingOrientation"] = jamo_info["writingOrientation"] + + # pprint(syllable_blocks) + + # The (almost) final step, store this information in our big jamo combination + # "database" + # + # We now effectively have an encoding, and we can process that to further refine it and + # see what we have to do manually + for block in syllable_blocks: + writing_orientation = block["writingOrientation"] + for jamo in block["jamos"]: + jamo_entry = jamo_combinations[jamo["jamo"]] + if jamo_entry[writing_orientation] == None: + print(f"something is very wrong with {block}") + exit(1) + new_entry = {"glyph": jamo["glyph"], "context": block["jamos"]} + if new_entry not in jamo_entry[writing_orientation]: + jamo_entry[writing_orientation].append(new_entry) + +# Print some stats before finalizing the result +empty_cells = 0 +glyph_list = set(jamo_glyph_mappings.keys()) +for [jamo, orientations] in jamo_combinations.items(): + for orientation in orientations: + if orientation is not None: + if len(orientation) == 0: + empty_cells = empty_cells + 1 + for entry in orientation: + if isinstance(entry["glyph"], list): + for glyph in entry["glyph"]: + glyph_list.discard(glyph) + else: + glyph_list.discard(entry["glyph"]) + +print() +print(f"Analyzed {total_syllable_blocks} syllable blocks") +print(f"{empty_cells} empty jamo cells\n") +print(f"Did not see {len(glyph_list)} out of {len(jamo_glyph_mappings.keys())} glyphs:") + +# with open("./jamo-db-before.json", mode="w", encoding="utf-8") as f: +# f.write(json.dumps(jamo_combinations, indent=2)) + +def format_alternative(curr_jamo, curr_glyph, full_glyph_context): + # Make a string key that represents the unicode jamos with a placeholder to represent + # the jamo we are dealing with + # And the value is the glyph itself that gets used to draw this combination of jamos + key_parts = [] + for glyph in full_glyph_context: + if curr_jamo == glyph["jamo"]: + key_parts.append("") + else: + key_parts.append(glyph["jamo"]) + formatted_curr_glyph = curr_glyph + if isinstance(curr_glyph, list): + formatted_curr_glyph = ",".join(curr_glyph) + return [",".join(key_parts), formatted_curr_glyph] + + +# Enumerate through the db, and consolidate duplicates / find the most common +# jamo for each position +for [jamo, orientations] in jamo_combinations.items(): + for [index, orientation] in enumerate(orientations): + if orientation is not None: + result = {"defaultGlyph": "", "alternatives": {}} + glyph_frequencies = {} + alternatives = {} + if len(orientation) == 0: + empty_cells = empty_cells + 1 + continue + for entry in orientation: + glyph_key = entry["glyph"] + if isinstance(entry["glyph"], list): + glyph_key = ",".join(entry["glyph"]) + if glyph_key not in glyph_frequencies: + glyph_frequencies[glyph_key] = 0 + glyph_frequencies[glyph_key] = glyph_frequencies[glyph_key] + 1 + + if glyph_key not in alternatives: + alternatives[glyph_key] = [] + alternatives[glyph_key].append( + format_alternative(jamo, entry["glyph"], entry["context"]) + ) + # Consolidate + most_common_glyph = "" + most_common_glyph_times = -1 + for [glyph, freq] in glyph_frequencies.items(): + if freq > most_common_glyph_times: + most_common_glyph_times = freq + most_common_glyph = glyph + result["defaultGlyph"] = most_common_glyph + # TODO - handle if this is multiple glyphs + del alternatives[most_common_glyph] + # Flatten alternatives + for [glyph, alternatives] in alternatives.items(): + for alternative in alternatives: + result["alternatives"][alternative[0]] = alternative[1] + # Overwrite the db value + jamo_combinations[jamo][index] = result + +# These are found MANUALLY by iterating through all combinations and finding alternatives +# for jamo combinations to be legible +manual_encoding_additions = { + # Choseong (initial) + "ᄀ": [ + [], + [], + ["0xb3:,ᅫ"], + ["0x33:,ᅤ,*", "0x33:,ᅦ,*", "0x33:,ᅨ,*"], + [], + ["0xae:,ᅴ,*"], + ], + "ᄁ": [ + ["!0x34", "0x07:,ᅵ"], + ["0x67:,ᅭ"], + [], + ["!0x34"], + ["!0x65", "0x68:,ᅭ,*", "0x68:,ᅮ,*", "0x68:,ᅲ,*", "0x68:,ᅳ,*"], + [ + "!0x91", + "0x8f:,ᅪ,*", + "0x64:,ᅫ,*", + "0xb3:,ᅰ,*", + "0x8f:,ᅬ,*", + ], + ], + "ᄂ": [ + ["0x1f:,ᅡ", "0x1f:,ᅣ", "0x4a:,ᅨ", "0x35:,ᅤ"], + [], + ["0xb4:,ᅫ", "0xb4:,ᅰ"], + [ + "0x35:,ᅢ,*", + "0x35:,ᅤ,*", + "0x35:,ᅦ,*", + "0x1f:,ᅧ,*", + "0x1f:,ᅥ,*", + "0x4a:,ᅨ,*", + ], + [], + ["0xb4:,ᅪ,*", "0xb4:,ᅫ,*", "0xb4:,ᅰ,*"], + ], + "ᄃ": [ + ["0x26:,ᅡ", "0x36:,ᅤ", "0x26:,ᅣ", "0x36:,ᅧ", "0x51:,ᅨ"], + [], + ["0xb5:,ᅪ", "0xb5:,ᅰ"], + [ + "0x36:,ᅢ,*", + "0x36:,ᅤ,*", + "0x51:,ᅦ,*", + "0x26:,ᅧ,*", + "0x51:,ᅨ,*", + ], + [], + ["0xb5:,ᅪ,*", "0xb5:,ᅫ,*", "0xb5:,ᅰ,*"], + ], + "ᄄ": [ + [ + "0x27:,ᅡ", + "0x52:,ᅢ", + "0x52:,ᅤ", + "0x27:,ᅣ", + "0x27:,ᅧ", + "0x52:,ᅨ", + "0x27:,ᅵ", + ], + [], + ["0xb6:,ᅪ", "0xb6:,ᅫ", "0xb6:,ᅰ"], + [ + "!0x0a", + "0x52:,ᅢ,*", + "0x52:,ᅣ,*", + "0x52:,ᅤ,*", + "0x52:,ᅦ,*", + "0x52:,ᅧ,*", + "0x52:,ᅨ,*", + ], + [], + ["0xb6:,ᅪ,*", "0xb6:,ᅫ,*", "0xb6:,ᅰ,*"], + ], + "ᄅ": [ + ["0x0b:,ᅣ", "0x38:,ᅤ"], + [], + ["0xb7:,ᅪ", "0xb7:,ᅫ", "0xb7:,ᅰ"], + [ + "0x0b:,ᅵ,*", + "0x0b:,ᅡ,*", + "0x38:,ᅢ,*", + "0x38:,ᅤ,*", + "0x53:,ᅦ,*", + "0x53:,ᅨ,*", + ], + [], + ["0x95", "0xb7:,ᅪ,*", "0xb7:,ᅫ,*", "0xb7:,ᅰ,*"], + ], + "ᄆ": [ + ["0x39:,ᅤ", "0x39:,ᅨ"], + [], + ["0xb2:,ᅪ", "0xb2:,ᅫ", "0xb2:,ᅰ"], + ["0x39:,ᅢ,*", "0x39:,ᅤ,*", "0x39:,ᅦ,*", "0x39:,ᅨ,*"], + [], + ["0xb2:,ᅪ,*", "0xb2:,ᅫ,*", "0xb2:,ᅰ,*"], + ], + "ᄇ": [ + ["0x3a:,ᅤ", "0x3a:,ᅨ"], + [], + ["0xb8:,ᅪ", "0xb8:,ᅫ", "0xb8:,ᅰ"], + ["0x3a:,ᅢ,*", "0x3a:,ᅤ,*", "0x3a:,ᅦ,*", "0x3a:,ᅨ,*"], + [], + ["0xb8:,ᅪ,*", "0xb8:,ᅫ,*", "0xb8:,ᅰ,*"], + ], + "ᄈ": [ + ["!0x3b", "0x0e:,ᅥ", "0x0e:,ᅵ"], + [], + ["0x98"], + [ + "0x3b:,ᅢ,*", + "0x3b:,ᅣ,*", + "0x3b:,ᅤ,*", + "0x3b:,ᅦ,*", + "0x3b:,ᅧ,*", + "0x3b:,ᅨ,*", + ], + [], + ["0x98"], + ], + "ᄉ": [ + ["0x4b:,ᅤ", "0x4b:,ᅨ"], + [], + ["0xb9:,ᅪ", "0xb9:,ᅰ"], + ["0x4b:,ᅢ,*", "0x4b:,ᅤ,*", "0x4b:,ᅦ,*", "0x4b:,ᅨ,*"], + [], + ["0xb9:,ᅪ,*", "0xb9:,ᅫ,*", "0xb9:,ᅰ,*"], + ], + "ᄊ": [ + [ + "0x4c:,ᅢ", + "0x4c:,ᅤ", + "0x4c:,ᅥ", + "0x4c:,ᅧ", + "0x4c:,ᅨ", + ], + [], + ["0xba:,ᅪ", "0xba:,ᅫ", "0xba:,ᅰ"], + [ + "0x4c:,ᅢ,*", + "0x4c:,ᅣ,*", + "0x4c:,ᅤ,*", + "0x4c:,ᅦ,*", + "0x4c:,ᅧ,*", + "0x4c:,ᅨ,*", + ], + [], + ["0x9a", "0xba:,ᅪ,*", "0xba:,ᅫ,*", "0xba:,ᅰ,*"], + ], + "ᄋ": [ + [], + [], + ["0xbb:,ᅪ"], + ["0x3c:,ᅢ,*", "0x3c:,ᅤ,*", "0x3c:,ᅦ,*", "0x3c:,ᅨ,*"], + [], + ["0xbb:,ᅪ,*", "0xbb:,ᅫ,*", "0xbb:,ᅰ,*"], + ], + "ᄌ": [ + ["0x3d:,ᅨ"], + [], + ["0xbc:,ᅪ", "0xbc:,ᅫ", "0xbc:,ᅰ"], + ["0x3d:,ᅢ,*", "0x3d:,ᅤ,*", "0x3d:,ᅦ,*", "0x3d:,ᅨ,*"], + [], + ["0xbc:,ᅪ,*", "0xbc:,ᅫ,*", "0xbc:,ᅰ,*"], + ], + "ᄍ": [ + ["!0x3e", "0x11:,ᅵ"], + [], + ["0xbd:,ᅪ", "0xbd:,ᅫ", "0xbd:,ᅰ"], + [ + "0x3e:,ᅢ,*", + "0x3e:,ᅣ,*", + "0x3e:,ᅤ,*", + "0x3e:,ᅦ,*", + "0x3e:,ᅧ,*", + "0x3e:,ᅨ,*", + "0x3e:,ᅵ,*", + ], + [], + ["0xbd:,ᅪ,*", "0xbd:,ᅫ,*", "0xbd:,ᅰ,*"], + ], + "ᄎ": [ + ["0x58:,ᅤ", "0x58:,ᅨ"], + [], + ["0xbe:,ᅪ", "0xbe:,ᅫ", "0xbe:,ᅰ"], + ["0x58:,ᅢ,*", "0x58:,ᅤ,*", "0x58:,ᅦ,*", "0x58:,ᅨ,*"], + [], + ["0x9e", "0xbe:,ᅪ,*", "0xbe:,ᅫ,*", "0xbe:,ᅰ,*"], + ], + "ᄏ": [ + ["0x3f:,ᅤ", "0x3f:,ᅨ"], + [], + ["0xaf:,ᅪ", "0xaf:,ᅫ", "0xaf:,ᅰ"], + ["0x3f:,ᅢ,*", "0x3f:,ᅤ,*", "0x3f:,ᅦ,*", "0x3f:,ᅨ,*"], + [], + ["0xaf:,ᅪ,*", "0xaf:,ᅫ,*", "0xaf:,ᅰ,*"], + ], + "ᄐ": [ + ["0x13:,ᅣ", "0x40:,ᅤ", "0x54:,ᅨ"], + [], + ["0xbf:,ᅪ", "0xbf:,ᅫ", "0xbf:,ᅰ"], + [ + "0x40:,ᅢ,*", + "0x40:,ᅤ,*", + "0x54:,ᅦ,*", + "0x40:,ᅧ,*", + "0x54:,ᅨ,*", + ], + [], + ["0x9f", "0xbf:,ᅪ,*", "0xbf:,ᅫ,*", "0xbf:,ᅰ,*"], + ], + "ᄑ": [ + [ + "0x2a:,ᅡ", + "0x41:,ᅤ", + "0x2a:,ᅣ", + "0x2a:,ᅧ", + ], + [], + ["0xa0"], + [ + "0x41:,ᅢ,*", + "0x41:,ᅣ,*", + "0x41:,ᅤ,*", + "0x2a:,ᅥ,*", + "0x55:,ᅦ,*", + "0x41:,ᅧ,*", + "0x55:,ᅨ,*", + ], + [], + ["0xa0"], + ], + "ᄒ": [ + ["0x59:,ᅤ"], + [], + ["0xc0:,ᅪ", "0xc0:,ᅫ", "0xc0:,ᅰ"], + [ + "0x59:,ᅡ,*", + "0x59:,ᅢ,*", + "0x59:,ᅣ,*", + "0x59:,ᅤ,*", + "0x59:,ᅦ,*", + "0x59:,ᅧ,*", + "0x59:,ᅨ,*", + ], + [], + ["0xc0:,ᅪ,*", "0xc0:,ᅫ,*", "0xc0:,ᅰ,*"], + ], + # Jungseong (middle) + "ᅡ": [[], None, None, ["0x1a:*,,ᆫ"], None, None], + "ᅢ": [[], None, None, ["0x46:*,,ᆫ"], None, None], + "ᅣ": [ + [], + None, + None, + [], + None, + None, + ], + "ᅤ": [[], None, None, ["0x43", "0x47:*,,ᆫ"], None, None], + "ᅥ": [ + [], + None, + None, + ["0x2f:ᄎ,,*", "0x2f:ᄒ,,*", "0x1d:*[^ᄎ;ᄐ;ᄒ],,ᆫ"], + None, + None, + ], + "ᅦ": [[], None, None, ["0x5a:ᄒ,,*", "0x48:*,,ᆫ"], None, None], + "ᅧ": [ + [], + None, + None, + ["0x25:ᄂ,,*", "0x1e:ᄎ,,*", "0x30:ᄒ,,*", "0x1e:*,,ᆫ"], + None, + None, + ], + "ᅨ": [ + [ + "0x50:ᄂ,", + "0x50:ᄃ,", + "0x5d:ᄄ,", + "0x50:ᄅ,", + "0x50:ᄆ,", + "0x50:ᄈ,", + ], + None, + None, + ["0x49:*,,ᆫ"], + None, + None, + ], + "ᅩ": [ + None, + [ + "0x62:ᄂ,", + "0x62:ᄄ,", + "0x62:ᄅ,", + "0x62:ᄋ,", + "0x62:ᄐ,", + "0x62:ᄒ,", + ], + None, + None, + ["!0x82", "0x82:*,,*"], + None, + ], + "ᅪ": [ + None, + None, + ["0x8e,0xa8:ᄁ,"], + None, + None, + [ + "0x8e,0xa6:ᄀ,,*", + "0x8e,0xa8:ᄀ,,ᆫ", + "0x8f,0xa6:ᄁ,,*", + "0x8f,0xa8:ᄁ,,ᆫ", + ], + ], + "ᅫ": [ + None, + None, + [], + None, + None, + [ + "!0xc1", + "0xc2:*,,ᆫ", + "0x8e,0x42:ᄀ,,*", + "0x8e,0x46:ᄀ,,ᆫ", + "0x64:ᄁ,,*", + "0x64:ᄁ,,ᆫ", + ], + ], + "ᅬ": [ + None, + None, + ["0x8e,0xa9:ᄁ,"], + None, + None, + [ + "0xa2,0xa9:*,,ᆫ", + "0x8e,0xa7:ᄀ,,*", + "0x8e,0xa9:ᄀ,,ᆫ", + "0x8f,0xa7:ᄁ,,*", + "0x8f,0xa9:ᄁ,,ᆫ", + ], + ], + "ᅭ": [ + None, + [ + "0x61:ᄀ,", + "0x67:ᄁ,", + "0x63:ᄂ,", + "0x63:ᄃ,", + "0x63:ᄄ,", + "0x63:ᄅ,", + "0x63:ᄈ,", + "0x63:ᄊ,", + "0x63:ᄋ,", + "0x63:ᄏ,", + "0x63:ᄐ,", + "0x63:ᄒ,", + ], + None, + None, + ["!0x83"], + None, + ], + "ᅮ": [None, ["0x6e:ᄒ,"], None, None, ["0x85:*,,*", "0x89:*,,ᆫ"], None], + "ᅯ": [None, None, [], None, None, ["0xaa:*,,*", "0xac:*,,ᆫ"]], + "ᅰ": [None, None, [], None, None, ["0xc4:*,,ᆫ"]], + "ᅱ": [None, None, [], None, None, ["0xad:*,,ᆫ"]], + "ᅲ": [ + None, + [ + "0x6f:ᄂ,", + "0x6f:ᄄ,", + "0x6f:ᄅ,", + "0x6f:ᄆ,", + "0x6f:ᄇ,", + "0x6f:ᄈ,", + "0x6f:ᄉ,", + "0x6f:ᄊ,", + "0x6f:ᄋ,", + "0x6f:ᄌ,", + "0x6f:ᄍ,", + "0x6f:ᄎ,", + "0x6f:ᄏ,", + "0x6f:ᄐ,", + "0x6f:ᄑ,", + "0x6f:ᄒ,", + ], + None, + None, + ["0x8a:*,,ᆫ"], + None, + ], + "ᅳ": [None, ["0x6d:ᄐ,", "0x6d:ᄒ,"], None, None, ["0x84:*,,*"], None], + "ᅴ": [None, None, [], None, None, ["!0xa3,0xa7", "0xa3,0xa9:*,,ᆫ"]], + "ᅵ": [[], None, None, ["0x1c:*,,ᆫ"], None, None], + # Jongseong (final) + "ᆨ": [None, None, None, [], [], ["!0xfe"]], + "ᆩ": [None, None, None, [], [], ["0xdf"]], + "ᆪ": [None, None, None, ["0xc7"], [], ["0xe0"]], + "ᆫ": [None, None, None, [], ["0xe1:*,*,"], ["!0xff"]], + "ᆬ": [None, None, None, [], ["0xc9"], ["0xc9"]], + "ᆭ": [None, None, None, [], ["0xe2"], ["0xe2"]], + "ᆮ": [None, None, None, [], [], ["0xe3"]], + "ᆯ": [None, None, None, [], [], ["extra_0x86:*,*,"]], + "ᆰ": [None, None, None, [], [], ["0xe5"]], + "ᆱ": [None, None, None, [], [], ["0xf8"]], + "ᆲ": [None, None, None, [], ["0xcf"], ["0xcf"]], + "ᆳ": [None, None, None, ["0xe7"], ["0xe7"], ["0xe7"]], + "ᆴ": [None, None, None, ["0xd0"], ["0xe8"], ["0xe8"]], + "ᆵ": [None, None, None, ["0xe9"], ["0xe9"], ["0xe9"]], + "ᆶ": [None, None, None, [], [], ["0xea"]], + "ᆷ": [None, None, None, [], [], ["extra_0x87", "extra_0x87:*,*,"]], + "ᆸ": [None, None, None, [], [], ["extra_0x88:*,*,"]], + "ᆹ": [None, None, None, [], ["0xd4"], ["0xd4"]], + "ᆺ": [None, None, None, [], [], ["extra_0x89:*,*,"]], + "ᆻ": [None, None, None, [], ["0xfc"], ["extra_0x8a:*,*,"]], + "ᆼ": [None, None, None, [], [], ["extra_0x8b:*,*,"]], + "ᆽ": [None, None, None, [], [], ["0xef"]], + "ᆾ": [None, None, None, [], ["0xf0"], ["0xf0"]], + "ᆿ": [None, None, None, ["0xda"], ["0xf1"], ["0xf1"]], + "ᇀ": [None, None, None, [], [], ["0xf2"]], + "ᇁ": [None, None, None, [], [], ["0xf3"]], + "ᇂ": [None, None, None, [], [], ["0xf4"]], +} + +# Print the results +with open("./jamo-db.json", mode="w", encoding="utf-8") as f: + f.write(json.dumps(jamo_combinations, indent=2)) + +# Fill in the rest of the encoding table with manually identified alternatives / additions +# Most of these are additions, but some override the original encoding (because it looked terrible) +# +# These are provided in a specific formats: +# - 0x01:,ᅤ -- means use 0x01 glyph for drawing the jamo (in position shown, in this case, only before ᅤ +# - 0x01:,* -- means use 0x01 no matter what comes after +# - 0x01:,*[^ᄎ;ᄐ] -- means use 0x01 no matter what comes after (except ᄐ and ᄎ) +# - 0x01,0x02:,* -- sometimes a jamo requires multiple glyphs +# - !0x01 -- means to override the default glyph, this is used very rarely +# - 0x01 -- means to set the default -- some jamos never were used at all. If a default is already set, this should throw an error +# +# Note that all of these changes will override any existing alternatives, so order matters even in these lists +# - 0x01:,* and +# - 0x02:,ᄎ +# will replace the ᄎ involving entry that uses 0x01 because of ordering! +jamo_replacements = { + 0: jamo_groupings["initial"], + 1: jamo_groupings["median"], + 2: jamo_groupings["final"], +} + +added_defaults = 0 +replaced_defaults = 0 +for [jamo, orientations] in jamo_combinations.items(): + for [index, orientation] in enumerate(orientations): + if orientation is None: + continue + new_alternative_list = manual_encoding_additions[jamo][index] + if new_alternative_list is None or len(new_alternative_list) == 0: + continue + # enumerate new list and collect info / generate list of new alternatives + new_default = None + force_default = False + alternative_list = [] + for item in new_alternative_list: + # - !0x01 -- means to override the default glyph, this is used very rarely + # - 0x01 -- means to set the default -- some jamos never were used at all. If a default is already set, this should throw an error + if ":" not in item: + if item.startswith("!"): + force_default = True + new_default = item[1:] + else: + new_default = item + continue + parts = item.split(":") + glyph = parts[0] + pattern = parts[1] + # order matters, so we have to append to a list for now + # 0x01:,ᅤ + if "*" not in pattern: + alternative_list.append({"glyph": glyph, "jamo_combination": pattern}) + # 0x01:,* + else: + # 0x01:,*[^ᄎ;ᄐ] + # exclusion lists + exclusion_list = set() + # we generate all alternatives in order from left-to-right + tokens = pattern.split(",") + # cleanup each item first + new_tokens = [] + for token in tokens: + if token.startswith("*[^"): + for exclude_jamo in token[3:-1].split(","): + exclusion_list.add(exclude_jamo) + new_tokens.append("*") + else: + new_tokens.append(token) + wildcard_indices = [i for i, token in enumerate(tokens) if token == "*"] + filtered_replacements = { + idx: [val for val in lst if val not in exclusion_list] + for idx, lst in jamo_replacements.items() + } + replacement_lists = [filtered_replacements[i] for i in wildcard_indices] + for combo in product(*replacement_lists): + generated = tokens.copy() + for idx, val in zip(wildcard_indices, combo): + generated[idx] = val + alternative_list.append( + {"glyph": glyph, "jamo_combination": ",".join(generated)} + ) + # Ok, now we have our big list of new alternatives + # we go through them one by one, adding them to the existing list + # since alternatives is a map we don't have to concern ourselves with worrying about duplicates + # the last one wins + # + # We also must set the new default if applicable + new_orientation = orientation + if new_default is not None: + if isinstance(new_orientation, list) and len(new_orientation) == 0: + new_orientation = {"defaultGlyph": new_default, "alternatives": {}} + added_defaults = added_defaults + 1 + elif force_default: + new_orientation["defaultGlyph"] = new_default + replaced_defaults = replaced_defaults + 1 + else: + print( + f"Trying to replace the default {new_orientation["defaultGlyph"]} with {new_default} improperly" + ) + exit(1) + # Alternatives + if len(alternative_list) > 0: + for new_alt in alternative_list: + new_orientation["alternatives"][new_alt["jamo_combination"]] = new_alt[ + "glyph" + ] + # Finally, update the DB + jamo_combinations[jamo][index] = new_orientation + +# Print some Stats again! +empty_cells = 0 +new_glyph_list = set(jamo_glyph_mappings.keys()) +for [jamo, orientations] in jamo_combinations.items(): + for orientation in orientations: + if isinstance(orientation, dict): + new_glyph_list.discard(orientation["defaultGlyph"]) + for combo, glyph in orientation["alternatives"].items(): + new_glyph_list.discard(glyph) + elif orientation is not None: + print(f"{jamo} - {orientation}") + empty_cells = empty_cells + 1 + +print() +print(f"Added {added_defaults} defaults") +print(f"Replaced {replaced_defaults} defaults") +print(f"{empty_cells} empty jamo cells\n") +print( + f"Still did not see {len(new_glyph_list)} out of {len(jamo_glyph_mappings.keys())} glyphs:" +) +print( + f"Used an additional {len(new_glyph_list.difference(glyph_list))} glyphs, never seen in the original game!" +) +print("Never Used Glyphs:") +print(new_glyph_list) + +# Print the results +with open("./jamo-db.json", mode="w", encoding="utf-8") as f: + f.write(json.dumps(jamo_combinations, indent=None)) + +# pprint(jamo_combinations) + +# Export some CSV results so that we can fill in the rest of the encoding using excel (easier to keep track of +# what's missing) +# This CSV table will only include the most common for each as: +# - we already have the alternatives, we aren't going to check those +# - we will add a new alternative, only if the common glyphs don't match (and we don't already have one, which i can manually check) +# Use the lists so we have a consistent ordering +csv_lines = [] +for jamo in jamo_groupings["initial"]: + cells_in_line = [] + for orientation in jamo_combinations[jamo]: + if orientation is None: + cells_in_line.append("N/A") + elif isinstance(orientation, list) and len(orientation) == 0: + cells_in_line.append("") + else: + alternative_entries = [] + for [context, alternative_glyph] in orientation["alternatives"].items(): + alternative_entries.append( + f"- {alternative_glyph} for {context.replace("", "")}" + ) + alternatives = "\n".join(alternative_entries) + if len(alternatives) > 0: + cells_in_line.append( + f"\"{orientation['defaultGlyph'].replace(",", " ")}\n{alternatives.replace(",", ";")}\"" + ) + else: + cells_in_line.append( + f"\"{orientation['defaultGlyph'].replace(",", " ")}\"" + ) + csv_lines.append(",".join(cells_in_line) + "\n") +for jamo in jamo_groupings["median"]: + cells_in_line = [] + for orientation in jamo_combinations[jamo]: + if orientation is None: + cells_in_line.append("N/A") + elif isinstance(orientation, list) and len(orientation) == 0: + cells_in_line.append("") + else: + alternative_entries = [] + for [context, alternative_glyph] in orientation["alternatives"].items(): + alternative_entries.append( + f"- {alternative_glyph} for {context.replace("", "")}" + ) + alternatives = "\n".join(alternative_entries) + if len(alternatives) > 0: + cells_in_line.append( + f"\"{orientation['defaultGlyph'].replace(",", " ")}\n{alternatives.replace(",", ";")}\"" + ) + else: + cells_in_line.append( + f"\"{orientation['defaultGlyph'].replace(",", " ")}\"" + ) + csv_lines.append(",".join(cells_in_line) + "\n") +for jamo in jamo_groupings["final"]: + cells_in_line = [] + for orientation in jamo_combinations[jamo]: + if orientation is None: + cells_in_line.append("N/A") + elif isinstance(orientation, list) and len(orientation) == 0: + cells_in_line.append("") + else: + alternative_entries = [] + for [context, alternative_glyph] in orientation["alternatives"].items(): + alternative_entries.append( + f"- {alternative_glyph} for {context.replace("", "")}" + ) + alternatives = "\n".join(alternative_entries) + if len(alternatives) > 0: + cells_in_line.append( + f"\"{orientation['defaultGlyph'].replace(",", " ")}\n{alternatives.replace(",", ";")}\"" + ) + else: + cells_in_line.append( + f"\"{orientation['defaultGlyph'].replace(",", " ")}\"" + ) + csv_lines.append(",".join(cells_in_line) + "\n") +# with open("./jamo-db.csv", mode="w", encoding="utf-8") as f: +# f.writelines(csv_lines) + +# game -> UTF-8 +# - convert glyphs into individual jamo (and sometimes ascii) (lookup table) +# - compose jamo into syllable blocks (python lib) +# UTF-8 -> game +# - decompose syllable blocks into jamo (python lib) +# - convert jamo into glyphs using our lookup DB \ No newline at end of file diff --git a/scripts/ci/lint-characters.py b/scripts/ci/lint-characters.py index 20a42379ce..4f76733e49 100644 --- a/scripts/ci/lint-characters.py +++ b/scripts/ci/lint-characters.py @@ -9,8 +9,6 @@ parser.add_argument("--fix", action="store_true") parser.set_defaults(fix=False) args = parser.parse_args() -# TODO - trim strings - # fmt: off JAK1_ALLOWED_CHARACTERS = [ "_", # NOTE - not an actual underscore, adds a long space! @@ -52,7 +50,6 @@ JAK1_AUTO_REPLACEMENTS = { "?": "?" } -# TODO - check for korean text JAK2_ALLOWED_CHARACTERS = [ "_", # NOTE - not an actual underscore, adds a long space! "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", @@ -115,57 +112,57 @@ JAK2_AUTO_REPLACEMENTS = { } # fmt: on -invalid_characters_found = False +return_error = False -# TODO - reduce duplication +def is_korean_syllable(char): + return '\uAC00' <= char <= '\uD7A3' +def is_char_allowed(game_name, char, allowed_characters): + if game_name == "jak1": + return char in allowed_characters + return char in allowed_characters or is_korean_syllable(char) -def jak1_is_allowed_code(pos, text): +def is_allowed_code(pos, text, allowed_codes): # Find any occurences of allowed codes in the string # if the position overlaps with these occurrences, it's allowed - for code in JAK1_ALLOWED_CODES: + for code in allowed_codes: for match in re.finditer(code, text): if pos >= match.start() and pos <= match.end(): return match.end() return -1 - -def jak1_char_allowed(char): - return char in JAK1_ALLOWED_CHARACTERS - - -def jak1_fix_character(char): +def fix_character(game_name, char, allowed_characters, auto_replacements): # First let's try upper-casing it, if that's allowed, let's use that instead upper_case = char.upper() - if jak1_char_allowed(upper_case): + if is_char_allowed(game_name, upper_case, allowed_characters): return upper_case - if char in JAK1_AUTO_REPLACEMENTS: - return JAK1_AUTO_REPLACEMENTS[char] + if char in auto_replacements: + return auto_replacements[char] return char -def jak1_replace_character(string, position, new_character): +def replace_character(string, position, new_character): string_list = list(string) string_list[position] = new_character new_string = "".join(string_list) return new_string -def lint_jak1_characters(text): +def lint_characters(game_name, text, allowed_characters, allowed_codes, auto_replacements): invalid_characters_found = False pos = 0 while pos < len(text): character = text[pos] - if not jak1_char_allowed(character): + if not is_char_allowed(game_name, character, allowed_characters): # Check to see if it's an allowed code - code_end_pos = jak1_is_allowed_code(pos, text) + code_end_pos = is_allowed_code(pos, text, allowed_codes) if code_end_pos == -1: # If we are fixing instances, attempt to do so char_fixed = False if args.fix: - new_char = jak1_fix_character(character) + new_char = fix_character(game_name, character, allowed_characters, auto_replacements) if new_char != character: - text = jak1_replace_character(text, pos, new_char) + text = replace_character(text, pos, new_char) char_fixed = True if not char_fixed: print( @@ -173,7 +170,7 @@ def lint_jak1_characters(text): character, text, text ) ) - # text = jak1_replace_character(text, pos, "?") + # text = replace_character(text, pos, "?") invalid_characters_found = True pos = pos + 1 else: @@ -183,175 +180,75 @@ def lint_jak1_characters(text): pos = pos + 1 return invalid_characters_found, text +def fix_games_translations(game_name, allowed_characters, allowed_codes, auto_replacements): + global return_error + print(f"Checking {game_name} translations") + # Iterate through the translations making sure there are no characters that are not allowed + text_files = glob.glob(f"./game/assets/{game_name}/text/*.json") -# Iterate through the translations making sure there are no characters that are not allowed -text_files = glob.glob("./game/assets/jak1/text/*.json") - -for text_file in text_files: - print("Checking {}".format(text_file)) - with open(text_file, encoding="utf-8") as f: - file_data = json.load(f) - for id, text in file_data.items(): - invalid_chars_exist, new_text = lint_jak1_characters(text) + for text_file in text_files: + print("Checking {}".format(text_file)) + with open(text_file, encoding="utf-8") as f: + file_data = json.load(f) + for id, text in file_data.items(): + invalid_chars_exist, new_text = lint_characters(game_name, text, allowed_characters, allowed_codes, auto_replacements) + if args.fix: + file_data[id] = new_text + if invalid_chars_exist: + return_error = True if args.fix: - file_data[id] = new_text - if invalid_chars_exist: - invalid_characters_found = True - if args.fix: - # save the modified file back out - with open(text_file, "w", encoding="utf-8") as f: - json.dump(file_data, f, indent=2, ensure_ascii=False) - f.write("\n") + # save the modified file back out + with open(text_file, "w", encoding="utf-8") as f: + json.dump(file_data, f, indent=2, ensure_ascii=False) + f.write("\n") -subtitle_files = glob.glob("./game/assets/jak1/subtitle/*lines*.json") + subtitle_files = glob.glob(f"./game/assets/{game_name}/subtitle/*lines*.json") -for subtitle_file in subtitle_files: - print("Checking {}...".format(subtitle_file)) - with open(subtitle_file, encoding="utf-8") as f: - file_data = json.load(f) - # Check Speakers - for id, text in file_data["speakers"].items(): - invalid_chars_exist, new_text = lint_jak1_characters(text) - if args.fix and new_text != text: - file_data["speakers"][id] = new_text - if invalid_chars_exist: - invalid_characters_found = True - # Check Lines - for id, lines in file_data["cutscenes"].items(): - for i, line in enumerate(lines): - invalid_chars_exist, new_text = lint_jak1_characters(line) - if args.fix and new_text != line: - lines[i] = new_text + for subtitle_file in subtitle_files: + print("Checking {}...".format(subtitle_file)) + with open(subtitle_file, encoding="utf-8") as f: + file_data = json.load(f) + # Check Speakers + for id, text in file_data["speakers"].items(): + invalid_chars_exist, new_text = lint_characters(game_name, text, allowed_characters, allowed_codes, auto_replacements) + if args.fix and new_text != text: + file_data["speakers"][id] = new_text if invalid_chars_exist: - invalid_characters_found = True - for id, lines in file_data["hints"].items(): - for i, line in enumerate(lines): - invalid_chars_exist, new_text = lint_jak1_characters(line) - if args.fix and new_text != line: - lines[i] = new_text - if invalid_chars_exist: - invalid_characters_found = True - if args.fix: - # save the modified file back out - with open(subtitle_file, "w", encoding="utf-8") as f: - json.dump(file_data, f, indent=2, ensure_ascii=False) - f.write("\n") - - -def jak2_is_allowed_code(pos, text): - # Find any occurences of allowed codes in the string - # if the position overlaps with these occurrences, it's allowed - for code in JAK2_ALLOWED_CODES: - for match in re.finditer(code, text): - if pos >= match.start() and pos <= match.end(): - return match.end() - return -1 - - -def jak2_char_allowed(char): - return char in JAK2_ALLOWED_CHARACTERS - - -def jak2_fix_character(char): - if char in JAK2_AUTO_REPLACEMENTS: - return JAK2_AUTO_REPLACEMENTS[char] - return char - - -def jak2_replace_character(string, position, new_character): - string_list = list(string) - string_list[position] = new_character - new_string = "".join(string_list) - return new_string - - -def lint_jak2_characters(text): - invalid_characters_found = False - pos = 0 - while pos < len(text): - character = text[pos] - if not jak2_char_allowed(character): - # Check to see if it's an allowed code - code_end_pos = jak2_is_allowed_code(pos, text) - if code_end_pos == -1: - # If we are fixing instances, attempt to do so - char_fixed = False - if args.fix: - new_char = jak2_fix_character(character) - if new_char != character: - text = jak2_replace_character(text, pos, new_char) - char_fixed = True - if not char_fixed: - print( - "Character '{}' not allowed - Found in {} in string {}".format( - character, text, text - ) - ) - # text = jak2_replace_character(text, pos, "?") - invalid_characters_found = True - pos = pos + 1 - else: - # advance to the end of the code and continue checking - pos = code_end_pos + return_error = True + # Check Lines + for id, lines in file_data["cutscenes"].items(): + for i, line in enumerate(lines): + invalid_chars_exist, new_text = lint_characters(game_name, line, allowed_characters, allowed_codes, auto_replacements) + if args.fix and new_text != line: + lines[i] = new_text + if invalid_chars_exist: + return_error = True + if game_name == "jak1": + for id, lines in file_data["hints"].items(): + for i, line in enumerate(lines): + invalid_chars_exist, new_text = lint_characters(game_name, line, allowed_characters, allowed_codes, auto_replacements) + if args.fix and new_text != line: + lines[i] = new_text + if invalid_chars_exist: + return_error = True else: - pos = pos + 1 - return invalid_characters_found, text - - -# Iterate through the translations making sure there are no characters that are not allowed -text_files = glob.glob("./game/assets/jak2/text/*.json") - -for text_file in text_files: - print("Checking {}".format(text_file)) - with open(text_file, encoding="utf-8") as f: - file_data = json.load(f) - for id, text in file_data.items(): - invalid_chars_exist, new_text = lint_jak2_characters(text) + for id, lines in file_data["other"].items(): + for i, line in enumerate(lines): + invalid_chars_exist, new_text = lint_characters(game_name, line, allowed_characters, allowed_codes, auto_replacements) + if args.fix and new_text != line: + lines[i] = new_text + if invalid_chars_exist: + return_error = True if args.fix: - file_data[id] = new_text - if invalid_chars_exist: - invalid_characters_found = True - if args.fix: - # save the modified file back out - with open(text_file, "w", encoding="utf-8") as f: - json.dump(file_data, f, indent=2, ensure_ascii=False) - f.write("\n") + # save the modified file back out + with open(subtitle_file, "w", encoding="utf-8") as f: + json.dump(file_data, f, indent=2, ensure_ascii=False) + f.write("\n") -subtitle_files = glob.glob("./game/assets/jak2/subtitle/*lines*.json") +fix_games_translations("jak1", JAK1_ALLOWED_CHARACTERS, JAK1_ALLOWED_CODES, JAK1_AUTO_REPLACEMENTS) +fix_games_translations("jak2", JAK2_ALLOWED_CHARACTERS, JAK2_ALLOWED_CODES, JAK2_AUTO_REPLACEMENTS) -for subtitle_file in subtitle_files: - print("Checking {}...".format(subtitle_file)) - with open(subtitle_file, encoding="utf-8") as f: - file_data = json.load(f) - # Check Speakers - for id, text in file_data["speakers"].items(): - invalid_chars_exist, new_text = lint_jak2_characters(text) - if args.fix and new_text != text: - file_data["speakers"][id] = new_text - if invalid_chars_exist: - invalid_characters_found = True - # Check Lines - for id, lines in file_data["cutscenes"].items(): - for i, line in enumerate(lines): - invalid_chars_exist, new_text = lint_jak2_characters(line) - if args.fix and new_text != line: - lines[i] = new_text - if invalid_chars_exist: - invalid_characters_found = True - for id, lines in file_data["other"].items(): - for i, line in enumerate(lines): - invalid_chars_exist, new_text = lint_jak2_characters(line) - if args.fix and new_text != line: - lines[i] = new_text - if invalid_chars_exist: - invalid_characters_found = True - if args.fix: - # save the modified file back out - with open(subtitle_file, "w", encoding="utf-8") as f: - json.dump(file_data, f, indent=2, ensure_ascii=False) - f.write("\n") - -if invalid_characters_found: +if return_error: print("Invalid characters were found, see above") exit(1) else: diff --git a/scripts/jamos.png b/scripts/jamos.png new file mode 100644 index 0000000000000000000000000000000000000000..5c0d1e122cc9151a11cd5db7ab8884226c829862 GIT binary patch literal 194192 zcmbTd1z1&4*Dkv02I)?bZlp`38;MPWbi zdp8S{vz-i!k%*Rn7EHn3$yqhX%U(Z7+rT!+)mFleMNSr1IzSRs;BN0@%@pA7=HV?F zAj9&vUP9l-11efPGCf7GF9?``Yl z4D)gJ^kBNJ)7r+<*GGnh1(Y-WvvMD2hySYG!~37z2Lr)>Tf#5MC&2%okK5V)yD2bV zFSox9v9sm3ce8i5_wexs&kO#y=j{WW{}0vQmi&+EVNRYtp59KLuz!E$zcuOK#sA|) zFx>z9R|2eI|GS5^wEo{8cX$79-SGBN@&g0+&q?@iZTi;-ybS_j_WXMG-k!c*w)RSX zU^wpn9l6_alvH!KcC^>D_i*%al3@|LFCg&$C^B-kyDbs@&w|^!+P3GnguGQ0sqv?!QV+{-gBY&HP)e;OXY+ zr4JT^y$s7gKKJk0ko;SwQBhtY zzJF8$rcM&P>+BGyXzc@@5)u#+;S~VoLI#3jk^;h#0%E)Z_a*;1GJl^2E6C2;$NK;4 z`P+5CByDFa>ErCa|zHUA&vM$!{ zp5D^@w=2iZ`Jb=wEiFk^XKx=*ufYHKp1%E)|Ngzd3y_KFuUSc2 z+uqKx3=7Q5)6Un{-tO-Rf|mcI)Z5d+$KTq^UfvN{lnjf!gM%}$hCn9W+oi%J#3aNg z3cSXDtI*%c9#r>#9!LKF?90E}Ce8mpTK|u(|A!L+@BQO9;GBS$Cp%UpZ9h z>fMumL*t+vpc!Cu&sMyHbMY

%_jnK3RP}j*z{dg4vAp+AWueI%-0KsB%kVwaf3{ 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 literal 0 HcmV?d00001